研究生考試用書37B(Ansible PlayBook的中清單變量優先級分析及清單變量如何分離總結)

時間:2023-07-04 10:42:47



寫在前面

嗯,學習ansible高級特性,整理這部分筆記博文內容涉及 Ansible ploybook 中變量定義的基本原則不同位置定義變量的優先級 Demo如何實現變量和清單解耦食用方式: 大量Demo,所以適合收藏溫習查閱變量優先級需要有ansible基礎了解角色劇本基本結構能夠使用Ansible解決實際問題理解不足小伙伴幫忙指正

「 傍晚時分,你坐在屋檐下,看著天慢慢地黑下去,心里寂寞而凄涼,感到自己的生命被剝奪了。當時我是個年輕人,但我害怕這樣生活下去,衰老下去。在我看來,這是比死亡更可怕的事。--------王小波」



管理清單變量

描述變量的基本原則

在Ansible中,利用變量,可以編寫任務、角色和 playbook,使它們可重復使用并且靈活多變。變量可以指定不同系統之間的配置差異。ansilbe可以在許多不同的位置設置變量:


在角色的defaultsvars目錄中主機清單文件中,作為主機變量組變量Playbook或清單的 group_varshost_vars子目錄下的變量文件中 Play、角色任務

「在項目定義和管理變量時,做好規劃以遵循下列原則:」


保持簡單:盡管可以通過許多不同的?式定義 Ansible 變量,但盡量僅使用一兩種不同方式并且僅在幾個地方定義變量。不要重復:如果?組系統具有相同的配置,則將它們組織到?個組中,并在 group_vars 目錄下的文件中為它們設置清單變量。在可讀的小文件中組織變量:如果有一個包含許多主機組和變量的大型項目,請將變量拆分成多個文件。

變量優先級

當使用多種方式定義相同變量時,Ansible 將使用優先級規則為變量選取值。以下討論優先級從低到高


配置文件(ansible.cfg)命令行選項角色defaults變量host和group變量(主機變量和組變量)Play變量Extra變量(全局變量)

下面就這幾種變量一起簡單梳理下:


配置文件

配置文件的變量擁有最低的優先級,通過在ansible.cfg 中提供到的一個KV的鍵值對,我們看一個Demo


┌──[root@vms81.liruilongs.github.io]-[~/ansible]└─$cat ansible.cfg | grep remote_userremote_user=root┌──[root@vms81.liruilongs.github.io]-[~/ansible]└─$

這里的配置文件中的remote_user=root為連接受管機器的遠程用戶名,對應保存到ansible中的ansible_user變量中


┌──[root@vms81.liruilongs.github.io]-[~/ansible]└─$ansible vms82.liruilongs.github.io -m debug -a 'var=ansible_user' -i ./inventorys/hostsvms82.liruilongs.github.io | SUCCESS => { "ansible_user": "root"}

把配置文件中的變量刪除,


┌──[root@vms81.liruilongs.github.io]-[~/ansible]└─$sed -i '/remote_user=root/d' ansible.cfg

在次打印變量會提示變量沒有定義


┌──[root@vms81.liruilongs.github.io]-[~/ansible]└─$ansible vms82.liruilongs.github.io -m debug -a 'var=ansible_user' -i ./inventorys/hostsvms82.liruilongs.github.io | SUCCESS => { "ansible_user": "VARIABLE IS NOT DEFINED!"}

添加之后也可以正常打印


┌──[root@vms81.liruilongs.github.io]-[~/ansible]└─$sed '4a remote_user=root' ansible.cfg -i┌──[root@vms81.liruilongs.github.io]-[~/ansible]└─$ansible vms82.liruilongs.github.io -m debug -a 'var=ansible_user' -i ./inventorys/hostsvms82.liruilongs.github.io | SUCCESS => { "ansible_user": "root"}┌──[root@vms81.liruilongs.github.io]-[~/ansible]└─$

當然這里需要注意的是,當不指定主機清單的時候,默認情況下ansible會忽略帶有后綴的文件


┌──[root@vms81.liruilongs.github.io]-[~/ansible]└─$ansible-config dump | grep -i inventoryDEFAULT_HOST_LIST(/root/ansible/ansible.cfg) = [u'/root/ansible/inventory']DEFAULT_INVENTORY_PLUGIN_PATH(default) = [u'/root/.ansible/plugins/inventory', u'/usr/share/ansible/plugins/inventory']INVENTORY_ANY_UNPARSED_IS_FAILED(default) = FalseINVENTORY_CACHE_ENABLED(default) = FalseINVENTORY_CACHE_PLUGIN(default) = NoneINVENTORY_CACHE_PLUGIN_CONNECTION(default) = NoneINVENTORY_CACHE_PLUGIN_PREFIX(default) = ansible_factsINVENTORY_CACHE_TIMEOUT(default) = 3600INVENTORY_ENABLED(default) = ['host_list', 'script', 'auto', 'yaml', 'ini', 'toml']INVENTORY_EXPORT(default) = FalseINVENTORY_IGNORE_EXTS(default) = {{(BLACKLIST_EXTS ( '.orig', '.ini', '.cfg', '.retry'))}}INVENTORY_IGNORE_PATTERNS(default) = []INVENTORY_UNPARSED_IS_FAILED(default) = FalseVARIABLE_PRECEDENCE(default) = ['all_inventory', 'groups_inventory', 'all_plugins_inventory', 'all_plugins_play', 'groups_plugins_inventory', 'groups_plugins_play']┌──[root@vms81.liruilongs.github.io]-[~/ansible]└─$

命令行選項:

可在命令行中傳遞給ansible-playbook的選項(非 -e )具有最低優先級。這里講的主要是通過其他參數來定義變量,還是用我們之前定義的ansible_user變量


┌──[root@vms81.liruilongs.github.io]-[~/ansible]└─$ansible all -m debug -a "var=ansible_user"vms82.liruilongs.github.io | SUCCESS => { "ansible_user": "root"}┌──[root@vms81.liruilongs.github.io]-[~/ansible]└─$ansible all -m debug -a "var=ansible_user" -u liruilongvms82.liruilongs.github.io | SUCCESS => { "ansible_user": "liruilong"}

當然這里需要注意的是通過臨時命令的方式執行 debug 模塊.默認不會連接受管機,所以這里不會報錯,我們的 sanheyiwuyang 用戶是一個沒有被受管機定義的用戶。


┌──[root@vms81.liruilongs.github.io]-[~/ansible]└─$ansible all -m debug -a "var=ansible_user" -u sanheyiwuyangvms82.liruilongs.github.io | SUCCESS => { "ansible_user": "sanheyiwuyang"}┌──[root@vms81.liruilongs.github.io]-[~/ansible]└─$

角色default值:

role_name/defaults/ 文件中由角色設置的默認值具有非常低的優先級。相對于角色中的vars目錄下的變量,會覆蓋defaults變量值。這里我們還是用remote_user這個變量


先來新建一個角色


┌──[root@vms81.liruilongs.github.io]-[~/ansible]└─$ansible-galaxy init vars_demo --init-path=roles- Role vars_demo was created successfully┌──[root@vms81.liruilongs.github.io]-[~/ansible]└─$ansible-galaxy list | grep var- vars_demo, (unknown version)

編寫角色中的默認變量,這里我們定義遠程用戶名是一個沒有在受管機定義的sanheyiwuyang


┌──[root@vms81.liruilongs.github.io]-[~/ansible]└─$echo -e "ansible_user: sanheyiwuyang" > ./roles/vars_demo/defaults/main.yml┌──[root@vms81.liruilongs.github.io]-[~/ansible]└─$cat ./roles/vars_demo/defaults/main.ymlansible_user: sanheyiwuyang┌──[root@vms81.liruilongs.github.io]-[~/ansible]└─$

