ansible管理大项目之包含和导入文件

文章目录

管理大型playbook

如果playbook很复杂,我们可以将其分成较小的文件(也就是解耦)以便于管理。可采用模块化方式将多个playbook组合为一个主要playbook,或者将文件中的任务列表插入play。以便于更简单的管理。

包含或导入文件

Ansible可以使用两种操作将内容带入playbook。可以包含内容,也可以导入内容。

包含内容是一个动态操作。在playbook运行期间,Ansible会在内容到达时处理所包含的内容。

导入内容是一个静态操作。在运行开始之前,Ansible在最初解析playbook时预处理导入的内容。

导入playbook

import_playbook:用于把一个或多个额外playbook导入到主playbook中。

import_playbook功能只能在playbook的顶层使用,不能在play内使用。如果导入多个playbook,则将按顺序导入并运行它们。

如果要导入到主playbook,应该把导入文件写在最下面。
如果组合各playbook,则按顺序即可。

导入和包含任务

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

导入任务文件

可以使用import_tasks功能将任务文件静态导入playbook内的play中。导入任务文件时,在解析该playbook时将直接插入该文件中的任务。Playbook中的import_tasks的位置控制插入任务的位置以及运行多个导入的顺序。

[root@ansible playbook]# tree 
.
├── 111.yml
├── ac.yml
├── files
│   ├── hosts.j2
│   └── test.j2
├── lamp.yml
├── mysql.yml
[root@ansible playbook]# cat 111.yml 
---
- name: yum mysql
  hosts: 192.168.216.172
  tasks:
    - name: yun install
      yum:
        name: mariadb*
        state: present 

    - include_tasks: mysql.yml
[root@ansible playbook]# cat mysql.yml 
- name: Starts the httpd service
  service:
    name: mariadb
    state: started
[root@ansible playbook]# ansible-playbook 111.yml 

PLAY [yum mysql] ****************************************************************************************************************

TASK [Gathering Facts] **********************************************************************************************************
ok: [192.168.216.172]

TASK [yun install]   **************************************************************************************************************
ok: [192.168.216.172]

TASK [Starts the mariadb service] *************************************************************************************************
ok: [192.168.216.172]

PLAY RECAP **********************************************************************************************************************
192.168.216.172            : ok=3    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   


  1. 使用import_tasks功能时,导入时设置的when等条件语句将应用于导入的每个任务

  2. 无法将循环用于import_tasks功能

  3. 如果使用变量来指定要导入的文件的名称,则将无法使用主机或组清单变量

包含任务文件

可以使用include_tasks功能将任务文件动态导入playbook内的play中。

在play运行并且这部分play到达前,include_tasks功能不会处理playbook中的内容。Playbook内容的处理顺序会影响包含任务功能的工作方式。

[root@ansible playbook]# ansible-playbook 111.yml 

PLAY [yum mysql] ****************************************************************************************************************

TASK [Gathering Facts] **********************************************************************************************************
ok: [192.168.216.172]

TASK [yun install] **************************************************************************************************************
changed: [192.168.216.172]

TASK [include_tasks] # 有详细名称************************************************************************************************************
included: /etc/ansible/playbook/mysql.yml for 192.168.216.172

TASK [Starts the mariadb service] *************************************************************************************************
changed: [192.168.216.172]

PLAY RECAP **********************************************************************************************************************
192.168.216.172            : ok=4    changed=2    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
  • 使用include_tasks功能时,包含时设置的when等条件语句将确定任务是否包含在play中
  • 如果运行ansible-playbook --list-tasks以列出playbook中的任务,则不会显示所包含的具体任务,相比之下,import_tasks功能会列出已导入任务文件中的各个任务
  • 不能使用ansible-playbook --start-at-task从已包含任务文件中的任务开始执行playbook
  • 不能使用notify语句触发已包含任务文件中的处理程序名称。可以在包含整个任务文件的主playbook中触发处理程序,在这种情况下,已包含文件中的所有任务都将运行

管理任务文件

为方便管理,可以创建专门用于任务文件的目录,并将所有任务文件保存在该目录中。然后playbook就可以从该目录包含或导入任务文件。这样就可以构建复杂的playbook,同时简化其结构和组件的管理。

定义变量

如果变量通用则写在顶层,如果只是针对某个引用,或包含则写在所针对的模块下

上一篇:二、ansible简介


下一篇:ansible实践