自動化運維Ansible之playbook劇本的使用
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劇本的使用