ansible-playbook
playbook簡介
playbook是ansible用于配置,部署,和管理被控節(jié)點(diǎn)的劇本。通過playbook的詳細(xì)描述,執(zhí)行其中的一系列tasks,可以讓遠(yuǎn)端主機(jī)達(dá)到預(yù)期的狀態(tài)。playbook就像Ansible控制器給被控節(jié)點(diǎn)列出的的一系列to-do-list,而被控節(jié)點(diǎn)必須要完成。
也可以這么理解,playbook 字面意思,即劇本,現(xiàn)實(shí)中由演員按照劇本表演,在Ansible中,這次由計算機(jī)進(jìn)行表演,由計算機(jī)安裝,部署應(yīng)用,提供對外服務(wù),以及組織計算機(jī)處理各種各樣的事情。
Playbook使用場景
執(zhí)行一些簡單的任務(wù),使用ad-hoc(調(diào)用各種模塊,通過命令行來執(zhí)行命令)命令可以方便的解決問題,但是有時一個設(shè)施過于復(fù)雜,需要大量的操作時候,執(zhí)行的ad-hoc命令是不適合的,這時最好使用playbook,就像執(zhí)行shell命令與寫shell腳本一樣,也可以理解為批處理任務(wù),不過playbook有自己的語法格式,一會會介紹。
使用playbook你可以方便的重用這些代碼,可以移植到不同的機(jī)器上面,像函數(shù)一樣,最大化的利用代碼。在你使用Ansible的過程中,你也會發(fā)現(xiàn),你所處理的大部分操作都是編寫playbook。
playbook格式
playbook由YMAL語言編寫。YAML參考了其他多種語言,包括:XML、C語言、Python、Perl以及電子郵件格式RFC2822,Clark Evans在2001年5月在首次發(fā)表了這種語言,另外Ingy d?t Net與Oren Ben-Kiki也是這語言的共同設(shè)計者。
YMAL格式是類似于JSON的文件格式,便于人理解和閱讀,同時便于書寫。首先學(xué)習(xí)了解一下YMAL的格式,對我們后面書寫playbook很有幫助。以下為playbook常用到的YMAL格式。
YMAL語法請參考http://docs.ansible.com/YAMLSyntax.html
yaml格式語法簡介
對于 Ansible, 每一個 YAML 文件都是從一個列表開始. 列表中的每一項都是一個鍵值對, 通常它們被稱為一個 “哈?!?或 “字典”. 所以, 我們需要知道如何在 YAML 中編寫列表和字典.
- 文件第一行以 --- (三個連字符)開始,表明yaml文件的開始
- 在同一行中, #之后的內(nèi)容表示注釋, 類似于shell,python
- yaml中的列表元素以 - 開頭然后緊跟著一個空格,后面為元素的內(nèi)容
例子如下:
---
- apple
- red
- green
- 同一個列表中的元素應(yīng)該保持相同的縮進(jìn)。否則會被當(dāng)做錯誤處理。
- play中hosts,variables,roles,tasks等對象的表示方法都是鍵值中間以":"分隔表示,":"后面還要增加一個空格。
- YMAL的有很多的字符串可以解釋為true或false:
YMAL Truethy: true ,True ,TRUE ,yes ,Yes , YES ,on ,On ,ON ,y ,
YMAL falthy:false ,False ,FALSE ,no ,No ,NO ,off ,Off ,OFF , n ,N
- 盡管 YAML 通常是友好的, 但是下面將會導(dǎo)致一個 YAML 語法錯誤:
foo: somebody said I should put a colon here: so I did
- 你需要使用引號來包裹任何包含冒號的哈希值, 像這樣:
foo: "somebody said I should put a colon here: so I did"
然后這個冒號將會被結(jié)尾.
- Ansible 使用 “{{ var }}” 來引用變量. 如果一個值以 “{” 開頭, YAML 將認(rèn)為它是一個字典, 所以我們必須引用它, 像這樣:
foo: "{{ variable }}
---
# 一位職工的記錄
name: Example Developer
job: Developer
skill: Elite
讓我們把目前所學(xué)到的 YAML 例子組合在一起.
這些在 Ansible 中什么也干不了 但這些格式將會給你感覺:
---
# 一位職工記錄
name: Example Developer
job: Developer
skill: Elite
employed: True
foods:
- Apple
- Orange
- Strawberry
- Mango
languages:
ruby: Elite
python: Elite
dotnet: Lame
一個家庭記錄

playbook基礎(chǔ)
現(xiàn)在的/etc/ansible/hosts配置
[root@note1 ansible]# cat /etc/ansible/hosts
[web]
192.168.70.51
[db]
192.168.70.50
安裝一個mysql服務(wù)的案列

在mysql.yml中,主要由三個部分組成:
- hosts部分:使用hosts指示使用哪個主機(jī)或主機(jī)組來運(yùn)行下面的tasks,每個playbook都必須指定hosts,hosts也可以使用通配符格式。主機(jī)或主機(jī)組在inventory清單中指定,可以使用系統(tǒng)默認(rèn)的/etc/ansible/hosts,也可以自己編輯,在運(yùn)行的時候加上-i選項,指定清單的位置即可。在運(yùn)行清單文件的時候,–list-hosts選項會顯示那些主機(jī)將會參與執(zhí)行task的過程中。
- remote_user:指定遠(yuǎn)端主機(jī)中的哪個用戶來登錄遠(yuǎn)端系統(tǒng),在遠(yuǎn)端系統(tǒng)執(zhí)行task的用戶,可以任意指定,也可以使用sudo,但是用戶必須要有執(zhí)行相應(yīng)task的權(quán)限。
- tasks:指定遠(yuǎn)端主機(jī)將要執(zhí)行的一系列動作。tasks的核心為ansible的模塊,前面已經(jīng)提到模塊的用法。tasks包含name和要執(zhí)行的模塊,name是可選的,只是為了便于用戶閱讀,不過還是建議加上去,模塊是必須的,同時也要給予模塊相應(yīng)的參數(shù)。
playbook運(yùn)行結(jié)果解析
使用ansible-playbook運(yùn)行playbook文件,得到如下輸出信息,輸出內(nèi)容為JSON格式。并且由不同顏色組成,便于識別。一般而言
綠色代表執(zhí)行成功,系統(tǒng)保持原樣
黃色代表系統(tǒng)代表系統(tǒng)狀態(tài)發(fā)生改變
紅色代表執(zhí)行失敗,顯示錯誤輸出。
執(zhí)行的時候是用ansible-playbook而不是ansible命令了

查看結(jié)果

列出執(zhí)行的遠(yuǎn)程主機(jī)
[root@note1 ansible]# ansible-playbook mysql_ansible.yaml --list-hosts
playbook: mysql_ansible.yaml
play #1 (db): host count=1
192.168.70.50
ansible具有冪等性
再次執(zhí)行的時候ansible會檢測這個task是否已經(jīng)執(zhí)行過,
如果這個task任務(wù)執(zhí)行過,它不會再次執(zhí)行task任務(wù),
而是直接顯示ok狀態(tài).

ansible-playbook 進(jìn)階特性
playbook 組成結(jié)構(gòu)
Invertory
Modules
Ad Hoc Commands
PlayBooks
Tasks 任務(wù) 即調(diào)用模塊完成的某操作
Variable 變量
Templates 模板 根據(jù)客戶端的情況來生成一些的數(shù)據(jù)
Handlers 處理器 由某條件滿足能觸發(fā)執(zhí)行的操作
Roles 角色
playbook 基礎(chǔ)組件
Hosts和Users
playbook中的每一個play的目的都是為了讓某個或者某些主機(jī)以某個指定的用戶身份來執(zhí)行任務(wù),hosts是用于指定要執(zhí)行的指定任務(wù)的主機(jī),其可以是一個或者多個以冒號分割的主機(jī)組,remote_users則用于指定遠(yuǎn)程主機(jī)上的執(zhí)行任務(wù)的用戶,如下面所示
- hosts: webnodes
remote_user: root
不過 remote_users 也可以用于每個task中,也可以通過指定其通過sudo的方式在遠(yuǎn)程的主機(jī)上執(zhí)行任務(wù),其可以于play全局或者某任務(wù)中,此外,甚至可以在sudo時使用sudo_user 指定sudo時切換的用戶
- hosts: webnodes
remote_user: bds
tasks:
- name: test connection
ping:
remote_user: bds
sudo: yes
任務(wù)列表和action
play的主體部分是task list task list中的各任務(wù)按次序逐個在hosts中指定的所有主機(jī)上執(zhí)行,即在所有主機(jī)上完成第一個任務(wù)后在開始第二個任務(wù),在運(yùn)行自上而下某個playbook時,如果中途發(fā)生錯誤,所有已經(jīng)執(zhí)行的任務(wù)都會講回滾,因此,在更正playbook后重新執(zhí)行一次即可
task目的是使用指定的參數(shù)執(zhí)行模塊,而在模塊參數(shù)中可以使用變量,模塊執(zhí)行是具有冪等性的,這意味著多次執(zhí)行是安全的,因?yàn)槠浣Y(jié)構(gòu)均一致
每個task都應(yīng)該有其name ,用于playbook執(zhí)行結(jié)果輸出,建議其內(nèi)容盡可能清晰地描述任務(wù)執(zhí)行步驟,如果未提供name,則action的結(jié)果將用于輸出
定義task的可以使用“action: module option”或者module: options
推薦使用后者以實(shí)現(xiàn)向后兼容,如果action 一行的內(nèi)容過多,也可以使用在行首使用幾個空白字符進(jìn)行換行。
tasks:
- name: make sure apache is running
service: name=httpd state=running
在眾多模塊中,只用command和shell模塊僅需要給定一個列表而無需使用“key=value”格式例如
tasks:
- name: disable selinux
shell: /sbin/setenforce 0
如果命令或者腳本的退出碼不為零,可以使用如下的方式替代
tasks:
- name: run this command and igonre the result
shell: /usr/bin/somecomand || /bin/true
或者使用ignore_errors來忽略錯誤信息
tasks:
- name: run this command and ignore the result
shell: /usr/bin/somecommand
ingore_errors: True
寫一個示例:
[root@bj-idc-15 playbooks]# cat /etc/ansible/hosts #現(xiàn)在hosts配置,新添加一臺主機(jī)
[web]
192.168.122.52
[db]
10.10.10.15
10.10.10.14
[root@bj-idc-15 playbooks]# cat nginx.yml
---
- hosts: web
remote_user: root
tasks:
- name: create nginx group
group: name=nginx system=yes gid=208
- name: create nginx user
user: name=nginx system=yes uid=208 group=nginx
- hosts: db
remote_user: root
tasks:
- name: copy file to dbservers
copy: src=/etc/inittabdest=/tmp/inittale.ansible
執(zhí)行結(jié)果