編寫角色任務


┌──[root@vms81.liruilongs.github.io]-[~/ansible]└─$vim ./roles/vars_demo/tasks/main.yml┌──[root@vms81.liruilongs.github.io]-[~/ansible]└─$cat ./roles/vars_demo/tasks/main.yml---# tasks file for vars_demo- name: default_vars demo debug: var: ansible_user┌──[root@vms81.liruilongs.github.io]-[~/ansible]└─$

編寫執行角色的劇本


┌──[root@vms81.liruilongs.github.io]-[~/ansible]└─$vim vars_demo.yaml┌──[root@vms81.liruilongs.github.io]-[~/ansible]└─$cat vars_demo.yaml---- name: vars_demo roles demo hosts: all roles: - vars_demo tasks: - name: show vars debug: var: ansible_user┌──[root@vms81.liruilongs.github.io]-[~/ansible]└─$

當前的ansible_user變量定義,我們可以看到,配置文件的優先級最低,其次是 命令行非(-e)的方式


┌──[root@vms81.liruilongs.github.io]-[~/ansible]└─$ansible-playbook vars_demo.yaml -u liruilongPLAY [vars_demo roles demo] ****************************************************************************************TASK [Gathering Facts] *********************************************************************************************fatal: [vms82.liruilongs.github.io]: UNREACHABLE! => {"changed": false, "msg": "Failed to connect to the host via ssh: Permission denied (publickey,gssapi-keyex,gssapi-with-mic,password).", "unreachable": true}PLAY RECAP *********************************************************************************************************vms82.liruilongs.github.io : ok=0 changed=0 unreachable=1 failed=0 skipped=0 rescued=0 ignored=0 ┌──[root@vms81.liruilongs.github.io]-[~/ansible]└─$

執行調用角色的劇本,報錯了,通過 -u 的方式指定liruilong用戶,但是角色中使用的并不是liruilong用戶,而是沒有被受管機定義的sanhewuyang用戶,因為命名行非-e的變量優先級小于角色中/roles/var_demo/default/main.yaml定義的變量,所以liruilong用戶被覆蓋,所以會報錯


修改 ./roles/vars_demo/defaults/main.yml中的ansible_user變量,我們也可以發現使用的是root用戶,而不是命令行的liruilong


┌──[root@vms81.liruilongs.github.io]-[~/ansible]└─$echo "ansible_user: root" > ./roles/vars_demo/defaults/main.yml┌──[root@vms81.liruilongs.github.io]-[~/ansible]└─$ansible-playbook vars_demo.yaml -u liruilongPLAY [vars_demo roles demo] ****************************************************************************************TASK [Gathering Facts] *********************************************************************************************ok: [vms82.liruilongs.github.io]TASK [vars_demo : default_vars demo] *******************************************************************************ok: [vms82.liruilongs.github.io] => { "ansible_user": "root"}TASK [show vars] ***************************************************************************************************ok: [vms82.liruilongs.github.io] => { "ansible_user": "root"}PLAY RECAP *********************************************************************************************************vms82.liruilongs.github.io : ok=3 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0┌──[root@vms81.liruilongs.github.io]-[~/ansible]└─$

主機變量和組變量:

關于主機變量和組變量這是相對應主機清單文件來講的,主機清單的定義方式有很多種,我們可以直接通過inventory文件定義,也可以創建 inventory目錄中的文件來定義,也可以在項目中指定目錄下定義,場景比較多,我們分別看下


以下列表從最低到最高列出了這些變量的確切優先順序:


直接在清單文件中或通過動態清單腳本設置的al組變量。直接在清單文件中或通過動態清單腳本設置的其他組變量。在inventory/group_vars/all文件或子目錄中設置的all組的變量。在項目的group_vars/all文件或子目錄中設置的all組的變量。在inventory/group_vars子目錄中設置的其他組變量。在項目的group_vars子目錄中設置的其他組變量。直接在清單文件中或通過動態清單腳本設置的主機變量。在inventory/host vars子目錄中設置的主機變量。在項目的host vars子目錄中設置的主機變量。主機facts和緩存的facts。

我們分別來看下:


直接在清單文件中或通過動態清單腳本設置的all組變量

┌──[root@vms81.liruilongs.github.io]-[~/ansible]└─$vim inventory/inventory┌──[root@vms81.liruilongs.github.io]-[~/ansible]└─$cat inventory/inventoryvms82.liruilongs.github.io[all:vars]ansible_user=liruilong

當前角色中的默認值為root


┌──[root@vms81.liruilongs.github.io]-[~/ansible]└─$cat ./roles/vars_demo/defaults/main.ymlansible_user: root┌──[root@vms81.liruilongs.github.io]-[~/ansible]└─$

通過劇本的執行我們可以看到all中的組變量優先級要大于default目錄下的變量


┌──[root@vms81.liruilongs.github.io]-[~/ansible]└─$ansible-playbook vars_demo.yamlPLAY [vars_demo roles demo] ****************************************************************************************TASK [Gathering Facts] *********************************************************************************************ok: [vms82.liruilongs.github.io]TASK [vars_demo : default_vars demo] *******************************************************************************ok: [vms82.liruilongs.github.io] => { "ansible_user": "liruilong"}TASK [show vars] ***************************************************************************************************ok: [vms82.liruilongs.github.io] => { "ansible_user": "liruilong"}PLAY RECAP *********************************************************************************************************vms82.liruilongs.github.io : ok=3 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0 ┌──[root@vms81.liruilongs.github.io]-[~/ansible]└─$

直接在清單文件中或通過動態清單腳本設置的其他組變量。

在上面的基礎上我們新建一個組變量[lb:vars]。定義ansible_user的值為root


┌──[root@vms81.liruilongs.github.io]-[~/ansible]└─$vim inventory/inventory┌──[root@vms81.liruilongs.github.io]-[~/ansible]└─$cat inventory/inventory[lb]vms82.liruilongs.github.io[lb:vars]ansible_user=root[all:vars]ansible_user=liruilong

執行劇本發現,通過ansible_user的值為root,說明覆蓋了all組中的定的變量


┌──[root@vms81.liruilongs.github.io]-[~/ansible]└─$vim inventory/inventory┌──[root@vms81.liruilongs.github.io]-[~/ansible]└─$ansible-playbook vars_demo.yamlPLAY [vars_demo roles demo] ****************************************************************************************TASK [Gathering Facts] *********************************************************************************************ok: [vms82.liruilongs.github.io]TASK [vars_demo : default_vars demo] *******************************************************************************ok: [vms82.liruilongs.github.io] => { "ansible_user": "root"}TASK [show vars] ***************************************************************************************************ok: [vms82.liruilongs.github.io] => { "ansible_user": "root"}PLAY RECAP *********************************************************************************************************vms82.liruilongs.github.io : ok=3 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0┌──[root@vms81.liruilongs.github.io]-[~/ansible]└─$

在inventory/group_vars/all文件或子目錄中設置的all組的變量

┌──[root@vms81.liruilongs.github.io]-[~/ansible]└─$mkdir -p inventory/group_vars┌──[root@vms81.liruilongs.github.io]-[~/ansible]└─$echo "ansible_user: liruilong" > inventory/group_vars/all

會發現inventory/group_vars/all覆蓋了上面的inventory/inventory定義的變量,ansible_user的值為liruilong


