Ansible 学习笔记(三)
Ansible playbook 可以通过 import_playbook 的方式,在 playbook 中组合其他 playbook。
- hosts: webserver
tasks:
[...]
- import_playbook: webapp.yml
- import_playbook: database.yml
task 也可以拆分成多个文件,再用 import_tasks 组合在一起运行。
tasks:
- import_tasks: tasks/common.yml
- import_tasks: tasks/php.yml
- import_tasks: tasks/mysql.yml
在管理的设备和软件不多的情况下,可以使用这种方式。随着项目的增大,Ansible role 才是最佳的使用方式。
如果我们用 role 改写上篇文章的例子,最终的 playbook-salt-master.yml 将变得很简洁。
---
- hosts: example
become: yes
roles:
- salt-master
所有的 tasks 都搬到 salt-master role 对应的目录 roles/salt-master 下面
roles
└── salt-master
├── defaults
│ └── main.yml
├── files
│ └── saltstack.repo
├── handlers
│ └── main.yml
├── meta
│ └── main.yml
├── tasks
│ └── main.yml
└── templates
└── master.j2
在 ansible.cfg 里增加一项配置,让 ansible 知道 role 的路径。这样执行 playbook 时,才能找到对应 role 的文件。
[defaults]
inventory = hosts.ini
roles_path = ./roles/
看起来用了 role 之后,目录和文件都变多了,这些目录只有 tasks 是必须的
- defaults: 定义 role 关联的变量
- files:role 使用到的文件
- handlers:所有 handlers 在这里声明
- meta:如果 role 依赖其他 role,在这里定义
- tasks:role 要执行的 tasks
- templates:jinja2 模版文件,经过 Ansible 渲染后生成最终文件
按照这样的目录规则编写 role,Ansible 会自动解析各目录下的文件并自动 include,这样我们就不需要人工指定各种依赖,像前面 playbook 那样到处 import,很容易套成俄罗斯套娃。
实际上,通过约定的规则来编写 role,会使得 role 变得容易分享。Ansible 官方提供了 Galaxy 这个工具供大家查找和分享 role。大家可以去看看,自己需要的软件,别人是怎么写 role 的。