handlers
用于當(dāng)關(guān)注的資源發(fā)生變化時采取一定的操作,notify 這個action可用于在每個play的最后被觸發(fā),這樣可以避免多次有改變發(fā)生的時候每次都執(zhí)行指定的操作,取而代之,僅在所有的變化發(fā)生完成時最后一次性的執(zhí)行指定的操作,在notify中列出的操作成為handlers,也即為notify中調(diào)用handler中定義的操作
- name: template configuration file
template: src=template.j2 dest=/etc/foo.conf
notify:
- restart memcached
- restart apache
handler是task列表,這些task與前述的task并沒有本質(zhì)上的區(qū)別
handlers:
- name: restart memcached #名字要和上面notify的 一致
service: name=memcached state=restarted
- name: restart apache
service: name=apache state=restarted
簡單案例: 沒有handler的時候
[root@bj-idc-14 playbooks]# cat apache.yml
---
- hosts: web
remote_user: root
tasks:
- name: install httpd package
yum: name=httpd state=latest
- name: install configurest file
copy: src=conf/httpd.conf dest=/etc/httpd/conf/httpd.conf
- name: start httpd service
service: name=httpd enabled=true state=started
簡單案例:
當(dāng)有一個需求,需要改變httpd配置文案的時候,那么這個時候是需要重啟httpd服務(wù)的,這時候就需要handlers了,只有某個條件滿足的時候才執(zhí)行
[root@bj-idc-14 playbooks]# cat apache.yml
---
- hosts: web
remote_user: root
tasks:
- name: install httpd package
yum: name=httpd state=latest
- name: install configurest file
copy: src=conf/httpd.conf dest=/etc/httpd/conf/httpd.conf
notify:
- restart httpd
- name: start httpd service
service: name=httpd enabled=true state=started
handlers:
- name: restart httpd
service: name=httpd state=restarted
Templates模板
如果說倆個webservser 安裝httpd node1監(jiān)聽80端口,node2 監(jiān)聽8080端口,node1使用的maxClient=100 node2的maxClient=200,這樣就需要倆個配置,非常不方便,這樣就可以嘗試用變量的方式來解決
簡單案例: 模板中定義變量
[root@bj-idc-14 playbooks]# cat templates/httpd.conf.j2 | grep {{ #httpd.conf.j2就是httpd的配置文件
MaxClients {{ maxclient }}
MaxClients {{ maxclient }}
Listen {{ http_port }}
ServerName {{ ansible_fqdn }} # facts 變量
[root@bj-idc-14 playbooks]# cat apache.yml
---
- hosts: web
remote_user: root
vars:
- http_port: 888 #定義的變量值 ,然后查看主機(jī)的配置文件是否為這里的值
- maxclient: 305 #定義的變量值 ,然后查看主機(jī)的配置文件是否為這里的值
tasks:
- name: install httpd package
yum: name=httpd state=latest
- name: install configurest file
copy: src=conf/httpd.conf dest=/etc/httpd/conf/httpd.conf
#把帶變量的模板替換正在運(yùn)行的配置文件,然后通知httpd重啟加載新的配置文件
template: src=templates/httpd.conf.j2 dest=/etc/httpd/conf/httpd.conf
notify:
- restart httpd
- name: start httpd service
service: name=httpd enabled=true state=started
handlers:
- name: restart httpd
service: name=httpd state=restarted
執(zhí)行結(jié)果
[root@bj-idc-14 playbooks]# cat /etc/httpd/conf/httpd.conf |grep -v "^#"| grep ServerName
ServerName bj-idc-14
[root@bj-idc-14 playbooks]# cat /etc/httpd/conf/httpd.conf |grep -v "^#"| grep Listen
Listen 888
[root@bj-idc-14 playbooks]# cat /etc/httpd/conf/httpd.conf |grep -v "^#"| grep MaxClients
MaxClients 305
MaxClients 305
ansible-playbook 中yaml基礎(chǔ)元素
- 變量
- Invertory
- 條件判斷
- 迭代機(jī)制
變量
- 變量命名
變量名僅能有字母,數(shù)字和下劃線組成,且只能以字母開頭
- facts
facts是由正在通信的遠(yuǎn)程目標(biāo)主機(jī)發(fā)回的信息,可以直接引用, 這些信息保存在ansible變量中,要獲取指定的遠(yuǎn)程主機(jī)所支持的所有facts,可試用如下命令進(jìn)行ansible hostname -m setup
- register
把任務(wù)的輸出定義為變量,然后用于其他任務(wù),示例如下:
tasks:
shell: /usr/bin/foo
register: foo_result
ignore_error: True
- 通過命令傳遞變量
在運(yùn)行playbook的時候,也可以傳遞一些變量供playbook使用,示例如下
ansible-playbook test.yaml –extra-vars “hosts=wwwuser=bds”
- 通過roles傳遞變量
當(dāng)給一個主應(yīng)用角色的時候可以傳遞變量,然后在角色內(nèi)使用這變量,如下
- host: webservers
roles:
- commn
- { role: foo_arpp_instance , dir: ‘web/htdocs/a.com’ , port: 8080 }
變量實(shí)戰(zhàn)
vars的簡單案例
[root@bj-idc-14 playbooks]# cat http.yml
---
- hosts: web
remote_user: root
vars:
- groupuser: httpd
- username: httpd
tasks:
- name: create {{ groupuser }} group
group: name={{ groupuser }} system=yes gid=238
- name: create {{ username }} user
user:name={{ username }} system=yes uid=238 group={{ groupuser }}
執(zhí)行結(jié)果