┌──[root@vms81.liruilongs.github.io]-[~/ansible]└─$ansible-playbook vars_demo.yamlPLAY [vars_demo roles demo] ****************************************************************************************TASK [Gathering Facts] *********************************************************************************************ok: [vms82.liruilongs.github.io]TASK [vars_demo : default_vars demo] *******************************************************************************ok: [vms82.liruilongs.github.io] => { "ansible_user": "liruilong"}TASK [show vars] ***************************************************************************************************ok: [vms82.liruilongs.github.io] => { "ansible_user": "liruilong"}PLAY RECAP *********************************************************************************************************vms82.liruilongs.github.io : ok=3 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0 ┌──[root@vms81.liruilongs.github.io]-[~/ansible]└─$

在項目的group_vars/all文件或子目錄中設置的all組的變量。

┌──[root@vms81.liruilongs.github.io]-[~/ansible]└─$mkdir group_vars┌──[root@vms81.liruilongs.github.io]-[~/ansible]└─$echo "ansible_user: root" > group_vars/all

我們會發現項目group_vars/all下面變量會覆蓋主機清單文件inventory/group_vars/all下的變量


┌──[root@vms81.liruilongs.github.io]-[~/ansible]└─$ansible-playbook vars_demo.yamlPLAY [vars_demo roles demo] ****************************************************************************************TASK [Gathering Facts] *********************************************************************************************ok: [vms82.liruilongs.github.io]TASK [vars_demo : default_vars demo] *******************************************************************************ok: [vms82.liruilongs.github.io] => { "ansible_user": "root"}TASK [show vars] ***************************************************************************************************ok: [vms82.liruilongs.github.io] => { "ansible_user": "root"}PLAY RECAP *********************************************************************************************************vms82.liruilongs.github.io : ok=3 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0 ┌──[root@vms81.liruilongs.github.io]-[~/ansible]└─$

在inventory/group_vars子目錄中設置的其他組變量

這里需要說明的是,創建lb組變量inventory/group_vars/lb.yaml文件的前提是,需要在inventory/inventory文件中定義分組


┌──[root@vms81.liruilongs.github.io]-[~/ansible]└─$cat ./inventory/inventory[lb]vms82.liruilongs.github.io

可以看到在inventory/group_vars/lb.yaml文件中定義覆蓋了


┌──[root@vms81.liruilongs.github.io]-[~/ansible]└─$echo "ansible_user: liruilong" > inventory/group_vars/lb.yaml┌──[root@vms81.liruilongs.github.io]-[~/ansible]└─$ansible-playbook vars_demo.yamlPLAY [vars_demo roles demo] ****************************************************************************************TASK [Gathering Facts] *********************************************************************************************ok: [vms82.liruilongs.github.io]TASK [vars_demo : default_vars demo] *******************************************************************************ok: [vms82.liruilongs.github.io] => { "ansible_user": "liruilong"}TASK [show vars] ***************************************************************************************************ok: [vms82.liruilongs.github.io] => { "ansible_user": "liruilong"}PLAY RECAP *********************************************************************************************************vms82.liruilongs.github.io : ok=3 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0 ┌──[root@vms81.liruilongs.github.io]-[~/ansible]└─$

在項目的group_vars子目錄中設置的其他組變量

可以看到項目的./group_vars/lb.yaml的變量優先級要高于inventory/group_vars/lb.yaml下的


┌──[root@vms81.liruilongs.github.io]-[~/ansible]└─$echo "ansible_user: root" > ./group_vars/lb.yaml┌──[root@vms81.liruilongs.github.io]-[~/ansible]└─$ansible-playbook vars_demo.yamlPLAY [vars_demo roles demo] ****************************************************************************************TASK [Gathering Facts] *********************************************************************************************ok: [vms82.liruilongs.github.io]TASK [vars_demo : default_vars demo] *******************************************************************************ok: [vms82.liruilongs.github.io] => { "ansible_user": "root"}TASK [show vars] ***************************************************************************************************ok: [vms82.liruilongs.github.io] => { "ansible_user": "root"}PLAY RECAP *********************************************************************************************************vms82.liruilongs.github.io : ok=3 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0 ┌──[root@vms81.liruilongs.github.io]-[~/ansible]└─$

前面我們分析的都是組變量,下面下面我們看看主機變量


直接在清單文件中或通過動態清單腳本設置的主機變量

┌──[root@vms81.liruilongs.github.io]-[~/ansible]└─$sed "s/vms82.liruilongs.github.io/& ansible_user=liruilong/" ./inventory/inventory[lb]vms82.liruilongs.github.io ansible_user=liruilong[lb:vars]ansible_user=root[all:vars]ansible_user=liruilong┌──[root@vms81.liruilongs.github.io]-[~/ansible]└─$sed "s/vms82.liruilongs.github.io/& ansible_user=liruilong/" ./inventory/inventory -i

設置主機變量為ansible_user=liruilong優先級大于上面的組變量


┌──[root@vms81.liruilongs.github.io]-[~/ansible]└─$ansible-playbook vars_demo.yamlPLAY [vars_demo roles demo] ****************************************************************************************TASK [Gathering Facts] *********************************************************************************************ok: [vms82.liruilongs.github.io]TASK [vars_demo : default_vars demo] *******************************************************************************ok: [vms82.liruilongs.github.io] => { "ansible_user": "liruilong"}TASK [show vars] ***************************************************************************************************ok: [vms82.liruilongs.github.io] => { "ansible_user": "liruilong"}PLAY RECAP *********************************************************************************************************vms82.liruilongs.github.io : ok=3 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0 ┌──[root@vms81.liruilongs.github.io]-[~/ansible]└─$

在inventory/host_vars子目錄中設置的主機變量

┌──[root@vms81.liruilongs.github.io]-[~/ansible]└─$mkdir inventory/host_vars┌──[root@vms81.liruilongs.github.io]-[~/ansible]└─$echo "ansible_user: root" > inventory/host_vars/vms82.liruilongs.github.io.yaml

inventory/host_vars子目錄中設置的主機變量優先級大于./inventory/inventory 中的主機變量


┌──[root@vms81.liruilongs.github.io]-[~/ansible]└─$ansible-playbook vars_demo.yamlPLAY [vars_demo roles demo] ****************************************************************************************TASK [Gathering Facts] *********************************************************************************************ok: [vms82.liruilongs.github.io]TASK [vars_demo : default_vars demo] *******************************************************************************ok: [vms82.liruilongs.github.io] => { "ansible_user": "root"}TASK [show vars] ***************************************************************************************************ok: [vms82.liruilongs.github.io] => { "ansible_user": "root"}PLAY RECAP *********************************************************************************************************vms82.liruilongs.github.io : ok=3 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0┌──[root@vms81.liruilongs.github.io]-[~/ansible]└─$

在項目的host_vars子目錄中設置的主機變量

┌──[root@vms81.liruilongs.github.io]-[~/ansible]└─$mkdir host_vars┌──[root@vms81.liruilongs.github.io]-[~/ansible]└─$echo "ansible_user: liruilong" > host_vars/vms82.liruilongs.github.io.yaml

項目的host_vars子目錄中設置的主機變量優先級大于清單host_vars子目錄的變量


┌──[root@vms81.liruilongs.github.io]-[~/ansible]└─$ansible-playbook vars_demo.yamlPLAY [vars_demo roles demo] ****************************************************************************************TASK [Gathering Facts] *********************************************************************************************ok: [vms82.liruilongs.github.io]TASK [vars_demo : default_vars demo] *******************************************************************************ok: [vms82.liruilongs.github.io] => { "ansible_user": "liruilong"}TASK [show vars] ***************************************************************************************************ok: [vms82.liruilongs.github.io] => { "ansible_user": "liruilong"}PLAY RECAP *********************************************************************************************************vms82.liruilongs.github.io : ok=3 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0 ┌──[root@vms81.liruilongs.github.io]-[~/ansible]└─$

主機facts和緩存的facts

主機facts,可以看到set_fact設置的變量具有最高的優先級


