包含
使用include
模塊來包含foo文件
tasks:
- include: foo.yml
--- foo.yml
- name: test foo
command: echo foo
include
還允許傳遞變量
- include: wordpress.yml wp_user=timmy
- include: wordpress.yml
vars:
wp_user: timmy
ssh_keys:
- keys/one.txt
- keys/two.txt
動態包含
循環引用3次
- include: foo.yml param={{item}}
with_items:
- 1
- 2
- 3
還可以使用動態變量引入task文件
- include: "{{inventory_hostname}}.yml"
動態包含的一些限制
? 您不能使用notify來觸發來自動態包含的處理程序名稱。
? 您不能使用--start-at-task在動態包含內的任務開始執行。
? 僅存在于動態包含內的標記不會顯示在-list-tags輸出中。
? 只存在于動態包含內的任務將不會顯示在-list-tasks輸出中。
為了解決上面限制,2.1版本后引入了static
- include: foo.yml
static: <yes|no|true|false>
默認情況下,在Ansible 2.1及更高版本中,include包含符合以下條件時會自動被視為靜態而不是動態:
- include不使用任何循環
- 包含的文件名不使用任何變量
- 靜態選項沒有顯式禁用(即static:no)
- 強制靜態包含(見下文)的ansible.cfg選項被禁用
ansible.cfg配置中有兩個選項可用于靜態包括:
-
task_includes_static
- 將所有在tasks部分中包含的內容都設置為靜態。 -
handler_includes_static
- 強制所有包括在處理程序部分是靜態的。
這些選項允許用戶強制playbook的行為與他們在1.9.x和之前一樣。
變量包含
include_vars
在task中動態加載yaml或json文件類型中的變量
- include_vars: myvars.yml
根據操作系統類型加載變量文件,如果找不到,則為默認值。
- include_vars: "{{ item }}"
with_first_found:
- "{{ ansible_distribution }}.yml"
- "{{ ansible_os_family }}.yml"
- "default.yml"
角色 ROLE
角色是基于已知文件結構自動加載某些vars_files,任務和處理程序的方法。 按角色分組內容還允許輕松與其他用戶共享角色。
文件結構如下
結構說明
- site.yml 主要的playbook
- webservers.yml webservers 得playbook
- hosts.ini 主機清單
- ibrary 如果有任何自定義模塊,將其放在這里(可選)
- filter_plugins 如果有任何自定義過濾器插件,將其放在這里(可選)
- 如果group_var/all存在,其中列出的變量將被添加到所有的主機組中
- 如果group_var/groupname1存在,其中列出的變量將被添加到groupname1主機組中-
- 如果host_vars/hostname1存在,其中列出的變量將被添加到hostname1主機組中
這個 playbook 為一個角色 ‘x’ 指定了如下的行為
- 如果 roles/x/tasks/main.yml 存在, 其中列出的 tasks 將被添加到 play 中
- 如果 roles/x/handlers/main.yml 存在, 其中列出的 handlers 將被添加到 play 中
- 如果 roles/x/vars/main.yml 存在, 其中列出的 variables 將被添加到 play 中
- 如果 roles/ x/defaults /main.yml存在,其中列出的變量將被添加到play 中
- 如果 roles/x/meta/main.yml 存在, 其中列出的 “角色依賴” 將被添加到 roles 列表中
- 所有 copy tasks 可以引用 roles/x/files/ 中的文件,不需要指明文件的路徑。
- 所有 script tasks 可以引用 roles/x/files/ 中的腳本,不需要指明文件的路徑。
- 所有 template tasks 可以引用 roles/x/templates/ 中的文件,不需要指明文件的路徑。
- 所有 include tasks 可以引用 roles/x/tasks/ 中的文件,不需要指明文件的路徑。
如果 roles 目錄下有文件不存在,這些文件將被忽略。
這些目錄的加載順序
- meta/main.yml
- tasks/main.yml
- handlers/main.yml
- vars/main.yml
- defaults/main.yml
如果區分環境使用角色,可以使用下列文檔結構
- production/inventory 主機清單
** 運行playbook**
ansible-playbook -i production site.yml
角色定義
在playbook中定義角色
---
- hosts: webservers
roles:
- x
定義角色參數
---
- hosts: webservers
roles:
- { role: x, dir: '/opt/a', app_port: 5000 }
使用條件判斷,當主機是Redhat時,才執行角色任務
---
- hosts: webservers
roles:
- { role: some_role, when: "ansible_os_family == 'RedHat'" }
定義角色標簽
---
- hosts: webservers
roles:
- { role: x, tags: ["bar", "baz"] }
定義執行角色任務前后執行的動作
---
- hosts: webservers
pre_tasks:
- shell: echo 'hello'
roles:
- { role: some_role }
tasks:
- shell: echo 'still busy'
post_tasks:
- shell: echo 'goodbye'
pre_tasks里的task在roles執行前執行的任務
post_tasks里的task在roles執行完成后執行的任務
角色默認變量
定義角色默認變量,只需在角色目錄中添加一個defaults/main.yml文件。角色默認變量優先級最低。
角色依賴
角色依賴性允許您在使用角色時自動提取其他角色。 角色依賴關系存儲在角色目錄中包含的meta/main.yml文件中。 此文件應包含要在指定角色之前插入的角色和參數的列表,例如角色/myapp/meta/main.yml中的以下內容:
---
dependencies:
- { role: common, some_parameter: 3 }
- { role: apache, apache_port: 80 }
- { role: postgres, dbname: blarg, other_parameter: 12 }
- { role: '/path/to/common/roles/foo', x: 1 }
** 角色依賴執行順序**
角色依賴性始終在包含角色的角色之前執行,并且是遞歸的。
如上面內容,按照common,apache,postgres,'/path/to/common/roles/foo順序依次執行,再執行此角色
** 角色依賴嵌套**
默認情況下,在添加依賴其他角色的時候,如果其他角色內也有依賴關系,是不執行其他角色內的依賴關系的。
可以通過allow_duplicates: yes
設置來實現執行其他角色內的依賴關系。
實際測試,2.1
,2.2
版本的ansible,無論加不加這個設置,就只會執行第一次依賴角色,后續的則不執行。
例子
ansible examples :https://github.com/ansible/ansible-examples
更多文章請看 Ansible 專題文章總覽