1. 程式人生 > >自動化運維Ansible之playbook劇本的使用

自動化運維Ansible之playbook劇本的使用

就是 version 就會 方法 shel remote httpd服務 template manual

YAML簡介

YAML是一種表達資料序列的格式,由於參考了其他多種語言,所以具有很高的可讀性。其特性如下:

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

1.YAML中兩種常用的數據類型,分別是list和directory

  • list
    -teacher
    -student

    2.列表的所有元素均使用“-”開頭

  • directory

3.字典通過key和value進行標識如:

name:zhangsan
job:teacher
age:25

playbook介紹

playbook是由一個或者多個play組成的列表,主要功能是將task定義好的角色並為一組進行統一管理,也就是通過task調用Ansible的模塊將多個paly組織在一個playbook中。playbook本身由以下各部分組成:

  • Tasks:任務,即調用模塊完成的某操作
  • Varibles:變量
  • Templates:模版
  • Handlers:處理器,當某條件,滿足時,觸發的操作
  • Roles:角色

1.下面是一個playbook的簡單示例:

- hosts: webserver              #定義的主機組,即應用的主機
  vars:                        #定義變量
    http_port: 80
    max_clients: 200
  user: root
  tasks:                               #執行的任務
  - name: ensure apache is at the latest version
    yum: pkg=httpd state=latest
  - name: write the apache config file
    template: src=/srv/httpd.j2 dest=/etc/httpd.conf
    notify:
    - restart apache
  - name: ensure apache is running
    service: name=httpd state=started
  handlers:                       #處理器
    - name: restart apache
      service: name=httpd state=restarted

Hosts和Users介紹

playbook的設計目的就是為了讓某個或者某些主機以某個身份去執行相應的任務。其中用於指定要執行任務的主機hosts定義,可以是一個主機也可以是由冒號分隔的額多個主機組;用於指定被管理主機上執行任務的用戶用remote_user來定義,例如:

- hosts: webserver
  remote_user: root

1.remote_user也可以定義指定用戶通過sudo的方法在被管理主機上運行指令,甚至可以在使用become指定sudo切換的用戶。

- hosts: webserver
  remote_user: root
  tasks:
  - name: ping test
    ping:
    become: yes
    become_user: zhangsan 

[root@rabbitmq01 ~]# ansible-playbook a.yml 

PLAY [webserver] *********************************************************************************

TASK [Gathering Facts] ***************************************************************************
ok: [192.168.58.132]

TASK [ping test] *********************************************************************************
 [WARNING]: Module remote_tmp /home/zhangsan/.ansible/tmp did not exist and was created with a
mode of 0700, this may cause issues when running as another user. To avoid this, create the
remote_tmp dir with the correct permissions manually

ok: [192.168.58.132]

PLAY RECAP ***************************************************************************************
192.168.58.132             : ok=2    changed=0    unreachable=0    failed=0   

tasks列表和action

1.Play的主體部分是task列表,task列表中的各任務按次序逐個在hosts中指定的主機上執行,即在所有主機上完成第一個任務後再開始第二個任務。
在運行playbook時(從上到下執行),如果一個host執行task失敗,整個tasks都會回滾,請修正playbook 中的錯誤,然後重新執行即可。
Task的目的是使用指定的參數執行模塊,而在模塊參數中可以使用變量.

2.每一個task必須有一個名稱name,這樣在運行playbook時,從其輸出的任務執行信息中可以很好的辨別出是屬於哪一個task的。如果沒有定義name,‘action’的值將會用作輸出信息中標記特定的task。

3.定義一個task,常見的格式:”module: options” 例如:yum: name=httpd

tasks:
- name: make sure appache is running
  service: name=httpd state=started

4.ansible的自帶模塊中,command模塊和shell模塊無需使用key=value格式

tasks:
-name: disable selinux
command: /sbin/setenforce 0

handlers介紹

Handlers用於當關註的資源發生變化時所采取的操作。在notify中列出的操作便稱為handler,也就是在notify中需要調用handler中定義的操作。而notify這個動作在每個play的最後被觸發,僅在所有的變化發生完成後一次性執行指定的操作。handler也是task列表的格式:

notify:
 - restart httpd  #一旦執行這裏就會觸發name為restart httpd的handler