┌──[root@vms81.liruilongs.github.io]-[~/ansible]└─$cat vars_demo.yaml---- name: vars_demo roles demo hosts: all roles: - vars_demo tasks: - name: show vars debug: var: ansible_user - name: set fact ansible_user set_fact: ansible_user: root - name: show vars debug: var: ansible_user

┌──[root@vms81.liruilongs.github.io]-[~/ansible]└─$ansible-playbook vars_demo.yamlPLAY [vars_demo roles demo] ****************************************************************************************TASK [Gathering Facts] *********************************************************************************************ok: [vms82.liruilongs.github.io]TASK [vars_demo : default_vars demo] *******************************************************************************ok: [vms82.liruilongs.github.io] => { "ansible_user": "liruilong"}TASK [show vars] ***************************************************************************************************ok: [vms82.liruilongs.github.io] => { "ansible_user": "liruilong"}TASK [set fact ansible_user] ***************************************************************************************ok: [vms82.liruilongs.github.io]TASK [show vars] ***************************************************************************************************ok: [vms82.liruilongs.github.io] => { "ansible_user": "root"}PLAY RECAP *********************************************************************************************************vms82.liruilongs.github.io : ok=5 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0

對于其他的一些通過gather_facts收集的變量,相對于劇本之外具有很高的優先級


相對于清單inventory的group_varshost_vars子目錄與相對于 playbook 項目的子目錄之間的優先級比較好區分,相同類型,項目下總是比清單里的優先級要高,。


如果在 playbook 的相同目錄中有group_vars 和 host_vars子目錄,則這些組和主機變量將被自動包含在內。


簡單總結一下ansible清單文件變量優先級。在facts優先級最高,其次是主機變量,包含清單變量文件的host_vars目錄和inventory清單變量目錄和inventory文件,項目下要高于清單目錄下,清單目錄要高于清單文件,之后是組變量,group_vars目錄下的文件,inventory清單變量目錄,inventory文件,整體上,inventory文件優先級小于目錄下的優先級,同樣是inventory目錄下要小于項目目錄下。


Play 變量:

準備工作,我們還用之前的角色和劇本


┌──[root@vms81.liruilongs.github.io]-[~/ansible]└─$cat vars_demo.yaml---- name: vars_demo roles demo hosts: all roles: - vars_demo tasks: - name: show vars debug: var: ansible_user - name: show vars debug: var: ansible_user┌──[root@vms81.liruilongs.github.io]-[~/ansible]└─$ansible-playbook vars_demo.yamlPLAY [vars_demo roles demo] ****************************************************************************************TASK [Gathering Facts] *********************************************************************************************ok: [vms82.liruilongs.github.io]TASK [vars_demo : default_vars demo] *******************************************************************************ok: [vms82.liruilongs.github.io] => { "ansible_user": "liruilong"}TASK [show vars] ***************************************************************************************************ok: [vms82.liruilongs.github.io] => { "ansible_user": "liruilong"}TASK [show vars] ***************************************************************************************************ok: [vms82.liruilongs.github.io] => { "ansible_user": "liruilong"}PLAY RECAP *********************************************************************************************************vms82.liruilongs.github.io : ok=4 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0

Play 的優先級高于主機或組變量、角色默認值,除 -e 以外的命令行選項。以下列表從最低到最高列出了這些變量的優先順序:


play 的 vars 部分進行設置。通過 play 中的 vars_prompt 部分提示用戶來進行設置。通過 play 的 vars_files 部分從外部文件列表進行設置。由角色的 rolename/vars/ 子目錄中的文件進行設置。通過這個塊的 vars 部分為當前的 block 進行設置。通過這個任務的 vars 部分為當前的任務進行設置。通過 include_vars 模塊動態加載。通過使用 set_fact 模塊或通過使用 register 記錄任務在主機上執行的結果,為特定的主機進行設置。在 play 的 role 部分加載時或通過使用 include_role 模塊 playbook 中為角色設置的參數。由 vars 部分為通過 include_tasks 模塊包含的任務進行設置。

我們分別梳理下:


由 play 的 vars 部分進行設置。

---- name: vars_demo roles demo hosts: all vars: ansible_user: root roles: - vars_demo tasks: - name: show vars debug: var: ansible_user - name: show vars debug: var: ansible_user

play 的 vars 部分進行設置的變量要高于前面設置的變量


┌──[root@vms81.liruilongs.github.io]-[~/ansible]└─$ansible-playbook vars_demo.yamlPLAY [vars_demo roles demo] ****************************************************************************************TASK [Gathering Facts] *********************************************************************************************ok: [vms82.liruilongs.github.io]TASK [vars_demo : default_vars demo] *******************************************************************************ok: [vms82.liruilongs.github.io] => { "ansible_user": "root"}TASK [show vars] ***************************************************************************************************ok: [vms82.liruilongs.github.io] => { "ansible_user": "root"}TASK [show vars] ***************************************************************************************************ok: [vms82.liruilongs.github.io] => { "ansible_user": "root"}PLAY RECAP *********************************************************************************************************vms82.liruilongs.github.io : ok=4 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0

通過 play 中的vars_prompt部分提示用戶來進行設置

---- name: vars_demo roles demo hosts: all vars: ansible_user: root vars_prompt: - name: ansible_user prompt: "input ansible_user name" roles: - vars_demo tasks: - name: show vars debug: var: ansible_user - name: show vars debug: var: ansible_user

這里默認情況下輸入數據是不顯示,可以添加參數private: no來顯示輸入變量值


┌──[root@vms81.liruilongs.github.io]-[~/ansible]└─$ansible-playbook vars_demo.yamlinput ansible_user name:PLAY [vars_demo roles demo] ****************************************************************************************TASK [Gathering Facts] *********************************************************************************************ok: [vms82.liruilongs.github.io]TASK [vars_demo : default_vars demo] *******************************************************************************ok: [vms82.liruilongs.github.io] => { "ansible_user": "liruilong"}TASK [show vars] ***************************************************************************************************ok: [vms82.liruilongs.github.io] => { "ansible_user": "liruilong"}TASK [show vars] ***************************************************************************************************ok: [vms82.liruilongs.github.io] => { "ansible_user": "liruilong"}PLAY RECAP *********************************************************************************************************vms82.liruilongs.github.io : ok=4 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0

通過 play 的 vars_files 部分從外部文件列表進行設置

---- name: vars_demo roles demo hosts: all vars: ansible_user: root vars_files: - vars_files vars_prompt: - name: ansible_user prompt: "input ansible_user name" private: no roles: - vars_demo tasks: - name: show vars debug: var: ansible_user - name: show vars debug: var: ansible_user

定義引入的變量文件


┌──[root@vms81.liruilongs.github.io]-[~/ansible]└─$echo "ansible_user: liruilong" > vars_files

執行劇本,可以看到我們輸入的是root但是打印的是liruilong,即vars_files的優先級高于vars_prompt


┌──[root@vms81.liruilongs.github.io]-[~/ansible]└─$ansible-playbook vars_demo.yamlinput ansible_user name: rootPLAY [vars_demo roles demo] ****************************************************************************************TASK [Gathering Facts] *********************************************************************************************ok: [vms82.liruilongs.github.io]TASK [vars_demo : default_vars demo] *******************************************************************************ok: [vms82.liruilongs.github.io] => { "ansible_user": "liruilong"}TASK [show vars] ***************************************************************************************************ok: [vms82.liruilongs.github.io] => { "ansible_user": "liruilong"}TASK [show vars] ***************************************************************************************************ok: [vms82.liruilongs.github.io] => { "ansible_user": "liruilong"}PLAY RECAP *********************************************************************************************************vms82.liruilongs.github.io : ok=4 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0

