handlers和notify結合使用觸發條件
·Handlers(觸發器)
是task列表,這些task與前述的task並沒有本質上的不同,用於當關注的資源發生變化時,才會采取一定的操作。
·Notify(通知)
此action可用於在每個play的最后被觸發,這樣可以避免多次有改變發生時每次都執行指定的操作,僅在所有的變化發生完成最后一次性地執行指定操作。在notify中列出的操作稱為handler,也即notify中調用handler中定義的操作。
·以http服務為例
--- - hosts: websrvs remote_ user: root tasks : - name: install httpd package yum: name=httpd - name: copy conf file copy: src=files/httpd. conf de st=/etc/httpd/conf/ backup=yes notify:
- restart service#起到通知作用 - name: start service service: name=httpd state=started enab led=yes handlers:#這個是觸發器 - name: restart service service: name=httpd state=restarted
·playbook中的tags使用(創建標簽)
--- - hosts: websrvs remote_ user: root tasks : - name: install httpd package yum: name=httpd - name: copy conf file copy: src=files/httpd. conf de st=/etc/httpd/conf/ backup=yes notify: - restart service#起到通知作用 tags: inshttpd#創建便簽,可以通過名字調用上面的內容 - name: start service service: name=httpd state=started enab led=yes handlers:#這個是觸發器 - name: restart service service: name=httpd state=restarted
···可以通過調用標簽單獨執行角色里面的內容···
ansible-playbook -t inshttpd httpd.yml#-t是指定要執行的標簽,多個標簽用逗號隔開,多個標簽可以定義一樣的名字
playbook中的變量
變量名:僅能由字母、數字和下划線組成,且只能以字母開頭
變量來源:
1.ansible setup facts 遠程主機的所有變量都可以直接調用
2.在/etc/ansible/hosts中定義
普通變量:主機組中的主機單獨定義,優先級高於公共變量
公共組變量:針對主機組中所有主機定義統一變量
[webserver] 192.168.157.1 192.168.157.2 hosts1=25#普通變量
[webserver:vars]#定義組變量
nodname=www
dom=magendu.com
3.通過命令行執行指定變量,優先級最高
---
- hosts: websrvs
remote_ user: root
tasks :
- name: install httpd package yum: name={{變量}}
- name: start service service: name={{變量}} state=started enabled=yes
ansible-playbook -e '變量=httpd' http.yml#多個變量執行時,用空格隔開
4.在playbook中定義
vars:
- var1:value1
- var2:value2
--- - hosts: websrvs remote_ user: root vars: - pkname1: httpd - pkname1: vsftp tasks : - name: install httpd package yum: name={{pkname1}} - name: start service service: name={{pkname2}} state=started enabled=yes
5.在role中定義
6.可以在一個文件中定義許多變量
vim vasr.yml
var1: httpd
var2: vsftp
在使用的時候需要指定
--- - hosts: 10.6.12.56 remote_user: root vars_files: - vars.yml tasks: - name:install package yum: name={{ var1 }}
模板templates
·文本文件,嵌套由有腳本(使用模板編程語言編寫)
·jinja2語言,使用字面量,有下面形式
字符串:使用單引號或雙引號
數字:整數,浮點數
列表:[item1,item2,。。。]
元組:(item1,item2,。。。)
字典:{item1,item2,。。。}
布爾型:true/false
·算數運算:+,-,*,/,//,%,**
·比較操作:==,!=,>,>=,<,<=
·邏輯運算:and,or,not
·流表達式:For If When
·在選取文件當模板的時候需要改名,一般以j2當文件后綴,並將文件放在templates文件目錄下
以管理nginx為例
--- - hosts: 10.6.12.53 renout_user: root tasks: - name: install package yum: name=nginx - name: copy template templates: src=nginx.conf.j2 dest=/etc/nginx/nginx.conf - name: start service service: name=nignx start=stared enabled=yse
when
條件測試:如果需要根據變量,facts或此前任務的執行結果來作為某task執行與否的前提時要用到條件測試,通過when語句實現,在task中使用,jinja2的語法式。
·when語句
·在task后添加wen子句即可使用條件測試;when語句支持jinja2表達式語法
--- - hosts: 10.6.12.53 renout_user: root tasks: - name: install package yum: name=nginx - name: copy template templates: src=nginx.conf.j2 dest=/etc/nginx/nginx.conf when: ansible_distribution_major_version=="7"#當符合這個條件就執行上面 - name: start service service: name=nignx start=stared enabled=yse