PlayBook
1.playbooks 本身由以下各部分組成
- (1)Tasks:任務(wù),即通過(guò) task 調(diào)用 ansible 的模塊將多個(gè)操作組織在一個(gè) playbook 中運(yùn)行
- (2)Variables:變量
- (3)Templates:模板
- (4)Handlers:處理器,當(dāng)changed狀態(tài)條件滿足時(shí),(notify)觸發(fā)執(zhí)行的操作
- (5)Roles:角色
2.示例:
vim test1.yaml
--- #yaml文件以---開頭,以表明這是一個(gè)yaml文件,可省略
- name: first play #定義一個(gè)play的名稱,可省略
gather_facts: false #設(shè)置不進(jìn)行facts信息收集,這可以加快執(zhí)行速度,可省略
hosts: webservers #指定要執(zhí)行任務(wù)的被管理主機(jī)組,如多個(gè)主機(jī)組用冒號(hào)分隔
remote_user: root #指定被管理主機(jī)上執(zhí)行任務(wù)的用戶
tasks: #定義任務(wù)列表,任務(wù)列表中的各任務(wù)按次序逐個(gè)在hosts中指定的主機(jī)上執(zhí)行
- name: test connection #自定義任務(wù)名稱
ping: #使用 module: [options] 格式來(lái)定義一個(gè)任務(wù)
- name: disable selinux
command: '/sbin/setenforce 0' #command模塊和shell模塊無(wú)需使用key=value格式
ignore_errors: True #如執(zhí)行命令的返回值不為0,就會(huì)報(bào)錯(cuò),tasks停止,可使用ignore_errors忽略失敗的任務(wù)
- name: disable firewalld
service: name=firewalld state=stopped #使用 module: options 格式來(lái)定義任務(wù),option使用key=value格式
- name: install httpd
yum: name=httpd state=latest
- name: install configuration file for httpd
copy: src=/opt/httpd.conf dest=/etc/httpd/conf/httpd.conf #這里需要一個(gè)事先準(zhǔn)備好的/opt/httpd.conf文件
notify: "restart httpd" #如以上操作后為changed的狀態(tài)時(shí),會(huì)通過(guò)notify指定的名稱觸發(fā)對(duì)應(yīng)名稱的handlers操作
- name: start httpd service
service: enabled=true name=httpd state=started
handlers: #handlers中定義的就是任務(wù),此處handlers中的任務(wù)使用的是service模塊
- name: restart httpd #notify和handlers中任務(wù)的名稱必須一致
service: name=httpd state=restarted
==Ansible在執(zhí)行完某個(gè)任務(wù)之后并不會(huì)立即去執(zhí)行對(duì)應(yīng)的handler,而是在當(dāng)前play中所有普通任務(wù)都執(zhí)行完后再去執(zhí)行handler,這樣的好處是可以多次觸發(fā)notify,但最后只執(zhí)行一次對(duì)應(yīng)的handler,從而避免多次重啟。
3.運(yùn)行playbook
ansible-playbook test1.yaml
補(bǔ)充參數(shù):
參數(shù) | 含義 |
---|---|
-k(–ask-pass) | 用來(lái)交互輸入ssh密碼 |
-K(-ask-become-pass) | 用來(lái)交互輸入sudo密碼 |
-u | 指定用戶 |
ansible-playbook test1.yaml --syntax-check
#檢查yaml文件的語(yǔ)法是否正確ansible-playbook test1.yaml --list-task
#檢查tasks任務(wù)ansible-playbook test1.yaml --list-hosts
#檢查生效的主機(jī)ansible-playbook test1.yaml --start-at-task='install httpd'
#指定從某個(gè)task開始運(yùn)行
4.定義、引用變量
- name: second play
hosts: dbservers
remote_user: root
vars: #定義變量
- groupname: mysql #格式為 key: value
- username: nginx
tasks:
- name: create group
group: name={{groupname}} system=yes gid=306 #使用 {{key}} 引用變量的值
- name: create user
user: name={{username}} uid=306 group={{groupname}}
- name: copy file
copy: content="{{ansible_default_ipv4}}" dest=/opt/vars.txt #在setup模塊中可以獲取facts變量信息
ansible-playbook test1.yaml -e "username=nginx"
#在命令行里定義變量
5.指定遠(yuǎn)程主機(jī)sudo切換用戶
---
- hosts: dbservers
remote_user: zhangsan
become: yes #2.6版本以后的參數(shù),之前是sudo,意思為切換用戶運(yùn)行
become_user: root #指定sudo用戶為root
執(zhí)行playbook時(shí):ansible-playbook test1.yml -k -K
6.when條件判斷
在Ansible中,提供的唯一一個(gè)通用的條件判斷是when指令,當(dāng)when指令的值為true時(shí),則該任務(wù)執(zhí)行,否則不執(zhí)行該任務(wù)。
//when一個(gè)比較常見(jiàn)的應(yīng)用場(chǎng)景是實(shí)現(xiàn)跳過(guò)某個(gè)主機(jī)不執(zhí)行任務(wù)或者只有滿足條件的主機(jī)執(zhí)行任務(wù)
```bash
vim test2.yaml
---
- hosts: all
remote_user: root
tasks:
- name: shutdown host
command: /sbin/shutdown -r now
when: ansible_default_ipv4.address == "192.168.80.12" #when指令中的變量名不需要手動(dòng)加上 {{}}
或
when: inventory_hostname == "<主機(jī)名>"
ansible-playbook test2.yaml
7.迭代
Ansible提供了很多種循環(huán)結(jié)構(gòu),一般都命名為with_items,作用等同于 loop 循環(huán)。
vim test3.yaml
---
- name: play1
hosts: dbservers
gather_facts: false
tasks:
- name: create file
file:
path: "{{item}}"
state: touch
with_items: [ /opt/a, /opt/b, /opt/c, /opt/d ]
- name: play2
hosts: dbservers
gather_facts: false
vars:
test:
- /tmp/test1
- /tmp/test2
- /tmp/test3
- /tmp/test4
tasks:
- name: create directories
file:
path: "{{item}}"
state: directory
with_items: "{{test}}"
- name: play3
hosts: dbservers
gather_facts: false
tasks:
- name: add users
user: name={{item.name}} state=present groups={{item.groups}}
with_items:
- name: test1
groups: wheel
- name: test2
groups: root
或
with_items:
- {name: 'test1', groups: 'wheel'}
- {name: 'test2', groups: 'root'}
ansible-playbook test3.yaml
8.Templates 模塊
Jinja是基于Python的模板引擎。Template類是Jinja的一個(gè)重要組件,可以看作是一個(gè)編譯過(guò)的模板文件,用來(lái)產(chǎn)生目標(biāo)文本,傳遞Python的變量給模板去替換模板中的標(biāo)記。
1.先準(zhǔn)備一個(gè)以 .j2 為后綴的 template 模板文件,設(shè)置引用的變量
cp /etc/httpd/conf/httpd.conf /opt/httpd.conf.j2
vim /opt/httpd.conf.j2
Listen {{http_port}} #42行,修改
ServerName {{server_name}} #95行,修改
DocumentRoot "{{root_dir}}" #119行,修改
2.修改主機(jī)清單文件,使用主機(jī)變量定義一個(gè)變量名相同,而值不同的變量
vim /etc/ansible/hosts
[webservers]
192.168.52.110 http_port=192.168.52.110:80 server_name=www.accp.com:80 root_dir=/etc/httpd/htdocs
[dbservers]
192.168.52.100 http_port=192.168.52.100:80 server_name=www.benet.com:80 root_dir=/etc/httpd/htdocs
3.編寫 playbook
vim apache.yaml
---
- hosts: all
remote_user: root
vars:
- package: httpd
- service: httpd
tasks:
- name: install httpd package
yum: name={{package}} state=latest
- name: install configure file
template: src=/opt/httpd.conf.j2 dest=/etc/httpd/conf/httpd.conf #使用template模板
notify:
- restart httpd
- name: create root dir
file: path=/etc/httpd/htdocs state=directory
- name: start httpd server
service: name={{service}} enabled=true state=started
handlers:
- name: restart httpd
service: name={{service}} state=restarted
ansible-playbook apache.yaml
9.tags 模塊
可以在一個(gè)playbook中為某個(gè)或某些任務(wù)定義“標(biāo)簽”,在執(zhí)行此playbook時(shí)通過(guò)ansible-playbook命令使用–tags選項(xiàng)能實(shí)現(xiàn)僅運(yùn)行指定的tasks。
playbook還提供了一個(gè)特殊的tags為always。作用就是當(dāng)使用always作為tags的task時(shí),無(wú)論執(zhí)行哪一個(gè)tags時(shí),定義有always的tags都會(huì)執(zhí)行。
vim webhosts.yaml
---
- hosts: webservers
remote_user: root
tasks:
- name: Copy hosts file
copy: src=/etc/hosts dest=/opt/hosts
tags:
- only #可自定義
- name: touch file
file: path=/opt/testhost state=touch
tags:
- always #表示始終要運(yùn)行的代碼
ansible-playbook webhosts.yaml --tags="only"
vim dbhosts.yaml
---
- hosts: dbservers
remote_user: root
tasks:
- name: Copy hosts file
copy: src=/etc/hosts dest=/opt/hosts
tags:
- only
- name: touch file
file: path=/opt/testhost state=touch
ansible-playbook dbhosts.yaml --tags="only"
//分別去兩臺(tái)被管理主機(jī)上去查看文件創(chuàng)建情況
10.總結(jié)
vim XXX.yaml
- name: #指定play名稱
hosts: #指定主機(jī)組
remote_user: #執(zhí)行用戶
gather_facts: true|false #是否收集遠(yuǎn)程主機(jī)facts信息
vars: #定義變量
tasks: #定義task任務(wù)列表
- name: #定義task任務(wù)名稱
模塊: #定義任務(wù)使用的模塊和參數(shù)
with_items: #定義循環(huán)列表
when: #定義判斷條件(== != >= > <= <),true則執(zhí)行任務(wù),否則不執(zhí)行任務(wù)
ignore_errors: true #忽略任務(wù)失敗
notify: #定義task任務(wù)changed狀態(tài)時(shí)觸發(fā)的任務(wù)名
tags: #指定標(biāo)簽,ansible-playbook --tags 僅執(zhí)行擁有指定 tags 標(biāo)簽的任務(wù)(always標(biāo)簽總會(huì)執(zhí)行)
handlers: #定義notify觸發(fā)的任務(wù)列表
task任務(wù)模塊語(yǔ)法格式
橫向格式:
模塊名: 參數(shù)選項(xiàng)1=值 參數(shù)選項(xiàng)2={{變量名}} ...
縱向格式:
模塊名:
參數(shù)選項(xiàng)1: 值
參數(shù)選項(xiàng)2: "{{變量名}}"
...
with_items和變量的語(yǔ)法格式文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-654407.html
橫向格式:
with_items: ["值1", "值2", "值3"]
值為對(duì)象(鍵值對(duì)字段)時(shí):
with_items:
- {key1: value1, key2: value2, ...}
- {key1: value3, key2: value4, ...}
縱向格式:
with_items:
- 值1
- 值2
- 值3
值為對(duì)象(鍵值對(duì)字段)時(shí):
with_items:
- key1: value1
key2: value2
- key1: value3
key2: value4
template模板模塊文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-654407.html
(1)先要準(zhǔn)備一個(gè)xxx.j2模板文件,在文件中使用 {{變量名}} 引用主機(jī)變量 或者 vars 自定義的變量 及 facts 字段的值
(2)在playbook中的tasks中定義template模板配置 template: src=xxx.j2 dest=xxx
到了這里,關(guān)于ansible的playbook劇本的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!