由角色的rolename/vars/子目錄中的文件進行設置

當前劇本執行返回的變量值為 liruilong,我們定義roles/vars_demo/vars/main.yml目錄的ansible_user變量為root.執行劇本


┌──[root@vms81.liruilongs.github.io]-[~/ansible]└─$echo "ansible_user: root" > roles/vars_demo/vars/main.yml┌──[root@vms81.liruilongs.github.io]-[~/ansible]└─$ansible-playbook vars_demo.yamlPLAY [vars_demo roles demo] ****************************************************************************************TASK [Gathering Facts] *********************************************************************************************ok: [vms82.liruilongs.github.io]TASK [vars_demo : default_vars demo] *******************************************************************************ok: [vms82.liruilongs.github.io] => { "ansible_user": "root"}TASK [show vars] ***************************************************************************************************ok: [vms82.liruilongs.github.io] => { "ansible_user": "root"}TASK [show vars] ***************************************************************************************************ok: [vms82.liruilongs.github.io] => { "ansible_user": "root"}PLAY RECAP *********************************************************************************************************vms82.liruilongs.github.io : ok=4 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0

通過這個任務塊的 vars 部分為當前的 block 進行設置。

---- name: vars_demo roles demo hosts: all roles: - vars_demo tasks: - block: - name: show vars in block debug: var: ansible_user vars: ansible_user: liruilong - name: show vars debug: var: ansible_user

我們可以看到,在block所在的塊的內部,通過vars定義的變量具有最高的優先級,打印的ansible_usern的變量的為liruilong,而在劇本的其他位置的打印的變量為root


┌──[root@vms81.liruilongs.github.io]-[~/ansible]└─$ansible-playbook var_demos.yamlPLAY [vars_demo roles demo] ****************************************************************TASK [Gathering Facts] *********************************************************************ok: [vms82.liruilongs.github.io]TASK [vars_demo : default_vars demo] *******************************************************ok: [vms82.liruilongs.github.io] => { "ansible_user": "root"}TASK [show vars in block] ******************************************************************ok: [vms82.liruilongs.github.io] => { "ansible_user": "liruilong"}TASK [show vars] ***************************************************************************ok: [vms82.liruilongs.github.io] => { "ansible_user": "root"}PLAY RECAP *********************************************************************************vms82.liruilongs.github.io : ok=4 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0

show vars任務為角色中的任務,所以依舊使用角色中的vars/main.yml定義root。


通過這個任務的 vars 部分為當前的任務進行設置

即不是寫在block塊內的vars變量,而是寫在對應 任務中的vars的變量中


---- name: vars_demo roles demo hosts: all roles: - vars_demo tasks: - block: - name: show vars in block debug: var: ansible_user vars: ansible_user: root - name: show vars in block no vars debug: var: ansible_user vars: ansible_user: liruilong

執行我們可以看到在block內部,任務內部的變量優先級要高于任務外部的變量。


┌──[root@vms81.liruilongs.github.io]-[~/ansible]└─$ansible-playbook vars_demo.yamlPLAY [vars_demo roles demo] ****************************************************************TASK [Gathering Facts] *********************************************************************ok: [vms82.liruilongs.github.io]TASK [vars_demo : default_vars demo] *******************************************************ok: [vms82.liruilongs.github.io] => { "ansible_user": "root"}TASK [show vars in block] ******************************************************************ok: [vms82.liruilongs.github.io] => { "ansible_user": "root"}TASK [show vars in block no vars] *********************************************************ok: [vms82.liruilongs.github.io] => { "ansible_user": "liruilong"}PLAY RECAP *********************************************************************************vms82.liruilongs.github.io : ok=4 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0

通過 include_vars 模塊動態加載

ansible中,我們可以使用include_vars模塊來加載外部的變量。加載方式很簡單,和通過 play 的 vars_files 部分從外部文件列表進行設置很類似。


---- name: vars_demo roles demo hosts: all roles: - vars_demo tasks: - block: - name: show vars in block debug: var: ansible_user vars: ansible_user: root - name: show vars in block no vars debug: var: ansible_user vars: ansible_user: liruilong - name: show vars debug: var: ansible_user - name: include_vars vars file include_vars: file: vars_files - name: show vars after include vars files debug: var: ansible_user

但是變量的優先級還是有很大的區別的,我們先把include_vars模塊放到最后看看。


┌──[root@vms81.liruilongs.github.io]-[~/ansible]└─$cat vars_filesansible_user: liruilong┌──[root@vms81.liruilongs.github.io]-[~/ansible]└─$ansible-playbook vars_demo.yamlPLAY [vars_demo roles demo] ****************************************************************TASK [Gathering Facts] *********************************************************************ok: [vms82.liruilongs.github.io]TASK [vars_demo : default_vars demo] *******************************************************ok: [vms82.liruilongs.github.io] => { "ansible_user": "root"}TASK [show vars in block] ******************************************************************ok: [vms82.liruilongs.github.io] => { "ansible_user": "root"}TASK [show vars in block no vars] *********************************************************ok: [vms82.liruilongs.github.io] => { "ansible_user": "liruilong"}TASK [show vars] ***************************************************************************ok: [vms82.liruilongs.github.io] => { "ansible_user": "root"}TASK [include_vars vars file] **************************************************************ok: [vms82.liruilongs.github.io]TASK [show vars after include vars files] **************************************************ok: [vms82.liruilongs.github.io] => { "ansible_user": "liruilong"}PLAY RECAP *********************************************************************************vms82.liruilongs.github.io : ok=7 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0

發現模塊執行前是沒有變化的,只會影響執行后的。


---- name: vars_demo roles demo hosts: all roles: - vars_demo tasks: - name: include_vars vars file include_vars: file: vars_files - block: - name: show vars in block debug: var: ansible_user vars: ansible_user: root - name: show vars in block no vars debug: var: ansible_user vars: ansible_user: liruilong - name: show vars debug: var: ansible_user - name: show vars after include vars files debug: var: ansible_user

include_vars模塊放到最前面,我們發現劇本中變量全部被替換為liruilong了,除了角色變量,因為劇本中,角色最先執行。


┌──[root@vms81.liruilongs.github.io]-[~/ansible]└─$ansible-playbook vars_demo.yamlPLAY [vars_demo roles demo] ****************************************************************TASK [Gathering Facts] *********************************************************************ok: [vms82.liruilongs.github.io]TASK [vars_demo : default_vars demo] *******************************************************ok: [vms82.liruilongs.github.io] => { "ansible_user": "root"}TASK [include_vars vars file] **************************************************************ok: [vms82.liruilongs.github.io]TASK [show vars in block] ******************************************************************ok: [vms82.liruilongs.github.io] => "ansible_user": "liruilong"}TASK [show vars in block no vars] *********************************************************ok: [vms82.liruilongs.github.io] => { "ansible_user": "liruilong"}TASK [show vars] ***************************************************************************ok: [vms82.liruilongs.github.io] => { "ansible_user": "liruilong"}TASK [show vars after include vars files] **************************************************ok: [vms82.liruilongs.github.io] => { "ansible_user": "liruilong"}PLAY RECAP *********************************************************************************vms82.liruilongs.github.io : ok=7 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0

通過使用 set_fact 模塊或通過使用register記錄任務在主機上執行的結果,為特定的主機進行設置。

---- name: vars_demo roles demo hosts: all roles: - vars_demo tasks: - name: set facts set_fact: ansible_user: root - name: include_vars vars file include_vars: file: vars_files - block: - name: show vars in block debug: var: ansible_user vars: ansible_user: root - name: show vars in block no vars debug: var: ansible_user vars: ansible_user: liruilong - name: show vars debug: var: ansible_user - name: show vars after include vars files debug: var: ansible_user

