文章目录
管理大型playbook
如果playbook很复杂,我们可以将其分成较小的文件(也就是解耦)以便于管理。可采用模块化方式将多个playbook组合为一个主要playbook,或者将文件中的任务列表插入play。以便于更简单的管理。
包含或导入文件
Ansible可以使用两种操作将内容带入playbook。可以包含内容,也可以导入内容。
包含内容是一个动态操作。在playbook运行期间,Ansible会在内容到达时处理所包含的内容。
导入内容是一个静态操作。在运行开始之前,Ansible在最初解析playbook时预处理导入的内容。
导入playbook
import_playbook:用于把一个或多个额外playbook导入到主playbook中。
import_playbook功能只能在playbook的顶层使用,不能在play内使用。如果导入多个playbook,则将按顺序导入并运行它们。
如果要导入到主playbook,应该把导入文件写在最下面。
如果组合各playbook,则按顺序即可。
导入和包含任务
可以将任务文件中的任务列表导入或包含在play中。任务文件是包含一个任务平面列表的文件:
导入任务文件
可以使用import_tasks功能将任务文件静态导入playbook内的play中。导入任务文件时,在解析该playbook时将直接插入该文件中的任务。Playbook中的import_tasks的位置控制插入任务的位置以及运行多个导入的顺序。
[root@ansible playbook]# tree
.
├── 111.yml
├── ac.yml
├── files
│ ├── hosts.j2
│ └── test.j2
├── lamp.yml
├── mysql.yml
[root@ansible playbook]# cat 111.yml
---
- name: yum mysql
hosts: 192.168.216.172
tasks:
- name: yun install
yum:
name: mariadb*
state: present
- include_tasks: mysql.yml
[root@ansible playbook]# cat mysql.yml
- name: Starts the httpd service
service:
name: mariadb
state: started
[root@ansible playbook]# ansible-playbook 111.yml
PLAY [yum mysql] ****************************************************************************************************************
TASK [Gathering Facts] **********************************************************************************************************
ok: [192.168.216.172]
TASK [yun install] **************************************************************************************************************
ok: [192.168.216.172]
TASK [Starts the mariadb service] *************************************************************************************************
ok: [192.168.216.172]
PLAY RECAP **********************************************************************************************************************
192.168.216.172 : ok=3 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
-
使用import_tasks功能时,导入时设置的when等条件语句将应用于导入的每个任务
-
无法将循环用于import_tasks功能
-
如果使用变量来指定要导入的文件的名称,则将无法使用主机或组清单变量
包含任务文件
可以使用include_tasks功能将任务文件动态导入playbook内的play中。
在play运行并且这部分play到达前,include_tasks功能不会处理playbook中的内容。Playbook内容的处理顺序会影响包含任务功能的工作方式。
[root@ansible playbook]# ansible-playbook 111.yml
PLAY [yum mysql] ****************************************************************************************************************
TASK [Gathering Facts] **********************************************************************************************************
ok: [192.168.216.172]
TASK [yun install] **************************************************************************************************************
changed: [192.168.216.172]
TASK [include_tasks] # 有详细名称************************************************************************************************************
included: /etc/ansible/playbook/mysql.yml for 192.168.216.172
TASK [Starts the mariadb service] *************************************************************************************************
changed: [192.168.216.172]
PLAY RECAP **********************************************************************************************************************
192.168.216.172 : ok=4 changed=2 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
- 使用include_tasks功能时,包含时设置的when等条件语句将确定任务是否包含在play中
- 如果运行ansible-playbook --list-tasks以列出playbook中的任务,则不会显示所包含的具体任务,相比之下,import_tasks功能会列出已导入任务文件中的各个任务
- 不能使用ansible-playbook --start-at-task从已包含任务文件中的任务开始执行playbook
- 不能使用notify语句触发已包含任务文件中的处理程序名称。可以在包含整个任务文件的主playbook中触发处理程序,在这种情况下,已包含文件中的所有任务都将运行
管理任务文件
为方便管理,可以创建专门用于任务文件的目录,并将所有任务文件保存在该目录中。然后playbook就可以从该目录包含或导入任务文件。这样就可以构建复杂的playbook,同时简化其结构和组件的管理。
定义变量
如果变量通用则写在顶层,如果只是针对某个引用,或包含则写在所针对的模块下