如果playbook很长或很复杂,我们可以将其分成较小的文件以便于管理。可采用模块化方式将多个playbook组合为一个主要playbook,或者将文件中的任务列表插入play。这样可以更轻松地在不同项目中重用play或任务序列。
Ansible可以使用两种操作将内容带入playbook。可以包含内容,也可以导入内容。
包含内容是一个动态操作。在playbook运行期间,Ansible会在内容到达时处理所包含的内容。
导入内容是一个静态操作。在运行开始之前,Ansible在最初解析playbook时预处理导入的内容。
导入分:导入完整的playbook文件与导入任务文件
写法:import_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
[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 }}
[root@master test]# cat main.yml - name: import install import_playbook: install.yml - name: import config import_playbook: config.yml
写法: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
[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
用: 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
导入:
[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时静态导入任务,因此对其工作方式有一些影响。
包含:
[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内容的处理顺序会影响包含任务功能的工作方式。
**建议:**为方便管理,可以创建专门用于任务文件的目录,并将所有任务文件保存在该目录中。然后playbook就可以从该目录包含或导入任务文件。这样就可以构建复杂的playbook,同时简化其结构和组件的管理。
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中使用时不应更改。 |