嗯,不多解釋。


┌──[root@vms81.liruilongs.github.io]-[~/ansible]└─$ansible-playbook vars_demo.yamlPLAY [vars_demo roles demo] ****************************************************************TASK [Gathering Facts] *********************************************************************ok: [vms82.liruilongs.github.io]TASK [vars_demo : default_vars demo] *******************************************************ok: [vms82.liruilongs.github.io] => { "ansible_user": "root"}TASK [set facts] ***************************************************************************ok: [vms82.liruilongs.github.io]TASK [include_vars vars file] **************************************************************ok: [vms82.liruilongs.github.io]TASK [show vars in block] ******************************************************************ok: [vms82.liruilongs.github.io] => { "ansible_user": "root"}TASK [show vars in block no vars] *********************************************************ok: [vms82.liruilongs.github.io] => { "ansible_user": "root"}TASK [show vars] ***************************************************************************ok: [vms82.liruilongs.github.io] => { "ansible_user": "root"}TASK [show vars after include vars files] **************************************************ok: [vms82.liruilongs.github.io] => { "ansible_user": "root"}PLAY RECAP *********************************************************************************vms82.liruilongs.github.io : ok=8 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0

在 play 的 role 部分加載時或通過使用 include_role 模塊playbook中為角色設置的參數。

---- name: vars_demo roles demo hosts: all roles: - role: vars_demo ansible_user: liruilong tasks: - name: set facts set_fact: ansible_user: root - name: include_vars vars file include_vars: file: vars_files - block: - name: show vars in block debug: var: ansible_user vars: ansible_user: root - name: show vars in block no vars debug: var: ansible_user vars: ansible_user: liruilong - name: show vars debug: var: ansible_user - name: show vars after include vars files debug: var: ansible_user

劇本設置角色變量后,角色內置的變量被覆蓋掉,但是只對當前角色生效


┌──[root@vms81.liruilongs.github.io]-[~/ansible]└─$ansible-playbook vars_demo.yamlPLAY [vars_demo roles demo] ****************************************************************************TASK [Gathering Facts] *********************************************************************************ok: [vms82.liruilongs.github.io]TASK [vars_demo : default_vars demo] *******************************************************************ok: [vms82.liruilongs.github.io] => { "ansible_user": "liruilong"}TASK [set facts] ***************************************************************************************ok: [vms82.liruilongs.github.io]TASK [include_vars vars file] **************************************************************************ok: [vms82.liruilongs.github.io]TASK [show vars in block] ******************************************************************************ok: [vms82.liruilongs.github.io] => { "ansible_user": "root"}TASK [show vars in block no vars] *********************************************************************ok: [vms82.liruilongs.github.io] => { "ansible_user": "root"}TASK [show vars] ***************************************************************************************ok: [vms82.liruilongs.github.io] => { "ansible_user": "root"}TASK [show vars after include vars files] **************************************************************ok: [vms82.liruilongs.github.io] => { "ansible_user": "root"}PLAY RECAP *********************************************************************************************vms82.liruilongs.github.io : ok=8 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0

或者也可以


---- name: vars_demo roles demo hosts: all # roles: # - role: vars_demo # ansible_user: liruilong tasks: - name: include role include_role: name: vars_demo vars: ansible_user: liruilong - name: set facts set_fact: ansible_user: root - name: include_vars vars file include_vars: file: vars_files - block: - name: show vars in block debug: var: ansible_user vars: ansible_user: root - name: show vars in block no vars debug: var: ansible_user vars: ansible_user: liruilong - name: show vars debug: var: ansible_user - name: show vars after include vars files debug: var: ansible_user

┌──[root@vms81.liruilongs.github.io]-[~/ansible]└─$ansible-playbook vars_demo.yamlPLAY [vars_demo roles demo] ****************************************************************************TASK [Gathering Facts] *********************************************************************************ok: [vms82.liruilongs.github.io]TASK [include role] ************************************************************************************TASK [vars_demo : default_vars demo] *******************************************************************ok: [vms82.liruilongs.github.io] => { "ansible_user": "liruilong"}TASK [set facts] ***************************************************************************************ok: [vms82.liruilongs.github.io]TASK [include_vars vars file] **************************************************************************ok: [vms82.liruilongs.github.io]TASK [show vars in block] ******************************************************************************ok: [vms82.liruilongs.github.io] => { "ansible_user": "root"}TASK [show vars in block no vars] *********************************************************************ok: [vms82.liruilongs.github.io] => { "ansible_user": "root"}TASK [show vars] ***************************************************************************************ok: [vms82.liruilongs.github.io] => { "ansible_user": "root"}TASK [show vars after include vars files] **************************************************************ok: [vms82.liruilongs.github.io] => { "ansible_user": "root"}PLAY RECAP *********************************************************************************************vms82.liruilongs.github.io : ok=8 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0

由 vars 部分為通過 include_tasks 模塊包含的任務進行設置

---- name: vars_demo roles demo hosts: all # roles: # - role: vars_demo # ansible_user: liruilong tasks: - name: include_tasks demo include_tasks: task.yaml vars: ansible_user: root - name: include role...

┌──[root@vms81.liruilongs.github.io]-[~/ansible]└─$cat task.yaml- name: vars demo 2 debug: var: ansible_user┌──[root@vms81.liruilongs.github.io]-[~/ansible]└─$ansible-playbook vars_demo.yamlPLAY [vars_demo roles demo] ****************************************************************************TASK [Gathering Facts] *********************************************************************************ok: [vms82.liruilongs.github.io]TASK [include_tasks demo] ******************************************************************************included: /root/ansible/task.yaml for vms82.liruilongs.github.ioTASK [vars demo 2] *************************************************************************************ok: [vms82.liruilongs.github.io] => { "ansible_user": "root"}....

Extra變量(-e 命令或者--extra-vars)

使用 ansible-playbook 命令的 -e 選項設置的額外變量始終具有最高的優先級?;蛘?/span>--extra-vars也可以以JSON形式定義


┌──[root@vms81.liruilongs.github.io]-[~/ansible]└─$ansible vms82.liruilongs.github.io -m debug -a 'var=ansible_user'vms82.liruilongs.github.io | SUCCESS => { "ansible_user": "root"}┌──[root@vms81.liruilongs.github.io]-[~/ansible]└─$ansible all -m debug -a "var=ansible_user" --extra-vars "{'ansible_user':'liruilong'}"vms82.liruilongs.github.io | SUCCESS => { "ansible_user": "liruilong"}┌──[root@vms81.liruilongs.github.io]-[~/ansible]└─$ansible all -m debug -a "var=ansible_user" --e "{'ansible_user':'liruilong'}"vms82.liruilongs.github.io | SUCCESS => { "ansible_user": "liruilong"}

可以發現當使用 --extra-vars 在命令行定義變量的時候,會覆蓋ansible.cfg 的變量配置,使用了liruilong這個受管機用戶


將變量與清單分離

隨著環境在規模和種類上擴展,清單文件會變得很大且難以閱讀。


更好的做法是將變量定義從清單文件轉移到單獨的變量文件中,每個主機組分別對應一個,每個變量文件都已主機組命令,且包含該主機組的變量定義:


在這里插入圖片描述


對于多樣化的大型化環境而言,更好的方法是在group_vars目錄下為每個主機組創建子目錄:


┌──[root@vms82.liruilongs.github.io]-[~/inventory-variables]└─$lsansible.cfg deploy_haproxy.yml group_vars rolesdeploy_apache.yml deploy_webapp.yml inventory.yml site.yml┌──[root@vms82.liruilongs.github.io]-[~/inventory-variables]└─$cd group_vars/┌──[root@vms82.liruilongs.github.io]-[~/inventory-variables/group_vars]└─$tree.├── lb_servers│ ├── firewall.yml│ └── haproxy.yml└── web_servers2 directories, 2 files