facts的簡單案例: 定義主機(jī)變量
[root@bj-idc-14 ansible]# cat hosts
[web]
10.10.10.14 httpvars='10.10.10.14'
[db]
10.10.10.15
[root@bj-idc-14 playbooks]# cat facts_host.yml
---
- hosts: web
remote_user: root
tasks:
- name: copy file
copy: content="{{ ansible_all_ipv4_addresses }}, {{ httpvars }} ,
{{ ansible_cmdline.LANG }} " dest=/tmp/vars.ansible
[root@bj-idc-14 playbooks]# ansible-playbook facts_host.yml
執(zhí)行結(jié)果

Inventory
ansible的主要功能用在于批量操作主機(jī),
為了便捷的使用其中的部分主機(jī),
可以在Inventory file中將其分組命名,
默認(rèn)的Inventory file為/etc/ansible/hosts
Inventory file 可以有多個
也可以通過DynamicInvertory 來動態(tài)生成
Inventory文件格式
Inventory文件遵循INI文件風(fēng)格,中括號中的字符為組名,可以將同一個主機(jī)同時歸并到多個不同的組中,此外,當(dāng)如若目標(biāo)主機(jī)使用了非默認(rèn)的ssh端口,還可以在主機(jī)名稱之后使用冒號加端口來表明
例子:
ntp.bds.com
[webservers]
www1.bds.com
www2.bds.com
[bdservers]
db1.bds.com
db2.bds.com
如果主機(jī)名稱遵循相識的命名模式,還可以使用列表的形式標(biāo)識各主機(jī)
例子:
[webservers]
www[0-51].bds.com
[dbservers]
db-[a-f].bds.com
主機(jī)變量
可以再Inverntory中定義主機(jī)時,為其添加主機(jī)變量,以便于在playbook中使用例子:
[webservers]
www1.bds.com http_port=80 maxRequestsPerChild=1024
組變量
組變量是指賦予給指定的組內(nèi)所有的主機(jī)上的在playbook中可用的變量
例子:
[webservers] #可以調(diào)用下面[webservsers:vars]中的變量
www1.bds.com
www2.bds.com
[webservsers:vars]
ntp_servser=ntp.bds.com
nfs_servser=nfs.bds.com
組嵌套
Inventory中,組還可以包含其他的組,并且也可以向組中的主機(jī)指定變量,不過,這些變量只能在ansible-playbook中使用,而ansible不支持
例子:
[apache]
http1.bds.com
http2.bds.com
[nginx]
ngx1.bds.com
ngx2.bds.com
[webservsers:children]
apache
nginx
[webservsers:vars]
ntp_server=ntp.bds.com
Inventory參數(shù)
ansible 基于ssh連接Invertory中指定的遠(yuǎn)程主機(jī)時,還可以通過參數(shù)指定其交互方式,這些參數(shù)如下所示
基本結(jié)構(gòu)
-host: web
remote_user: root
tasks:
- task1
modulesname: module_args
- task2
- host: dbserver
條件測試
如果需要根據(jù)變量,facts或者此前任務(wù)的執(zhí)行結(jié)果來作為某個tasks執(zhí)行與否的前提時要用到的條件測試
when語句
在task后添加when子句即可使用條件測試,
when語句支持Jinjia2表達(dá)式語法,例如
tasks:
- name: "shutdown Debian falovred systems"
command: /sbin/shutdown -h now
when: ansible_os_family == "Debian"
when語句中可以使用Jinja2的大多filter功能,
例如要忽略此前某語句的錯誤并基于其結(jié)果
(failed或者sccess)運(yùn)行后面指定的語句,
可使用類似如下形式
tasks:
- command: /bin/false
register: result
ignore_errors: True
- command: /bin/something
when: result| failed
- command: /bin/something_else
when: result|success
- command: /bin/still/something_else
when: result| skipped
此外when語句還可以使用facts或者playbooks中定義的變量
簡單案例
[root@bj-idc-14 playbooks]# ansible web -m setup |grep fqdn
"ansible_fqdn": "bj-idc-14",
[root@bj-idc-14 playbooks]# cat when.yml
---
- hosts: web
remote_user: root
vars:
- username: user10
tasks:
- name: create {{ username }}user
user: name={{ username }} uid=510
when: ansible_fqdn == "bj-idc-14"
執(zhí)行結(jié)果

