文章目錄
- 1. handlers與notify
- 2. tags組件
- 3. playbook中使用變量
- 3.1使用 setup 模塊中變量
- 3.2在playbook 命令行中定義變量
- 3.3在playbook文件中定義變量
- 3.4使用變量文件
- 3.5主機清單文件中定義變量
- 主機變量
- 組(公共)變量
1. handlers與notify
- Handlers:是task列表,用于當關注的資源發生變化時,采取一定的操作。
- Notify:被觸發的操作,僅在所有的變化發生完成后一次性地執行指定操作。在notify中列出的操作成為handler,也即notify中調用handler中定義的操作。
- 例如:更新配置文件,重新啟動playbook,系統不會重啟服務,這時可以通過定義一個notify去重啟服務,handlers負責執行重啟。
- 寫一個playbook文件安裝httpd
vim httpd.yml
---
- hosts: webserversremote_user: roottasks:- name: install httpd packageyum: name=httpd- name: copy conf filecopy: src=files/httpd.conf dest=/etc/httpd/conf/ backup=yes- name: start serviceservice: name=httpd state=started enabled=yes
ansible-playbook httpd.yml
2. 查看當前的端口狀態
ansible webservers -a 'ss -ntl'
- 修改httpd的端口,從8080修改為81
vim ./files/httpd.conf
- 現在配置文件修改過了,我們在yaml文件中增加handlers與notify觸發機制
vim httpd.yml
---
- hosts: webserversremote_user: roottasks:- name: install httpd packageyum: name=httpd- name: copy conf filecopy: src=files/httpd.conf dest=/etc/httpd/conf/ backup=yesnotify: restart service # 當配置文件改變時,調用handlers里面的restart service- name: start serviceservice: name=httpd state=started enabled=yeshandlers: # 當上面的某個或某些任務改變時,執行下面的任務- name: restart serviceservice: name=httpd state=restarted
- 重新執行playbook,就可以檢測到文件的修改,觸發notify和handlers操作。
ansible-playbook httpd.yml
6. 最后查看端口狀態,發現8080端口已經換成了81:
ansible webservers -a 'ss -ntl'
如果報錯,說明端口號沒有權限,換一個端口號。
systemctl status httpd.service
notify和handlers操作可以同時定義多個,相當于多個函數其實可以同時調用。
2. tags組件
在大型項目當中,通常一個playbook會有非常多的task。而我們每次執行這個playbook時,都會將所有task運行一遍。
而事實上,在實際使用過程中,我們可能只是想要執行其中的一部分任務而已,并不想把整個playbook完整跑一遍。這個時候就需要用到tags。
通過tags,我們可以給playbook中的某一些任務打上“標簽”,而在執行playbook的時候,我們可以通過選定標簽的方式指定只執行哪一些任務或者不執行哪一些任務。
- 創建一個playbook文件
vim httpd_tag.yml
#install httpd
- hosts: webserversremote_user: rootgather_facts: notasks:- name: Install httpdyum: name=httpd state=present- name: Install configure filecopy: src=files/httpd.conf dest=/etc/httpd/conf/#定義tagstags: config- name: web htmlcopy: src=files/index.html dest=/var/www/html/- name: start serviceservice: name=httpd state=started enabled=yes#定義tagstags: service
- 查看當前tags列表(不知道命令就用–help查看)
ansible-playbook --list-tags httpd_tag.yml
3. 再次修改httpd的端口號
vim files/httpd.conf
4. 針對linux101這一臺主機運行config 這個tag代碼段。
ansible-playbook -t config httpd_tag.yml --limit linux101ansible linux101 -a 'ss -ntl'
- 最后給它卸掉(PS:因為我的電腦…)
ansible-playbook remove_httpd.yml
3. playbook中使用變量
- 變量名:僅能由字母、數字和下劃線組成,且只能以字母開頭。
- 變量定義:
variable=value
范例:http_port=80
- 變量調用方式:通過
{{ variable_name }}
調用變量,且變量名前后建議加空格,有時用“{{ variable_name }}”
才生效 - 變量來源:
- ansible 的 setup facts 遠程主機的所有變量都可直接調用
- 通過命令行指定變量,優先級最高
ansible-playbook -e varname=value
- 在playbook文件中定義
vars:- var1: value1- var2: value2
- 在獨立的變量YAML文件中定義
- hosts: allvars_files:- vars.yml
- 在
/etc/ansible/hosts
中定義
- 主機(普通)變量:主機組中主機單獨定義,優先級高于公共變量
- 組(公共)變量:針對主機組中所有主機定義統一變量
6.在role中定義
3.1使用 setup 模塊中變量
本模塊自動在playbook調用,不要用ansible命令調用
- 案例:使用setup變量
---
#var.yml
- hosts: allremote_user: root#調用系統變量必須要收集,gather_facts: yes或者不寫gather_facts: yestasks:- name: create log filefile: name=/data/{{ ansible_nodename }}.log state=touch owner=yu mode=600
ansible-playbook var.yml
ansible all -a 'ls /data'
3.2在playbook 命令行中定義變量
在playbook中寫變量,在命令行賦值調用
范例:
vim val_install.yml
---
- hosts: webserversremote_user: roottasks:- name: install packageyum: name={{ pkname }} state=present
ansible-playbook –e pkname=httpd val_install.yml
3.3在playbook文件中定義變量
范例:
vim var_uninstall.yml
---
- hosts: webserversremote_user: rootvars:- pkname: httpdtasks:- name: uninstall pknameyum: name={{ pkname }} state=absent
直接運行,使用默認參數:
ansible-playbook var_uninstall.yml
在運行時重新給變量賦值,會修改參數:
ansible-playbook -e 'pkname=nginx' var_uninstall.yml
3.4使用變量文件
可以在一個獨立的playbook文件中定義變量,在另一個playbook文件中引用變量文件中的變量,比playbook中定義的變量優化級高
- 新建playbook定義變量
vim vars.yml
---
# variables file
var1: httpd
var2: nginx
vim var_log.yml
---
- hosts: webserversremote_user: rootvars_files:- vars.yml
# - /root/playbook/vars.ymltasks:- name: create httpd logfile: name=/data/{{ var1 }}.log state=touch- name: create nginx logfile: name=/data/{{ var2 }}.log state=touch
?ansible-playbook var_log.yml
ansible all -a 'ls /data/ '
3.5主機清單文件中定義變量
主機變量
在inventory 主機清單文件中為指定的主機定義變量以便于在playbook中使用
組(公共)變量
在inventory 主機清單文件中賦予給指定組內所有主機上的在playbook中可用的變量,如果和主機變是同名,優先級低于主機變量。
范例:
- 打開hosts文件,添加主機變量和公共變量
vim /etc/ansible/hosts
[webservers]
linux101 hname=www1 domain=yu.io #添加主機變量(優先級高于公共變量)
linux102 hname=www1 domain=yhx.com[webservers:vars]#添加webservers的組變量(公共變量)
mark="-"
domain=edu.cn
- 調用
hostname
模塊,修改主機名
#先想想主機名應該是什么
ansible webservers -m hostname -a 'name={{ hname}}{{ mark }}{{ domain }}'
ansible all -a 'hostname'
因為主機變量優先級高于組變量(公共變量),所以linux101的主機名應該是:www1-yu.io,linux102的主機名應該是:www1.yhx.com.
- 還可以通過行命令來指定變量,這時候指定的變量可以覆蓋之前文件中定義的變量
#命令行指定變量:
ansible webservers -e domain=sch.com -m hostname -a 'name={{ hname }}{{ mark }}{{ domain }}'
ansible all -a 'hostname'
4. 再將hostname修改回去
ansible linux101 -m hostname -a 'name=linux101'
ansible linux102 -m hostname -a 'name=linux102'
ansible all -a 'hostname'