在這里插入圖片描述


group_vars 目錄下各目錄的文件中存在的所有變量都與其余變量合并在?起。通過將變量分隔到按功能分組的文件中,可以使整個 playbook 項目更易于理解和維護。


在這里插入圖片描述


特殊清單變量

可以使用多個變量來更改Ansible連接到清單中列出的主機的方式。其中?些對于主機特定變量最為有用,但另?些可能與組中或清單中的所有主機相關。


ansible_connection:主機的連接類型,用于訪問受管主機的連接插件。默認情況下,ssh 用于除 localhost 外的所有主機,后者使用 local。


┌──[root@vms81.liruilongs.github.io]-[~/ansible]└─$ansible all -m debug -a "msg={{ansible_connection}}"vms82.liruilongs.github.io | SUCCESS => { "msg": "ssh"}┌──[root@vms81.liruilongs.github.io]-[~/ansible]└─$ansible 127.0.0.1 -m debug -a "msg={{ansible_connection}}"127.0.0.1 | SUCCESS => { "msg": "local"}

ansible_host:要連接的主機名稱。實際 IP 地址或完全限定域名,在連接受管主機時使用,而不使來用自清單文件(inventory_hostname) 中的名稱。默認情況下,此變量具有與清單主機名相同的值。


┌──[root@vms81.liruilongs.github.io]-[~/ansible]└─$ansible all -m debug -a "msg={{ansible_host}}"vms82.liruilongs.github.io | SUCCESS => { "msg": "vms82.liruilongs.github.io"}ansible_port:Ansible 用于連接受管主機的端口。對于(默認)SSH 連接插件,其值默認為 22。ansible_user:Ansible 以此用戶身份連接受管主機。作為 Ansible 的默認行為,它會使用與控制節點上運行 Ansible Playbook 的用戶相同的用戶名來連接受管主機。ansible_become_user:Ansible 連接到受管主機后,它將使用 ansible_become_method(默認情況下為sudo)切換到此用戶。ansible_python_interpreter:Ansible 應在受管主機上使用的 Python 可執行文件的路徑。

系統變量:通過劇本的gather_facts=yes自動搜集(默認調用setup模塊),對任務主機有效,系統指標


┌──[root@vms81.liruilongs.github.io]-[~/ansible]└─$ansible all -m setup

使用變量識別當前主機

ansible魔法變量,指的是ansible為管理目的而預設的特殊變量,通過adhoc方式或者playbook方式,都可以調用/或者msg查看


inventory_hostname:當前正在處理的受管主機的名稱,從清單中獲取。ansible_host:用于連接受管主機的實際 IP 地址或主機名。ansible_facts['hostname']:作為事實,從受管主機手機的完全限定域名。ansible_play_hosts:當前 Play 期間尚未失敗的所有主機的列表。

┌──[root@vms81.liruilongs.github.io]-[~/ansible]└─$ansible all -m debug -a "var=hostvars"vms82.liruilongs.github.io | SUCCESS => { "hostvars": { "vms82.liruilongs.github.io": { "ansible_check_mode": false, "ansible_diff_mode": false, "ansible_facts": {}, "ansible_forks": 5, "ansible_inventory_sources": [ "/root/ansible/inventory" ], "ansible_playbook_python": "/usr/bin/python2", "ansible_user": "liruilong", "ansible_verbosity": 0, "ansible_version": { "full": "2.9.25", "major": 2, "minor": 9, "revision": 25, "string": "2.9.25" }, "group_names": [ "lb" ], "groups": { "all": [ "vms82.liruilongs.github.io" ], "lb": [ "vms82.liruilongs.github.io" ], "ungrouped": [] }, "inventory_dir": "/root/ansible/inventory", "inventory_file": "/root/ansible/inventory/hosts", "inventory_hostname": "vms82.liruilongs.github.io", "inventory_hostname_short": "vms82", "omit": "__omit_place_holder__fbd943e37b3564fcd7926f8926da009ae4e9e4ab", "playbook_dir": "/root/ansible" } }}

一個完整的Demo

嗯,我們來看一個具體的Demo,這Demo是之前的博文用到,看一下如何從現有的ansible項目中抽取變量來實現劇本的可復用,可維護


這是原本的結構目錄


┌──[root@vms81.liruilongs.github.io]-[~/ansible/inventory-variables]└─$tree.├── ansible.cfg├── deploy_apache.yml├── deploy_haproxy.yml├── deploy_webapp.yml├── inventory.yml├── roles│ ├── apache│ │ ├── meta│ │ │ └── main.yml│ │ ├── tasks│ │ │ └── main.yml│ │ └── tests│ │ ├── inventory│ │ └── test.yml│ ├── firewall│ │ ├── defaults│ │ │ └── main.yml│ │ ├── handlers│ │ │ └── main.yml│ │ ├── meta│ │ │ └── main.yml│ │ ├── tasks│ │ │ └── main.yml│ │ └── tests│ │ ├── inventory│ │ └── test.yml│ ├── haproxy│ │ ├── defaults│ │ │ └── main.yml│ │ ├── handlers│ │ │ └── main.yml│ │ ├── meta│ │ │ └── main.yml│ │ ├── tasks│ │ │ └── main.yml│ │ ├── templates│ │ │ └── haproxy.cfg.j2│ │ └── tests│ │ ├── inventory│ │ └── test.yml│ └── webapp│ ├── defaults│ │ └── main.yml│ ├── meta│ │ └── main.yml│ ├── tasks│ │ └── main.yml│ └── tests│ ├── inventory│ └── test.yml└── site.yml30 directories, 34 files┌──[root@vms81.liruilongs.github.io]-[~/ansible/inventory-variables]└─$

這是我們重新編寫過的,會發現多了一個group_vars目錄


┌──[root@vms81.liruilongs.github.io]-[~/ansible/inventory-variables]└─$tree.├── ansible.cfg├── deploy_apache.yml├── deploy_haproxy.yml├── deploy_webapp.yml├── group_vars│ ├── lb_servers│ │ ├── firewall.yml│ │ └── haproxy.yml│ └── web_servers├── inventory.yml├── roles│ ├── apache│ │ ├── meta│ │ │ └── main.yml│ │ ├── tasks│ │ │ └── main.yml│ │ └── tests│ │ ├── inventory│ │ └── test.yml│ ├── firewall│ │ ├── defaults│ │ │ └── main.yml│ │ ├── handlers│ │ │ └── main.yml│ │ ├── meta│ │ │ └── main.yml│ │ ├── tasks│ │ │ └── main.yml│ │ └── tests│ │ ├── inventory│ │ └── test.yml│ ├── haproxy│ │ ├── defaults│ │ │ └── main.yml│ │ ├── handlers│ │ │ └── main.yml│ │ ├── meta│ │ │ └── main.yml│ │ ├── tasks│ │ │ └── main.yml│ │ ├── templates│ │ │ └── haproxy.cfg.j2│ │ └── tests│ │ ├── inventory│ │ └── test.yml│ ├── org_common│ │ ├── meta│ │ │ └── main.yml│ │ ├── tasks│ │ │ └── main.yml│ │ └── tests│ │ ├── inventory│ │ └── test.yml│ └── webapp│ ├── defaults│ │ └── main.yml│ ├── meta│ │ └── main.yml│ ├── tasks│ │ └── main.yml│ └── tests│ ├── inventory│ └── test.yml└── site.yml30 directories, 34 files

下面來看一個這個Demo, 關于劇本干了什么,小伙伴可以看看我之前的ansible博文


