1、管理大型playbook
如果playbook很长或很复杂,我们可以将其分成较小的文件以便于管理。可采用模块化方式将多个playbook组合为一个主要playbook,或者将文件中的任务列表插入play。这样可以更轻松地在不同项目中重用play或任务序列。
2、包含或导入文件
Ansible可以使用两种操作将内容带入playbook。可以包含内容,也可以导入内容。
包含内容是一个动态操作。在playbook运行期间,Ansible会在内容到达时处理所包含的内容。
导入内容是一个静态操作。在运行开始之前,Ansible在最初解析playbook时预处理导入的内容。
3、导入
导入分:导入完整的playbook文件与导入任务文件
1、导入完整的playbook
写法:import_playbook: (playbook文件名)
- 第一playbook文件
[root@master test]# cat install.yml
---
- hosts: httpd
tasks:
- name: install httpd
yum:
name: httpd
state: present
- name: start httpd
service:
name: httpd
state: started
- 第二个playbook文件
[root@master test]# cat config.yml
---
- hosts: httpd
vars:
- port: 8080 //定义的变量
tasks:
- name: change configuration
template:
src: files/httpd.conf.j2 //创建模板
dest: /etc/httpd/conf/httpd.conf
notify: //触发通知
- restart httpd
handlers:
- name: restart httpd
service:
name: httpd
state: restarted
[root@master test]# vim files/httpd.conf.j2 #模板文件
#Listen 12.34.56.78:80
Listen {{ port }}
- 将第一个和第二个playbook文件导入一个playbook文件中
[root@master test]# cat main.yml
- name: import install
import_playbook: install.yml
- name: import config
import_playbook: config.yml
2、导入任务文件
写法:import_tasks: (任务文件名)
- 第一任务文件
[root@master test]# cat tasks/install.yml
- name: install httpd
yum:
name: httpd
state: present
- 第二任务文件
[root@master test]# cat tasks/config.yml
- name: change configuration
template:
src: files/httpd.conf.j2
dest: /etc/httpd/conf/httpd.conf
- 将第一个和第二个任务文件导入一个playbook文件中
[root@master test]# cat main.yml
- hosts: httpd
gather_facts: no
vars:
port: 80
tasks:
- import_tasks: tasks/install.yml
- import_tasks: tasks/config.yml
- name: start service
service:
name: httpd
state: started
enabled: yes
4、包含
用: include_tasks: (文件名)
[root@master test]# cat main.yml
- hosts: httpd
gather_facts: no
vars:
port: 80
tasks:
- include_tasks: tasks/install.yml
- include_tasks: tasks/config.yml
- name: start service
service:
name: httpd
state: started
enabled: yes
[root@master project]# ansible-playbook playbook/test/main.yml -C
[WARNING]: Found variable using reserved name: port
PLAY [httpd] *********************************************************************************************************************************
TASK [include_tasks] *********************************************************************************************************************************
included: /opt/project/playbook/test/tasks/install.yml for 192.168.47.159
TASK [install httpd] *********************************************************************************************************************************
changed: [192.168.47.159]
TASK [include_tasks] *********************************************************************************************************************************
included: /opt/project/playbook/test/tasks/config.yml for 192.168.47.159
TASK [change configuration] *********************************************************************************************************************************
changed: [192.168.47.159]
TASK [start service] *********************************************************************************************************************************
changed: [192.168.47.159]
PLAY RECAP *********************************************************************************************************************************
192.168.47.159 : ok=5 changed=3 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
5、包含与导入的区别
导入:
[root@master test]# ansible-playbook --list-tasks main.yml ##查看任务
playbook: main.yml
play #1 (httpd): httpd TAGS: []
tasks:
install httpd TAGS: [] //可以看见文件里的内容的名称
change configuration TAGS: []
start service TAGS: []
导入任务文件时,在解析该playbook时将直接插入该文件中的任务。由于import_tasks在解析playbook时静态导入任务,因此对其工作方式有一些影响。
- 使用import_tasks功能时,导入时设置的when等条件语句将应用于导入的每个任务
- 无法将循环用于import_tasks功能
- 如果使用变量来指定要导入的文件的名称,则将无法使用主机或组清单变量
包含:
[root@master test]# ansible-playbook --list-tasks main.yml
playbook: main.yml
play #1 (httpd): httpd TAGS: []
tasks:
include_tasks TAGS: [] //不能看见文件里的内容的名称
include_tasks TAGS: []
start service TAGS: []
Playbook内容的处理顺序会影响包含任务功能的工作方式。
- 使用include_tasks功能时,包含时设置的when等条件语句将确定任务是否包含在play中
- 如果运行ansible-playbook --list-tasks以列出playbook中的任务,则不会显示已包含任务文件中的任务。将显示包含任务文件的任务。相比之下,import_tasks功能不会列出导入任务文件的任务,而列出已导入任务文件中的各个任务
- 不能使用ansible-playbook --start-at-task从已包含任务文件中的任务开始执行playbook
- 不能使用notify语句触发已包含任务文件中的处理程序名称。可以在包含整个任务文件的主playbook中触发处理程序,在这种情况下,已包含文件中的所有任务都将运行
**建议:**为方便管理,可以创建专门用于任务文件的目录,并将所有任务文件保存在该目录中。然后playbook就可以从该目录包含或导入任务文件。这样就可以构建复杂的playbook,同时简化其结构和组件的管理。
6、角色的结构
Ansible角色由子目录和文件的标准化结构定义。*目录定义角色本身的名称。文件整理到子目录中,子目录按照各个文件在角色中的用途进行命名,如tasks和handlers。files和templates子目录中包含由其他YAML文件中的任务引用的文件。
[root@master roles~]# tree my_role/
my_role/ :具体的角色项目名称,比如 nginx、tomcat、php(*设置)
├── defaults :用于为当前角色设定默认变量,此目录应当包含一个 main.yml 文件
│ └── main.yml :main.yml,类似代码中的主函数,进行统一管理
├── files :用来存放由 copy 模块或 script 模块等模块调用的文件
├── handlers :用于定义此角色中触发条件时执行的动作,此目录应当包含一个
main.yml 文件
│ └── main.yml
├── meta :用于定义此角色的特殊设定及其依赖关系,此目录应当包含一个
main.yml 文件
│ └── main.yml
├── README.md :说明文件
├── tasks :用于定义当前角色的任务列表,此目录应当包含一个 main.yml 文件
│ └── main.yml
├── templates :用来存放 jinjia2 模板,template 模块会自动在此目录中寻找jinjia2 模板文件
├── tests :用于存放测试 role 本身功能的 playbook 和主机定义文件,在开发测试阶段比较常用,此目录应当包含一个 main.yml 文件和自身资源设定 invetory
│ ├── inventory
│ └── test.yml
└── vars :用于定义此角色用到的变量,此目录应当包含一个 main.yml 文件
注意:除tests子目录外,其他的所有子目录下的YAML文件必须以main命名。
Ansible角色子目录
子目录 | 功能 |
---|---|
defaults | 此目录中的main.yml文件包含角色变量的默认值,使用角色时可以覆盖这些默认值。 这些变量的优先级较低,应该在play中更改和自定义。 |
files | 此目录包含由角色任务引用的静态文件。 |
handlers | 此目录中的main.yml文件包含角色的处理程序。 |
meta | 此目录中的main.yml文件包含与角色相关的信息,如作者、许可证、平台和可选的角色依赖项。 |
tasks | 此目录中的main.yml文件包含角色的任务。 |
templates | 此目录包含由角色任务引用的Jinja2模板。 |
tests | 此目录可以包含清单和名为test.yml的playbook,可用于测试角色。 |
vars | 此目录中的main.yml文件定义角色的变量值。这些变量通常用于角色内部用途。 这些变量的优先级较高,在playbook中使用时不应更改。 |