playbook介紹
playbook是由一個(gè)或多個(gè)”play”組成的列表蓬蝶。play的主要功能在于將事先歸為一組的主機(jī)裝扮成事先通過ansible中的task定義好的角色糕档。從根本上來將藻雌,所謂的task無法是調(diào)用ansible的一個(gè)module。將多個(gè)play組織在一個(gè)playbook中曹货,即可以讓他們聯(lián)通起來按事先編排的機(jī)制同唱一臺大戲奖亚。
playbook-->play-->task-->module
role
Playbook是Ansible的配置,部署甘邀,編排語言琅攘。他們可以被描述為一個(gè)需要希望遠(yuǎn)程主機(jī)執(zhí)行命令的方案,或者一組IT程序運(yùn)行的命令集合松邪。
當(dāng)執(zhí)行一些簡單的改動時(shí)ansible命令是非常有用的坞琴,然而它真的作用在于它的腳本能力。當(dāng)對一臺機(jī)器做環(huán)境初始化的時(shí)候往往需要不止做一件事情逗抑,這時(shí)使用playbook會更加適合剧辐。通過playbook你可以一次在多臺機(jī)器執(zhí)行多個(gè)指令。通過這種預(yù)先設(shè)計(jì)的配置保持了機(jī)器的配置統(tǒng)一邮府,并很簡單的執(zhí)行日常任務(wù)荧关。
Playbook還開創(chuàng)了很多特性,它可以允許你傳輸某個(gè)命令的狀態(tài)到后面的指令褂傀,如你可以從一臺機(jī)器的文件中抓取內(nèi)容并附為變量忍啤,然后在另一臺機(jī)器中使用,這使得你可以實(shí)現(xiàn)一些復(fù)雜的部署機(jī)制仙辟,這是ansible命令無法實(shí)現(xiàn)的同波。
在如右的連接中: https://github.com/ansible/ansible-examples,有一些整套的playbooks叠国,它們闡明了上述的這些技巧未檩。
YAML介紹
Ansible使用標(biāo)準(zhǔn)的YAML解析器,使用YAML文件語法即可書寫playbook粟焊。
YAML是一個(gè)可讀性高的用來表達(dá)資料序列的格式冤狡,YAML參考了其他多種語言,包括:XML吆玖、C語言筒溃、Python、Perl以及電子郵件格式RFC2822等沾乘。Clark Evans在2001首次發(fā)表了這種語言怜奖。
YAML Ain’t Makup Language仇参,即YAML不是XML霹陡。不過角钩,在開發(fā)這種語言時(shí)蠢甲,YAML的意思是:Yet Another Makrup Language(仍是一種標(biāo)記語言),其特性:YAML的可讀性好滥崩、YAML和腳本的交互性好岖圈、YAML有一個(gè)一致的信息模型、YAML易于實(shí)現(xiàn)钙皮、 YAML可以基于流來處理蜂科、YAML表達(dá)能力強(qiáng),擴(kuò)展性好短条。更多的內(nèi)容及規(guī)范參見www.yaml.org导匣。
GNU GNU IS NOT UNIX
LINUX linus's mix
核心元素:
Playbooks
Variables #變量元素,可傳遞給Tasks/Templates使用;
Tasks #任務(wù)元素,由模塊定義的操作的列表,即調(diào)用模塊完成任務(wù);
Templates #模板元素,使用了模板語法的文本文件茸时,可根據(jù)變量動態(tài)生成配置文件;
Handlers #處理器元素,通常指在某事件滿足時(shí)觸發(fā)的操作;
Roles #角色元素
playbook的基礎(chǔ)組件:
name
定義playbook或者task的名稱
hosts
playbook中的每一個(gè)paly的目的都是為了讓某個(gè)或某些以某個(gè)指定用戶的身份執(zhí)行任務(wù)贡定。hosts用于指定要執(zhí)行指定任務(wù)的主機(jī),其可以是一個(gè)或多個(gè)由冒號分割主機(jī)組可都。與命令模式下的ansible匹配規(guī)則一樣
user
remote_user則用于指定遠(yuǎn)程主機(jī)上的執(zhí)行任務(wù)的用戶缓待,也可以使用user
tasks
任務(wù)列表
play的主體部分是task list. task list中的各任務(wù)按次序逐個(gè)在hosts中指定的所有主機(jī)上執(zhí)行,即在所有主機(jī)上完成第一個(gè)任務(wù)后再開始第二個(gè)渠牲。
vars
定義變量
vars_files
定義變量文件
notify
任務(wù)執(zhí)行結(jié)果如果是發(fā)生更改了的則觸發(fā)定義在handler的任務(wù)執(zhí)行
handlers
用于當(dāng)前關(guān)注的資源發(fā)生變化時(shí)采取一定指定的操作
include
能包含的包括task旋炒,handler和playbook
可以在include的時(shí)候傳遞變量
示例1:簡單playbook
文檔以---開頭,沒有也可以
[root@master ~]# cd /etc/ansible/
[root@master ansible]# vim test.yml //固定后綴為yml
- hosts: all //特別注意-后面的空格 指定執(zhí)行本play的主機(jī)組
user: root //指定運(yùn)行本play的遠(yuǎn)程主機(jī)用戶
tasks: - name: playbook_test //任務(wù)描述
shell: touch /tmp/playbook.txt //shell是ansible模塊
tags: suibian //這是一個(gè)任務(wù)標(biāo)記,可用來單獨(dú)執(zhí)行此任務(wù)
參數(shù)解釋:
hosts參數(shù)指定了對哪些主機(jī)進(jìn)行操作嘱兼;
user參數(shù)指定了使用什么用戶登錄遠(yuǎn)程主機(jī)操作国葬;
tasks指定了一個(gè)任務(wù),其下面的name參數(shù)同樣是對任務(wù)的描述芹壕,在執(zhí)行過程中會打印出來汇四。
tags:給指定的任務(wù)定義一個(gè)調(diào)用標(biāo)識,形式如下
- name: NAME
module: arguments
tags: TAG_ID
語法檢測:
[root@ansible ansible]# ansible-playbook --syntax-check test.yml
playbook: test.yml
測試運(yùn)行
[root@master ansible]#ansible-playbook -C /path/to/playbook.yaml
可以使用如下參數(shù):
--list-hosts
--list-tasks
--list-tags
運(yùn)行Playbook:
[root@master ansible]# ansible-playbook test.yml
只運(yùn)行指定標(biāo)記的任務(wù):-t tags
[root@ansible ansible]# ansible-playbook -t 標(biāo)記名稱 test.yml
跳過某一個(gè)被標(biāo)記的任務(wù):--skip-tags=SKIP_TAGS
[root@ansible ansible]# ansible-playbook --skip-tags=標(biāo)記名稱 test.yml
從某一個(gè)任務(wù)開始往下運(yùn)行:--start-at-task 任務(wù)名稱
[root@ansible ansible]# ansible-playbook --start-at-task "start httpd service" test.yml
示例2.每個(gè)playbook可以有多個(gè)play
[root@ansible ansible]# cat test.yml
hosts: all //play1
remote_user: root
tasks:name: install a group
group: name=mygrp system=truename: install a user
user: name=user1 group=mygrp system=truehosts: webservers //play2
remote_user: root
tasks:name: install httpd package
yum: name=httpdname: start httpd service
service: name=httpd state=started
示例3:使用變量
[root@ansible ansible]# cat create_user.yml
- name: create_user //劇本描述信息
hosts: web1
user: root
gather_facts: false
vars: - user: "msiyuetian"
tasks: - name: create user
user: name="{{ user }}"
參數(shù)解釋:
name參數(shù)
對該playbook實(shí)現(xiàn)的功能做一個(gè)概述踢涌,后面執(zhí)行過程中通孽,會打印 name變量的值 ,可以省略睁壁;
gather_facts參數(shù)
指定了在以下任務(wù)部分執(zhí)行前背苦,是否先執(zhí)行setup模塊獲取主機(jī)相關(guān)信息,這在后面的task會使用
到setup獲取的信息時(shí)用到潘明;
默認(rèn)值為true行剂,改成false之后在執(zhí)行過程中就看不到以下信息:
TASK [Gathering Facts]
ok: [web1]
ok: [web3]
ok: [web2]
ok: [192.168.245.135]
vars參數(shù)
指定了變量,這里指字一個(gè)user變量钳降,其值為test 厚宰,需要注意的是,變量值一定要用引號引住铲觉;
user
指定了調(diào)用user模塊澈蝙,name是user模塊里的一個(gè)參數(shù),而增加的用戶名字調(diào)用了上面user變量的值撵幽。
運(yùn)行playbook:
[root@master ansible]# ansible-playbook create_user.yml
示例4:條件執(zhí)行
[root@master ansible]# vim when.yml
- hosts: web1
user: root
gather_facts: True
tasks:- name: use when
shell: touch /tmp/when.txt
when: ansible_hostname == "web1"
- name: use when
[root@ansible ansible]# cat when.yml
- hosts: web1
user: root
gather_facts: True
tasks: - name: use when
shell: touch /tmp/when.txt
when: ansible_all_ipv4_addresses[0] == "192.168.245.133"
只有當(dāng)參數(shù)ansible_all_ipv4_addresses[0]為 192.168.245.133 時(shí)才在該機(jī)器上新建指定文件灯荧;意思就是只對 testhost 組中特定的主機(jī)進(jìn)行操作,忽略組內(nèi)其他的主機(jī)盐杂《涸兀可以通過setup模塊查看各個(gè)參數(shù)的值
setup模塊變量獲取:
上面的變量:ansible_hostname和ansible_all_ipv4_addresses[0] 是從setup模塊中獲取
注意看
是:
"ansible_hostname": "web1"
還是:
"ansible_all_ipv4_addresses": [
"192.168.245.133"
]
如果變量值是用[]括起來的需要用[0]方式切片獲取
[root@master ansible]# ansible-playbook when.yml
示例5:handlers:由特定條件觸發(fā)的Tasks
調(diào)用及定義方式:
tasks:
- name: TASK_NAME
module: arguments
notify: HANDLER_NAME
handlers: - name: HANDLER_NAME
module: arguments
handlers示例1
[root@ansible ansible]# cat handlers.yml
- name: handlers test
hosts: web1
user: root
tasks: - name: test copy
copy: src=/etc/passwd dest=/tmp/handlers.txt
notify: test handlers
handlers:
- name: test handlers
shell: echo "www.qianfeng.com" >> /tmp/handlers.txt
說明:只有 copy 模塊真正執(zhí)行后况褪,才會去調(diào)用下面的 handlers 相關(guān)的操作撕贞,追加內(nèi)容更耻。所以這種比較適合配置文件發(fā)生更改后测垛,需要重啟服務(wù)的操作。
[root@master ansible]# ansible-playbook handlers.yml
handlers示例2:
hosts: websrvs
remote_user: root
tasks:name: install httpd package
yum: name=httpd state=latestname: install conf file
copy: src=/root/httpd.conf dest=/etc/httpd/conf/httpd.conf
notify: restart httpd servicename: start httpd service
service: name=httpd state=started
handlers:
- name: restart httpd service
service: name=httpd state=restarted
示例6:include參數(shù)
- name: create_user
hosts: web1
user: root
gather_facts: false
vars: - user: "msiyuetian"
tasks: - name: create user
user: name="{{ user }}" - include: handlers.yml //已經(jīng)用下面的import_playbook代替
- import_playbook: handlers.yml
示例7:pause暫停
在playbook執(zhí)行的過程中暫停一定時(shí)間或者提示用戶進(jìn)行某些操作
常用參數(shù):
minutes:暫停多少分鐘
seconds:暫停多少秒
prompt:打印一串信息提示用戶操作
[root@ansible ansible]# cat wait.yml
- name: wait
hosts: web1
tasks: - name: wait on user input
pause: prompt="Warning! Detected slight issue. ENTER to continue CTRL-C a to quit" - name: timed wait
pause: seconds=30