「 傍晚時分,你坐在屋檐下,看著天慢慢地黑下去,心里寂寞而凄涼,感到自己的生命被剝奪了。當時我是個年輕人,但我害怕這樣生活下去,衰老下去。在我看來,這是比死亡更可怕的事。--------王小波」
在Ansible中,利用變量,可以編寫任務、角色和 playbook,使它們可重復使用并且靈活多變。變量可以指定不同系統之間的配置差異。ansilbe可以在許多不同的位置設置變量:
「在項目定義和管理變量時,做好規劃以遵循下列原則:」
當使用多種方式定義相同變量時,Ansible 將使用優先級規則為變量選取值。以下討論優先級從低到高:
下面就這幾種變量一起簡單梳理下:
配置文件的變量擁有最低的優先級,通過在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]└─$
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目錄中的文件來定義,也可以在項目中指定目錄下定義,場景比較多,我們分別看下
以下列表從最低到最高列出了這些變量的確切優先順序:
我們分別來看下:
┌──[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]└─$
┌──[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]└─$
┌──[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]└─$
這里需要說明的是,創建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/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]└─$
┌──[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]└─$
┌──[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,可以看到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_vars和host_vars子目錄與相對于 playbook 項目的子目錄之間的優先級比較好區分,相同類型,項目下總是比清單里的優先級要高,。
如果在 playbook 的相同目錄中有group_vars 和 host_vars子目錄,則這些組和主機變量將被自動包含在內。
簡單總結一下ansible清單文件變量優先級。在facts優先級最高,其次是主機變量,包含清單變量文件的host_vars目錄和inventory清單變量目錄和inventory文件,項目下要高于清單目錄下,清單目錄要高于清單文件,之后是組變量,group_vars目錄下的文件,inventory清單變量目錄,inventory文件,整體上,inventory文件優先級小于目錄下的優先級,同樣是inventory目錄下要小于項目目錄下。
準備工作,我們還用之前的角色和劇本
┌──[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 以外的命令行選項。以下列表從最低到最高列出了這些變量的優先順序:
我們分別梳理下:
---- 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
---- 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
---- 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
當前劇本執行返回的變量值為 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
---- 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。
即不是寫在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
在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
---- 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
---- 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
---- 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"}....
使用 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查看
┌──[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是之前的博文用到,看一下如何從現有的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.作者投稿可能會經我們編輯修改或補充。