迭代機(jī)制
當(dāng)有需要重復(fù)性的執(zhí)行的任務(wù)的時候,可以使用迭代機(jī)制,
其使用格式為將需要迭代的內(nèi)容定義為item變量引用,
并通過with_items 語句來指定迭代的元素列表即可
例如:
- name: add serveral users
user: name={{ item }} state=present groups=wheel
with_items:
- testuser1
- testuser2
上面的語句等同于下面的語句
- name: add serveral users1
user: name=testuser1 state=present groups=wheel
- name: add serveral users2
user: name=testuser1 state=present groups=wheel
事實(shí)上,with_items中可以使用元素還可以為hashes,例如
- name: add serveral users
user: name={{ item.name }} state=present groups={{ item.groups}}
with_items:
- { name: 'testuser1', groups: 'wheel' }
- { name: 'testuser2', gorups: 'wheel' }
ansible的循環(huán)機(jī)制還有很多高級功能,具體參見官方文檔
迭代: 表示重復(fù)同類task時使用
調(diào)用: item
定義循環(huán)列表: with_items
- apache
- php
- mysql
注意: with_items中的列表值可以是字典,但是引用的時候是使用item.KEY
- {name: apache, conf: conffiles/httpd.conf }
- {name: php , conf: conffiles/php.ini }
- {name: mysql-servser, conf: conffiles/my.conf }
ansible-playbook 小技巧
Tags
tags用于讓用戶選擇運(yùn)行或者路過playbook中的部分代碼
ansible具有冪等性,因此會自身跳過沒有變化的部分
即便如此,有些代碼為測試其確實(shí)沒有發(fā)生變化的時間依然會非常的地長,此時,如果確實(shí)其沒有發(fā)生變化,就可以通過tags跳過這些代碼片段當(dāng)改變配置文件的時候
對于安裝軟件的操作就不需要在執(zhí)行了,這時候有了tags就可以標(biāo)記你期望運(yùn)行的task任務(wù)中
tags表示在playbook可以為某個任務(wù)或者某些任務(wù)定義一個標(biāo)簽
在執(zhí)行次playbook時候通過為ansible-playbook 命令使用--tags選項能實(shí)現(xiàn)僅僅運(yùn)行指定的tasks而非所有的
簡單案例
[root@bj-idc-14 playbooks]# cat apache.yml
---
- hosts: web
remote_user: root
vars:
- http_port: 888
- maxclient: 305
tasks:
- name: install httpd package
yum: name=httpd state=latest
- name: install configurest file
#copy: src=conf/httpd.conf dest=/etc/httpd/conf/httpd.conf
template: src=templates/httpd.conf.j2 dest=/etc/httpd/conf/httpd.conf
tags:
- config #定義了一個tags 叫做config
notify:
- restart httpd
- name: start httpd service
service: name=httpd enabled=true state=started
tags:
- always #tags特殊用法 代表總是執(zhí)行這個任務(wù)
handlers:
- name: restart httpd
service: name=httpd state=restarted
執(zhí)行結(jié)果

