包含与导入、角色结构

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中使用时不应更改。
上一篇:使用shell脚本清理ElasticSearch历史数据


下一篇:Docker Compose 部署 Portainer 容器管理平台