在項目根目新建一個group_vars ,在該目錄下為每個主機組創建子目錄


┌──[root@workstation.lab.example.com]-[/home/student/git-repos/inventory-variables]└─$mkdir group_vars

創建 lb_servers ?錄,以存放 lb_servers 組中主機的變量


┌──[root@workstation.lab.example.com]-[/home/student/git-repos/inventory-variables]└─$mkdir group_vars/lb_servers

創建 web_servers ?錄,以存放 web_servers 組的變量


┌──[root@workstation.lab.example.com]-[/home/student/git-repos/inventory-variables]└─$ mkdir group_vars/web_servers

在每個主機組中為涉及到的角色定義變量文件


┌──[root@workstation.lab.example.com]-[/home/student/git-repos/inventory-variables]└─$touch group_vars/lb_servers/firewall.yml┌──[root@workstation.lab.example.com]-[/home/student/git-repos/inventory-variables]└─$touch group_vars/lb_servers/haproxy.yml┌──[root@workstation.lab.example.com]-[/home/student/git-repos/inventory-variables]└─$ls

在執行deploy_haproxy劇本的時候,調用haproxy,會涉及到角色相關的變量加載。firewall_rules,haproxy_appservers這兩個角色變量。firewall 角色通過角色依賴的方式執行,而haproxy通過劇本直接執行


┌──[root@workstation.lab.example.com]-[/home/student/git-repos/inventory-variables]└─$cat deploy_haproxy.yml- name: Ensure HAProxy is deployed hosts: lb_servers force_handlers: True roles: # The "haproxy" role has a dependency on the "firewall" role. # The "firewall" role requires a "firewall_rules" variable be defined. - role: haproxy firewall_rules: # Allow 80/tcp connections - port: 80/tcp haproxy_appservers: - name: serverb.lab.example.com ip: 172.25.250.11 backend_port: 80 - name: serverc.lab.example.com ip: 172.25.250.12 backend_port: 80

group_vars/lb_servers/firewall.yml定義主機組lb_servers中涉及firewall角色的變量


┌──[root@workstation.lab.example.com]-[/home/student/git-repos/inventory-variables]└─$tee group_vars/lb_servers/firewall.yml <<- EOF> firewall_rules:> # Allow 80/tcp connections> - port: 80/tcp> EOFfirewall_rules: # Allow 80/tcp connections - port: 80/tcp┌──[root@workstation.lab.example.com]-[/home/student/git-repos/inventory-variables]└─$

同時將劇本中的變量刪除


┌──[root@workstation.lab.example.com]-[/home/student/git-repos/inventory-variables]└─$cat deploy_haproxy.yml- name: Ensure HAProxy is deployed hosts: lb_servers force_handlers: True roles: # The "haproxy" role has a dependency on the "firewall" role. # The "firewall" role requires a "firewall_rules" variable be defined. - role: haproxy haproxy_appservers: - name: serverb.lab.example.com ip: 172.25.250.11 backend_port: 80 - name: serverc.lab.example.com ip: 172.25.250.12 backend_port: 80

同樣的在lb_servers主機組目錄下haproxy角色變量文件中定義haproxy角色涉及的變量


┌──[root@workstation.lab.example.com]-[/home/student/git-repos/inventory-variables]└─$tee group_vars/lb_servers/haproxy.yml <<- EOF> haproxy_appservers:> - name: serverb.lab.example.com> ip: 172.25.250.11> backend_port: 80> - name: serverc.lab.example.com> ip: 172.25.250.12> backend_port: 80> EOFhaproxy_appservers: - name: serverb.lab.example.com ip: 172.25.250.11 backend_port: 80 - name: serverc.lab.example.com ip: 172.25.250.12 backend_port: 80┌──[root@workstation.lab.example.com]-[/home/student/git-repos/inventory-variables]└─$

┌──[root@workstation.lab.example.com]-[/home/student/git-repos/inventory-variables]└─$cat deploy_haproxy.yml- name: Ensure HAProxy is deployed hosts: lb_servers force_handlers: True roles: # The "haproxy" role has a dependency on the "firewall" role. # The "firewall" role requires a "firewall_rules" variable be defined. - role: haproxy

通過上面的改造,我們把變量從執行角色的劇本中解耦出來,類似代碼中將靜態可變的數據抽離出來的通過加載配置文件的方式。如果調用角色的劇本很復雜的話,那通過把變量抽離,每次需要維護或者移植直接修改變量文件就可以啦。


同樣的deploy_apache劇本的變量我們以同樣的方式替換一下。


┌──[root@workstation.lab.example.com]-[/home/student/git-repos/inventory-variables]└─$ cat deploy_apache.yml- name: Ensure Apache is deployed hosts: web_servers force_handlers: True roles: # The "apache" role has a dependency on the "firewall" role. # The "firewall" role requires a "firewall_rules" variable be defined. - role: apache firewall_rules: # Allow http requests from the load_balancer. - zone: internal service: http source: "172.25.250.10"┌──[root@workstation.lab.example.com]-[/home/student/git-repos/inventory-variables]└─$tee group_vars/web_servers/firewall.yml <<- EOF> firewall_rules:> # Allow http requests from the load_balancer.> - zone: internal> service: http> source: "172.25.250.10"> EOFfirewall_rules: # Allow http requests from the load_balancer. - zone: internal service: http source: "172.25.250.10"┌──[root@workstation.lab.example.com]-[/home/student/git-repos/inventory-variables]└─$

- name: Ensure Apache is deployed hosts: web_servers force_handlers: True roles: # The "apache" role has a dependency on the "firewall" role. # The "firewall" role requires a "firewall_rules" variable be defined. - role: apache

改造后的目錄多出來的


┌──[root@workstation.lab.example.com]-[/home/student/git-repos/inventory-variables/group_vars]└─$tree.├── lb_servers│ ├── firewall.yml│ └── haproxy.yml└── web_servers └── firewall.yml2 directories, 3 files

同時我們對主機清單文件進行改寫


該 playbook 將清單主機 load_balancer 作為負載平衡器來部署,并將組 web_servers 中的主機作為后端 Web 服務器來部署。 編輯 inventory.yml 靜態清單?件,以便 playbook 中引? load_balancer 主機時使Ansible 連接到 servera.lab.example.com。 清單主機 serverb.lab.example.com和 serverc.lab.example.com 應當位于組 web_servers 中。


lb_servers: hosts: servera.lab.example.com:web_servers: hosts: server[b:c].lab.example.com:

lb_servers: hosts: load_balancer: ansible_host: servera.lab.example.comweb_servers: hosts: server[b:c].lab.example.com:

上面的為原來的清單文件,下面為我們改寫過的清單文件,這里通過ansible_host清單變量指定了執行時的機器,并且定義了一個別名load_balancer,也就是說,在主機清單為lb_servers所在組執行劇本時,在連接受管主機時,使用當前定義的別名。通過DNS的方式來映射到對應的機器,而不使來用自清單文件(inventory_hostname) 中的名稱。


整理參考書籍

《RED HAT 447 Advanced Automation:Ansible Best Practices Edition》


1.本站遵循行業規范,任何轉載的稿件都會明確標注作者和來源;
2.本站的原創文章,請轉載時務必注明文章作者和來源,不尊重原創的行為我們將追究責任;
3.作者投稿可能會經我們編輯修改或補充。

猜你喜歡
Copyright ? 百科網 2019-2023

免責聲明:本網站部分內容由用戶自行上傳,若侵犯了您的權益,請聯系我們處理,謝謝!聯系QQ:1186685208 版權所有:長沙市雨花區佩瓏信息技術工作室 湘ICP備2023006258號-12

十九岁免费观看中文版