check檢測和語法檢測
不要做任何改變,相反,試著預(yù)測一些可能發(fā)生的變化

語法檢測

list列出

forks線程
語法: -f FORKS, --forks=FORKS

step交互執(zhí)行

ansible-playbook 角色roles 定義
roles使用
ansible自1.2版本引入的新特性,用于層次性,結(jié)構(gòu)性的組織
playbook,roles能夠根據(jù)層次型結(jié)構(gòu)自動裝載變量文件,tasks以及hanlders等
要使用roles只需要在playbook中使用include指令即可
簡單來講,roles就是通過分別將變量,文件,任務(wù),模塊以及處理器位置放置于單獨(dú)的目錄中,并可以便捷地include他們的一種機(jī)制,角色一般用于基于主機(jī)機(jī)構(gòu)建服務(wù)的場景中
但也可以用于構(gòu)建守護(hù)進(jìn)程等場景中
一個roles的案例如下所示
site.yml
webservers.yml
fooservers.yml
roles/
common/
files/
templates/
tasks/
handlers/
vars/
meta/
webservsers/
files/
templates/
tasks/
handlers/
vars/
meta/
- 在playbook中,可以這樣使用roles
---
- hosts: webservers
roles:
- common
- webservers
- 也可以向roles傳遞參數(shù)
---
- hosts: webservsers
roles:
- common
- { role: foo_app_instance,dir: '/opt/a' port: 5000 }
- 甚至可以條件式的使用roles
---
- hosts: webservers
roles:
- { roles: some_role, when: "ansible_os_family == 'Redhat' "}
- 還可以role之間設(shè)定依賴關(guān)系
roles創(chuàng)建步驟
- 創(chuàng)建以roles命名的目錄
- 在roles目錄中分別創(chuàng)建以各個角色命名的目錄, 如webservers等
- 在每個角色命名的目錄中分別創(chuàng)建files,handles,meta,tasks,templates,和vars等目錄,用不到的可以創(chuàng)建為空目錄,也可以不創(chuàng)建
- 在playbook文件中,調(diào)用各個角色
roles內(nèi)各個目錄中可用的文件
- tasks目錄: 至少應(yīng)該包含一個名為main.yml的文件,其定義了此角色的任務(wù)列表,此文件可以使用include包含其他的位于此目錄中的task文件
- files目錄: 存放由copy 和script等模塊調(diào)用的文件
- templates目錄: template模塊會自動再次目錄中尋找Jinja2模板文件
- handlers目錄: 此目錄中應(yīng)當(dāng)包含一個main.yml文件,用于定義此角色用到的各handler:在handler中使用include包含的其它的handler文件也應(yīng)該位于此目錄中
- vars目錄: 應(yīng)當(dāng)包含一個main.yml文件,用于定義此角色用到的變量
- meta目錄: 應(yīng)當(dāng)包含一個main.yml文件, 用于定義此角色的特殊設(shè)定的依賴關(guān)系, ansible 1.3及以后的版本才支持
- default目錄: 為當(dāng)前角色設(shè)定默認(rèn)變量時使用的目錄,應(yīng)當(dāng)包含一個main.yml文件
roles總結(jié)
- 目錄名同為角色名
- 目錄結(jié)構(gòu)有固定格式
- files:靜態(tài)文件
- templates: Jinja2 模板文件
- tasks:至少有一個main.yml文件,定義各tasks
- handlers: 至少有一個main.yml文件,定義各handlers
- vars:定義變量
- meta:定義依賴關(guān)系信息
- site.yml中定義playbook, 額外也可以有其他的yml文件
roles簡單案例
建立目錄
[root@bj-idc-14 playbooks]# mkdir -pv /root/ansible_playbooks/roles/{websrvs,dbsrvs}/{tasks,files,templates,meta,handlers,vars}
查看目錄樹
[root@bj-idc-14 playbooks]# tree /root/ansible_playbooks/
/root/ansible_playbooks/
└── roles
├── dbsrvs
│ ├── files
│ ├── handlers
│ ├── meta
│ ├── tasks
│ ├── templates
│ └── vars
└── websrvs
├── files
├── handlers
├── meta
├── tasks
├── templates
└── vars
[root@bj-idc-14 ansible_playbooks]# cat site.yml
---
- hosts: web
remote_user: root
roles:
- websrvs
- hosts: web
remote_user: root
roles:
- dbsrvs
目錄樹

執(zhí)行結(jié)果
第一次websrvs

第二次websrvs和dbsrvs