handlers:
 - name: restart httpd
   service: name=httpd state=restarted

Templates介紹

Jinja是基於Python的模板引擎。Template類是Jinja的另一個重要組件,可以看作一個編譯過的模板文件,用於產生目標文本,傳遞Python的變量給模板去替換模板中的標記。這裏就先演示一個示例,通過ansible在兩臺被管理主機上安裝httpd服務,並且修改httpd.conf文件後,重啟。前面的安裝已經介紹過,這裏我直接說明下實驗環境即可:

角色 主機名 IP地址 組名
控制主機 node1 192.168.58.146
被管理主機 node2 192.168.58.148 webserver
被管理主機 node3 192.168.58.149 sqlserver
- hosts: webserver
  remote_user: root
  vars:   #定義幾個變量
   - httpdport: 192.168.58.148:80
   - servername: www.yun.com:80
   - service: httpd
  tasks:
   - name: install httpd service
     yum: name={{service}} state=latest
   - name: install configuration file for httpd
     template: src=/root/httpd.conf.j2 dest=/etc/httpd/conf/httpd.conf
     # 首先在本地生成一份template文件
     notify:
      - restart httpd
  handlers:
    - name: restart httpd
      service: name={{service}} state=restarted

1.這個是yml文件內容,下面時模板文件中需要修改的內容

[root@node1 ~]# cat httpd.conf.j2 | grep ‘^Listen‘
Listen {{httpdport}}

[root@node1 ~]# cat httpd.conf.j2 | grep ‘^ServerName‘
ServerName {{servername}}
[root@node1 ~]# ansible-playbook abc.yml 

PLAY [webserver] **********************************************************************************

TASK [Gathering Facts] ****************************************************************************
ok: [192.168.58.148]

TASK [install httpd service] **********************************************************************
changed: [192.168.58.148]

TASK [install configuration file for httpd] *******************************************************
changed: [192.168.58.148]

RUNNING HANDLER [restart httpd] *******************************************************************
changed: [192.168.58.148]

PLAY RECAP ****************************************************************************************
192.168.58.148             : ok=4    changed=3    unreachable=0    failed=0   

2.可以看到node2上服務已經開啟,監聽端口也已經修改過來了

[root@node2 .ssh]# rpm -q httpd
httpd-2.4.6-80.el7.centos.1.x86_64
[root@node2 .ssh]# netstat -ntap | grep 80
tcp        0      0 192.168.58.148:80       0.0.0.0:*               LISTEN      3540/httpd
[root@node2 .ssh]# cat /etc/httpd/conf/httpd.conf | grep ‘^Listen‘
Listen 192.168.58.148:80
[root@node2 .ssh]# cat /etc/httpd/conf/httpd.conf | grep ‘^ServerName‘
ServerName www.yun.com:80

Tags介紹

如果多次執行修改playbook會涉及到一些沒有變化的代碼,可以使用tags讓用戶選擇跳過沒有變化的代碼,只運行olaybook中發生變化的部分代碼,可以在playbook中為某個或者某些任務定義“標簽”,在執行此playbook時通過ansible-playbook命令使用--tags選項能實現僅運行指定的tasks。

- hosts: sqlserver
  remote_user: root
  tasks:
   - name: build a new file
     copy: content="this is a test" dest=/root/test1.txt
     tags:
      - only
   - name: bulid another file
     copy: content="this is another test" dest=/root/test2.txt
[root@node1 ~]# ansible-playbook a.yml --tags="only"

PLAY [sqlserver] *********************************************************************************

TASK [Gathering Facts] ***************************************************************************
ok: [192.168.58.149]

TASK [build a new file] **************************************************************************
changed: [192.168.58.149]

PLAY RECAP ***************************************************************************************
192.168.58.149             : ok=2    changed=1    unreachable=0    failed=0  

我們去node3中查看到底生成了幾個文件

[root@node3 ~]# ls
anaconda-ks.cfg       mfs-1.6.27-5.tar.gz  公共  視頻  文檔  音樂
initial-setup-ks.cfg  test1.txt            模板  圖片  下載  桌面

可以看到只生成了test1.txt

自動化運維Ansible之playbook劇本的使用