自動化運維工具Ansible架構部署應用及playbooks簡單應用

  在日常服務器運維中,我們經常要配置相同的服務器配置,前期我們都是一臺一臺的去配置,這種方法操作主要應對於服務器數量不多且配置簡單的情況還可以繼續這樣操作,如果我們後期維護幾百服務器或者幾萬服務器呢? 我應該怎樣去快速配置服務器呢?如果需要手動的每臺服務器進行安裝配置將會給運維人員帶來許多繁瑣而又重複的工作同時也增加服務器配置的異常,至此自動化運維工具解決我們的瓶頸---Ansible工具。


Ansible是新出現的自動化運維工具,基於Python開發,集合了衆多運維工具(puppet、cfengine、chef、func、fabric)的優點,實現了批量系統配置、批量程序部署、批量運行命令等功能。ansible是基於模塊工作的,本身沒有批量部署的能力。真正具有批量部署的是ansible所運行的模塊,ansible只是提供一種框架。主要包括:
(1).連接插件connection plugins:負責和被監控端實現通信;
(2).host inventory:指定操作的主機,是一個配置文件裏面定義監控的主機;
(3).各種模塊核心模塊、command模塊、自定義模塊;
(4).藉助於插件完成記錄日誌郵件等功能;
(5).playbook:劇本執行多個任務時,非必需可以讓節點一次性運行多個任務。


Ansible工作架構如下:

wKiom1eZa0DBCj29AAMjeB0YHqQ962.jpg

ansible特性
(1).no agents:不需要在被管控主機上安裝任何客戶端;
(2).no server:無服務器端,使用時直接運行命令即可;
(3).modules in any languages:基於模塊工作,可使用任意語言開發模塊;
(4).yaml,not code:使用yaml語言定製劇本playbook;
(5).ssh by default:基於SSH工作;
(6).strong multi-tier solution:可實現多級指揮。


ansible優點
(1).輕量級,無需在客戶端安裝agent,更新時,只需在操作機上進行一次更新即可;
(2).批量任務執行可以寫成腳本,而且不用分發到遠程就可以執行;
(3).使用python編寫,維護更簡單,ruby語法過於複雜;
(4).支持sudo。


1.Ansible環境安裝(二進制rpm安裝)

# yum -y install python-2.6.6-64.el6.x86_64.rpm
# yum -y install python-crypto2.6-2.6.1-2.el6.x86_64.rpm
# yum -y install python-httplib2-0.7.7-1.el6.noarch.rpm
# yum -y install python-jinja2-26-2.6-3.el6.noarch.rpm
# yum -y install python-keyczar-0.71c-1.el6.noarch.rpm
# yum -y install python-paramiko-1.7.5-2.1.el6.noarch.rpm
# yum -y install python-setuptools-0.6.10-3.el6.noarch.rpm
# yum -y install python-simplejson-2.0.9-3.1.el6.x86_64.rpm
# yum -y install python-six-1.9.0-2.el6.noarch.rpm
# yum -y install sshpass-1.05-1.el6.x86_64.rpm
# yum -y install ansible1.9-1.9.6-2.el6.1.noarch.rpm

2.Ansible配置應用

(1)服務部署架構如下:

node1.samlee.com 172.16.100.6 爲:dbservers組
node2.samlee.com 172.16.100.7 爲:dbservers組
nfs.samlee.com 172.16.100.9 爲:public組
time1.samlee.com 172.16.100.12 爲:public組
node3.samlee.com 172.16.100.11 爲:webservers組
node4.samlee.com 172.16.100.12 爲:webservers組
director.samlee.com 172.16.100.3 爲ansible配置主機

(2)配置ansible端能基於密鑰認證的方式聯繫各被管理的節點

--生成公鑰/私鑰
# ssh-keygen -t rsa -P ''
--拷貝密鑰文件至各管理節點
# ssh-copy-id -i .ssh/id_rsa.pub [email protected]
# ssh-copy-id -i .ssh/id_rsa.pub [email protected]
# ssh-copy-id -i .ssh/id_rsa.pub [email protected]
# ssh-copy-id -i .ssh/id_rsa.pub [email protected]
# ssh-copy-id -i .ssh/id_rsa.pub [email protected]
# ssh-copy-id -i .ssh/id_rsa.pub [email protected]

(3)定義主機組

