Ansible 包含和导入文件

Ansible 包含和导入文件

如果Playbook很长或很复杂,可以尝试将其分成较小的文件以便与管理。适宜食用模块化方式将多个Playbook组合成一个主要的Playbook,或者将文件中的任务列表插入到Play中。和杨可以更轻便、更加便于管理的操作项目中的Play和任务序列。

包含与导入文件概念区别

Ansible支持两种方式将内容带入到Playbook,可以使用包含内容,也可以使用导入内容。

包含内容(include)是一个动态的过程。在playbook运行期间,Ansible会在内容到达时再去处理所包含的内容。

导入内容(import)是一个静态操作。在最开始的时候Ansible运行Playbook时就将它解析好并导入到要执行的这个Playbook中了。

导入Playbook

使用import_playbook指令可以将外部的Playbook导入到当前的Playbook中。

导入的Playbook是一个完成的playbook,因此要使用import_playbook指令需要在Play的位置导入,而不能在tasks处进行导入Playbook。如果你导入了多喝playbook,则将按照导入的顺序一次运行.

1
2
3
4
5
6
7
8
9
10
11
12
13
---
- name: Play1
import_playbook: web.yml

- name: Play2
hosts: localhost
tasks:
- debug:
msg: This is Play 2

- name: Play3
import_playbook: db.yml
...

在上面的例子中,会一次执行三个Play,并且导入操作可以和展开的Play穿插使用。

导入和包含任务

可以将任务文件中的任务列表导入或包含在Play中。任务文件是包含一个任务平面列表的文件:

vim tasks_firewalld.yml

1
2
3
4
5
6
7
8
9
10
- name: Install the firewall
yum:
name: firewalld
state: latest

- name: Start the firewall
service:
state: started
name: firewalld
enabled: true

导入任务文件

使用import_tasks功能将任务文件静态导入Playbook的Play中。在一开始解析Playbook时就会将该任务文件插入到Play中。

1
2
3
4
5
6
7
- name: Play
hosts: localhost
tasks:
- debug:
msg: This is Play
- name: I'm Import Task
import_tasks: db.yml
  • 使用import_tasks功能时,导入时设置的when等条件语句将应用于导入的每个任务。
  • 使用import_tasks功能时,无法将loop循环应用在上面。
  • 如果使用变量来指定要导入的文件的名称,则无法使用主机或组清单变量。

包含任务文件

使用include_tasks可以将任务文件动态包含进Tasks中。

1
2
3
4
- name: Play
hosts: localhost
tasks:
include_tasks: db.yml

在Play运行到达该Tasks前,Ansible不会处理该任务文件的任何内容。使用include_tasks时,包含时设置的when等条件语句将确定任务是否包含在Play中。