文章目录
包含、导入文件
包含或导入文件
Ansible可以使用两种操作将内容带入playbook。可以包含内容,也可以导入内容。
-
包含内容是一个动态操作。在playbook运行期间,Ansible会在内容到达时处理所包含的内容。
-
导入内容是一个静态操作。在运行开始之前,Ansible在最初解析playbook时预处理导入的内容
导入Playbook
import_playbook指令允许将包含play列表的外部文件导入playbook。换句话说,可以把一个或多个额外playbook导入到主playbook中。
由于导入的内容是一个完整的playbook,因此import_playbook功能只能在playbook的顶层使用,不能在play内使用。如果导入多个playbook,则将按顺序导入并运行它们。
- name: test
import_playbook: apache.yml
- name: test2
import_playbook: mysql.yml
- name: test3
import_playbook: php.yml
导入和包含任务
导入任务文件
- 可以使import_tasks功能将任务文件静态导入playbook内的play中。
- 导入任务文件时,在解析该playbook时将直接插入该文件中的任务。
- playbook中的import_tasks的位置控制插入任务的位置以及运行多个导入的顺序。
#需要导入的文件
[root@client test2]# cat httpd.yml
- name: install httpd
dnf:
name: httpd
state: latest
[root@client test2]# cat httpd_start.yml
- hosts: all
tasks:
- name: start httpd
service:
name: httpd
state: started
#执行文件
[root@client test2]# cat one.yml
---
- hosts: 192.168.8.133
tasks:
- name: install httpd
import_tasks: httpd.yml
- name: start httpd
import_tasks: httpd_start.yml
导入任务文件时,在解析该playbook时将直接插入该文件中的任务。由于import_tasks在解析playbook时静态导入任务,因此对其工作方式有一些影响。
- 使用import_tasks功能时,导入时设置的when等条件语句将应用于导入的每个任务
- 无法将循环用于import_tasks功能
- 如果使用变量来指定要导入的文件的名称,则将无法使用主机或组清单变量
包含任务文件
- 可以使用include_tasks功能任务动态导入playbook内的play中
[root@client test2]# cat one.yml
---
- hosts: 192.168.8.133
tasks:
- name: install httpd
import_tasks: httpd.yml
- name: start httpd
include_tasks: httpd_start.yml
- 在play运行并且这部分play到达前,include_tasks功能不会处理playbook中的内容
- Playbook内容的处理顺序会影响包含任务功能的工作方式
- 使用include_tasks功能时,包含时设置的when等条件语句将确定任务是否包含在play中
- 如果运行ansible-playbook --list-tasks以列出playbook中的任务,则不会显示已包含任务文件
- 相比之下,import_tasks功能不会列出导入任务文件的任务,而列出已导入任务文件中的各个任务
- 不能使用ansible-playbook --start-at-task从已包含任务文件中的任务开始执行playbook
- 不能使用notify语句触发已包含任务文件中的处理程序名称。可以在包含整个任务文件的主playbook中处理程序,在这种情况下,已包含文件中的所有任务都将运行
为外部play和任务定义变量
使用Ansible的导入和包含功能将外部文件中的play或任务合并到playbook中极大地增强了在Ansible环境中重用任务和playbook的能力。为了最大限度地提高重用可能性,这些任务和play文件应尽可能通用。变量可用于参数化play和任务元素,以扩大任务和play的应用范围。
#需导入的外部任务文件
[root@client test2]# cat var2/vars2_file.yml
package: httpd
service: httpd
[root@client test2]# cat httpd.yml
- name: install httpd
dnf:
name: "{
{ package }}"
state: latest
[root@client test2]# cat httpd_start.yml
- hosts: all
tasks:
- name: start httpd
service:
name: "{
{ service }}"
state: started
#变量文件
[root@client test2]# cat var2/vars2_file.yml
package: httpd
service: httpd
#执行文件
[root@client test2]# cat one.yml
---
- hosts: 192.168.8.133
vars_files:
var2/vars2_file.yml
tasks:
- name: install httpd
import_tasks: httpd.yml
- name: start httpd
include_tasks: httpd_start.yml
角色的结构
roles介绍
Ansible角色提供了一种方法,让用户能以通用的方式更加轻松地重复利用Ansible代码。我们可以在标准化目录结构中打包所有任务、变量、文件、模板,以及调配基础架构或部署应用所需的其他资源。只需通过复制相关的目录,将角色从一个项目复制到另一个项目。然后,只需从一个play调用该角色就能执行它。
借助编写良好的角色,可以从playbook中向角色传递调整其行为的变量,设置所有站点相关的主机名、IP地址、用户名,或其他在本地需要的具体详细信息。例如,部署数据库服务器的角色可能已编写为支持多个变量,这些变量用于设置主机名、数据库管理员用户和密码,以及需要为安装进行自定义的其他参数。角色的作者也可以确保在选择不在play中设置变量值时,为这些变量设定