# vim /etc/ansible/hosts
[dbservers]
node1.samlee.com
node2.samlee.com
[webservers]
node3.samlee.com
node4.samlee.com
[public]
time1.samlee.com
nfs.samlee.com

(4)簡單應用測試--測試遠程主機運行狀態及遠程主機時間狀態信息

--測試遠程主機運行狀態
# ansible all -m ping
--測試如下圖所示:

wKiom1ea6xDCLDeRAAJLUnMIZa4952.jpg

--測試遠程主機時間狀態信息
# ansible all -a 'date'
或
# ansible all -m command -a 'date'
--測試如下圖所示:

wKioL1ea7UWT6HTcAAJSi--sB2s872.jpg


3.Ansible常用模塊應用實例:

(1)copy:複製文件至遠程主機

--查詢模塊使用選項
# ansible-doc -s copy
--copy模塊相關選項如下:
backup:在覆蓋之前,將源文件備份,備份文件包含時間信息。有兩個選項:yes|no

content:用於替代“src”,可以直接設定指定文件的值

dest:必選項。要將源文件複製到的遠程主機的絕對路徑,如果源文件是一個目錄,
那麼該路徑也必須是個目錄

directory_mode:遞歸設定目錄的權限,默認爲系統默認權限

force:如果目標主機包含該文件,但內容不同,如果設置爲yes,則強制覆蓋,如果爲no,則只有當目標
主機的目標位置不存在該文件時,才複製。默認爲yes

others:所有的file模塊裏的選項都可以在這裏使用

src:被複制到遠程主機的本地文件,可以是絕對路徑,也可以是相對路徑。如果路徑是一個目錄,
它將遞歸複製。在這種情況下,如果路徑使用“/”來結尾,則只複製目錄裏的內容,
如果沒有使用“/”來結尾,則包含目錄在內的整個內容全部複製,類似於rsync。

示例:

--將本地目錄"/root/ansible" 複製至dbservers組遠程服務器

# ansible dbservers -m copy -a "src=/root/ansible dest=/tmp"

wKioL1ea9q2BfR-5AAKRQEOTcGc868.jpg

--將本地文件"/etc/ansible/ansible.cfg" 複製至webservers組遠程服務器並授予指定文件權限

# ansible webservers -m copy -a "src=/etc/ansible/ansible.cfg dest=/tmp/ansible.cfg owner=root group=roor=root group=root mode=0644"

wKioL1ea-A3A-pwLAAXK2kfxhNM994.jpg


--遠程信息查看/tmp/ansible目錄

# ansible dbservers -m command -a "ls -l /tmp/ansible"

wKiom1ea-Z2TAMzCAAmJy1O3wjk718.jpg


--遠程信息查看/tmp/ansible.cfg信息

# ansible webservers -m command -a "ls -al /tmp/ansible.cfg"

wKiom1ea-n_inMwSAAKqbHZ8q4s173.jpg


(2)cron:計劃任務管理

示例:

--定義配置所有主機節點每3分鐘更新系統時間

# ansible all -m cron -a 'name="custom job" minute=*/3 hour=* day=* month=* weekday=* job="/usr/sbin/ntpdate 172.16.100.10"'

wKioL1ebEJvQbKF3AAI0AKRMUkc859.jpg


--查詢所有主機定義crontab的計劃任務信息

# ansible all -a 'crontab -l'

wKioL1ebEVuTu-qBAAF_1VOtPgY226.jpg


(3)group:系統用戶組管理

示例:

--在所有被管理節點主機創建用戶組爲mysql GID=306 爲系統組

# ansible all -m group -a "gid=306 system=yes name=mysql"

wKioL1ebHBjRBSZPAAHVi_Ejr94280.jpg


--查詢所有主機的用戶組信息

wKioL1ebHJWQTMzPAAD_O6GX9Xo468.jpg



(4)user:系統用戶管理

示例:

--給所有主機添加用戶,指定用戶名爲:samlee,指定用戶主組mysql,設定用戶uid爲520 ,設定備註信息爲:samlee。

# ansible all -m user -a "name=samlee group=mysql uid=520 comment='samlee' state=present"

wKiom1ebIUuic2g0AANV1GunNnE456.jpg


--查詢所有主機的用戶信息

# ansible all -a "tail -1 /etc/passwd"

wKiom1ebIczibGHiAAFd10CypOU624.jpg


