角色 role是ansible的一套規(guī)范
角色必須包含至少一個這樣的目錄丐怯,但是完全可以排除任何沒有使用的目錄液斜。在使用時混萝,每個目錄必須包含一個main.yml文件拜秧,其中包含相關(guān)內(nèi)容:
tasks目錄:
角色需要執(zhí)行的主任務(wù)文件放置在此目錄中,默認(rèn)的主任務(wù)文件名為main.yml老赤,當(dāng)調(diào)用角色時轮洋,默認(rèn)會執(zhí)行main.yml文件中的任務(wù),你也可以將其他需要執(zhí)行的任務(wù)文件通過include的方式包含在tasks/main.yml文件中抬旺。
handlers目錄:
當(dāng)角色需要調(diào)用handlers時弊予,默認(rèn)會在此目錄中的main.yml文件中查找對應(yīng)的handler
defaults目錄:
角色會使用到的變量可以寫入到此目錄中的main.yml文件中,通常开财,defaults/main.yml文件中的變量都用于設(shè)置默認(rèn)值汉柒,以便在你沒有設(shè)置對應(yīng)變量值時,變量有默認(rèn)的值可以使用责鳍,定義在defaults/main.yml文件中的變量的優(yōu)先級是最低的碾褂。
vars目錄:
角色會使用到的變量可以寫入到此目錄中的main.yml文件中,看到這里你肯定會有疑問历葛,vars/main.yml文件和defaults/main.yml文件的區(qū)別在哪里呢正塌?區(qū)別就是,defaults/main.yml文件中的變量的優(yōu)先級是最低的,而vars/main.yml文件中的變量的優(yōu)先級非常高乓诽,如果你只是想提供一個默認(rèn)的配置帜羊,那么你可以把對應(yīng)的變量定義在defaults/main.yml中,如果你想要確保別人在調(diào)用角色時鸠天,使用的值就是你指定的值讼育,則可以將變量定義在vars/main.yml中,因為定義在vars/main.yml文件中的變量的優(yōu)先級非常高稠集,所以其值比較難以覆蓋奶段。
meta目錄:
如果你想要賦予這個角色一些元數(shù)據(jù),則可以將元數(shù)據(jù)寫入到meta/main.yml文件中巍杈,這些元數(shù)據(jù)用于描述角色的相關(guān)屬性忧饭,比如 作者信息、角色主要作用等等筷畦,你也可以在meta/main.yml文件中定義這個角色依賴于哪些其他角色,或者改變角色的默認(rèn)調(diào)用設(shè)定刺洒,在之后會有一些實際的示例鳖宾,此處不用糾結(jié)。
templates目錄:
角色相關(guān)的模板文件可以放置在此目錄中逆航,當(dāng)使用角色相關(guān)的模板時鼎文,如果沒有指定路徑,會默認(rèn)從此目錄中查找對應(yīng)名稱的模板文件因俐。
files目錄:
角色可能會用到的一些其他文件可以放置在此目錄中拇惋,比如,當(dāng)你定義nginx角色時抹剩,需要配置https撑帖,那么相關(guān)的證書文件即可放置在此目錄中。
當(dāng)然澳眷,上述目錄并不全是必須的胡嘿,也就是說,如果你的角色并沒有相關(guān)的模板文件钳踊,那么角色目錄中并不用包含templates目錄衷敌,同理,其他目錄也一樣拓瞪,一般情況下缴罗,都至少會有一個tasks目錄。
測試:
[root@test1 tasks]# tree /etc/ansible/roles/
/etc/ansible/roles/
└── testrole
├── tasks
│ └── main.yml
└── test.yaml
[root@test1 testrole]# cat main.yml
- debug:
msg: "hello,role"
[root@test1 testrole]# cat test.yaml
---
- hosts: test2
roles:
- testrole
[root@test1 testrole]# ansible-playbook test.yaml
PLAY [test2] ********************************************************************************************************************************************************************************
TASK [Gathering Facts] **********************************************************************************************************************************************************************
ok: [test2]
TASK [testrole : debug] *********************************************************************************************************************************************************************
ok: [test2] => {
"msg": "hello,role"
}
PLAY RECAP **********************************************************************************************************************************************************************************
test2 : ok=2 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
其實祭埂,我們也可以為testvar變量設(shè)置默認(rèn)值面氓,這樣即使在調(diào)用角色時沒有傳入任何參數(shù),也有默認(rèn)的值可以使用,同時也不會在調(diào)用時因為沒有傳入對應(yīng)變量而報錯侧但,所以矢空,我們需要在testrole目錄中創(chuàng)建一個defaults目錄,并且創(chuàng)建defaults/main.yml文件禀横,defaults/main.yml文件內(nèi)容如下:
# cat testrole/defaults/main.yml
testvar: "role"
默認(rèn)情況下屁药,我們無法多次調(diào)用同一個角色,也就是說柏锄,如下playbook只會調(diào)用一次testrole角色:
方法一需要為角色設(shè)置allow_duplicates屬性酿箭,而此屬性需要設(shè)置在meta/main.yml文件中,所以我們需要在testrole中創(chuàng)建meta/main.yml文件趾娃,寫入如下內(nèi)容:
# cat testrole/meta/main.yml
allow_duplicates: true
假設(shè)現(xiàn)在testrole需要使用一些模板缭嫡,那么也可以直接將模板文件放到templates目錄中。
比如抬闷,testrole中需要使用一個名為test.conf.j2的模板文件妇蛀,那么我們就將test.conf.j2文件放置在testrole/templates/目錄中,test.conf.j2文件內(nèi)容如下
# cat testrole/templates/test.conf.j2
something in template;
{{ template_var }}
模板文件中使用到了 template_var變量笤成,我們可以為 template_var變量定義一個默認(rèn)變量
# cat testrole/defaults/main.yml
testvar: "test"
template_var: "template"
然后在testrole中评架,直接使用這個模板文件
# cat testrole/tasks/main.yml
- debug:
msg: "hello {{ testvar }}!"
- template:
src: test.conf.j2
dest: /opt/test.conf