(5)yum:yum軟件包安裝管理

示例:

--使用yum方式給所有主機安裝corosync工具

# ansible all -m yum -a "state=present name=corosync"

wKiom1ebJHPQf6MmAAF_DdmAywo132.jpg

--查詢所有主機節點安裝的corosync

# ansible all -a "rpm -q corosync"

wKiom1ebJYyBx3H0AAElUOVgsgg930.jpg


(6)service:系統服務管理

示例:

--使用service方式控制所有所有主機httpd服務開機自啓動

# ansible all -m service -a "state=started name=httpd enabled=yes"

wKiom1ebKA_wPRfGAAHkIUX0cl8624.jpg

--查詢所有主機節點httpd服務啓動狀態及級別

# ansible all -a "chkconfig --list httpd"
# ansible all -a "service httpd status"

wKiom1ebKSjgn-lOAAFlwh0y2KM147.jpg

wKiom1ebKZCgOQBVAAEt7dM3wBI560.jpg


4.YAML
4.1 YAML介紹
YAML是一個可讀性高的用來表達資料序列的格式。YAML參考了其他多種語言,包括:XML、C語言、Python、Perl以及電子郵件格式RFC2822等。Clark Evans在2001年在首次發表了這種語言,另外Ingy dt Net與Oren Ben-Kiki也是這語言的共同設計者。

YAML Ain't Markup Language,即YAML不是XML。不過,在開發的這種語言時,YAML的意思其實是:"Yet Another Markup Language"(仍是一種標記語言)。其特性:

    YAML的可讀性好
    YAML和腳本語言的交互性好
    YAML使用實現語言的數據類型
    YAML有一個一致的信息模型
    YAML易於實現
    YAML可以基於流來處理
    YAML表達能力強,擴展性好

更多的內容及規範參見http://www.yaml.org。


4.2 YAML語法
YAML的語法和其他高階語言類似,並且可以簡單表達清單、散列表、標量等數據結構。其結構(Structure)通過空格來展示,序列(Sequence)裏的項用"-"來代表,Map裏的鍵值對用":"分隔。下面是一個示例。

name: John Smith
age: 41
gender: Male
spouse:
    name: Jane Smith
    age: 37
    gender: Female
children:
    -   name: Jimmy Smith
        age: 17
        gender: Male
    -   name: Jenny Smith
        age 13
        gender: Female

YAML文件擴展名通常爲.yaml,如example.yaml。


5.Ansible playbooks
playbook是由一個或多個“play”組成的列表。play的主要功能在於將事先歸併爲一組的主機裝扮成事先通過ansible中的task定義好的角色。從根本上來講,所謂task無非是調用ansible的一個module。將多個play組織在一個playbook中,即可以讓它們聯同起來按事先編排的機制同唱一臺大戲。

簡單案例應用測試: 定義playbook文件實現--1.添加用戶組:samgroup不爲系統組 組ID爲:666 --2.添加用戶samuser爲普通用戶 組GID爲:666 用戶UID爲:666 --3.同時檢測被管理節點系統時間

(1)創建demo.yaml文件如下:

# vim /root/demo.yaml
- hosts: all
  remote_user: root
  tasks:
    - name: add a group
      group: gid=666 name=samgroup system=no
    - name: add a user
      user: name=samuser group=samgroup uid=666 comment='samuser' state=present
    - name: excute a command
      command: /bin/date

(2)分發執行至各被管理節點

# ansible-playbook /root/demo.yaml

(3)驗證各管理節點

# ansible all -a "tail -1 /etc/passwd"

驗證如下圖所示:

wKioL1em4ySypP96AADZI6n2Nl0369.png

通過以上案例的應用我們清楚知道在後期運維工作可以通過定義YAML劇本文件方式自動化執行任務,下面我們對YAML相關選項進行應用解析:

簡單案例應用測試: 定義playbook文件實現--1.批量安裝httpd服務至各管理節點 --2.統一部署各管理節點httpd.conf配置文件修改web端口爲8080同時實現配置文件變動後重啓httpd服務。

(1)準備模板配置httpd.conf並修改監聽端口爲:8080

# cp -p /etc/httpd/conf/httpd.conf /root/
# vim /root/httpd.conf 
Listen 8080

(2)創建webset.yaml文件如下:

# vim /root/webdemo.yaml 
- hosts: all
  remote_user: root
  tasks:
    - name: ensure apache latest version
      yum: state=latest name=httpd
    - name: apache configure file
      copy: src=/root/httpd.conf dest=/etc/httpd/conf/httpd.conf force=yes
      notify:
        - restart httpd
  handlers:
    - name: restart httpd
      service: name=httpd state=restarted

(3)分發執行至各被管理節點

# ansible-playbook /root/webdemo.yaml

(4)驗證各管理節點

# ansible all -a "ss -tnl"

驗證如下圖所示:

wKiom1em63axwk6VAADPLgf5lOU248.png


5.1 playbook基礎組件
5.1.1 Hosts和Users   
    playbook中的每一個play的目的都是爲了讓某個或某些主機以某個指定的用戶身份執行任務。hosts用於指定要執行指定任務的主機,其可以是一個或多個由冒號分隔主機組;remote_user則用於指定遠程主機上的執行任務的用戶。如上面示例中的
        -hosts: webnodes
         remote_user: root

    不過,remote_user也可用於各task中。也可以通過指定其通過sudo的方式在遠程主機上執行任務,其可用於play全局或某任務;此外,甚至可以在sudo時使用sudo_user指定sudo時切換的用戶。

        - hosts: webnodes
          remote_user: samlee
          tasks:
            - name: test connection
              ping:
              remote_user: samlee
              sudo: yes

5.1.2 任務列表和action
    play的主體部分是task list。task list中的各任務按次序逐個在hosts中指定的所有主機上執行,即在所有主機上完成第一個任務後再開始第二個。在運行自下而下某playbook時,如果中途發生錯誤,所有已執行任務都將回滾,因此,在更正playbook後重新執行一次即可。

    task的目的是使用指定的參數執行模塊,而在模塊參數中可以使用變量。模塊執行是冪等的,這意味着多次執行是安全的,因爲其結果均一致。

    每個task都應該有其name,用於playbook的執行結果輸出,建議其內容儘可能清晰地描述任務執行步驟。如果未提供name,則action的結果將用於輸出。

    定義task的可以使用“action: module options”或“module: options”的格式,推薦使用後者以實現向後兼容。如果action一行的內容過多,也中使用在行首使用幾個空白字符進行換行。
        tasks:
          - name: make sure apache is running
            service: name=httpd state=running

        在衆多模塊中,只有command和shell模塊僅需要給定一個列表而無需使用“key=value”格式,例如:
            tasks:
              - name: disable selinux
                command: /sbin/setenforce 0

        如果命令或腳本的退出碼不爲零,可以使用如下方式替代:
            tasks:
              - name: run this command and ignore the result
                shell: /usr/bin/somecommand || /bin/true        

        或者使用ignore_errors來忽略錯誤信息:
            tasks:
              - name: run this command and ignore the result
                shell: /usr/bin/somecommand
                ignore_errors: True        

5.1.3 handlers
    
用於當關注的資源發生變化時採取一定的操作。

    “notify”這個action可用於在每個play的最後被觸發,這樣可以避免多次有改變發生時每次都執行指定的操作,取而代之,僅在所有的變化發生完成後一次性地執行指定操作。在notify中列出的操作稱爲handler,也即notify中調用handler中定義的操作。
        - name: template configuration file
          template: src=template.j2 dest=/etc/foo.conf
          notify:
             - restart memcached
             - restart apache    

handler是task列表,這些task與前述的task並沒有本質上的不同。
        handlers:
            - name: restart memcached
              service:  name=memcached state=restarted
            - name: restart apache
              service: name=apache state=restarted


案例應用配置heartbeat集羣:

# vim /root/heartbeat.yaml
- hosts: hbhosts
  remote_user: root
  tasks:
    - name: ensure heartbeat latest version
      yum: name=heartbeat state=present
    - name: authkeys configure file
      copy: src=/root/hb_conf/authkeys dest=/etc/ha.d/authkeys
    - name: authkeys mode 600
      file: path=/etc/ha.d/authkeys mode=600
      notify:
        - restart heartbeat
    - name: ha.cf configure file
      copy: src=/root/hb_conf/ha.cf dest=/etc/ha.d/ha.cf
      notify: 
           - restart heartbeat
  handlers:
      - name: restart heartbeat
        service: name=heartbeat state=restarted


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章