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 是必须的

  1. defaults: 定义 role 关联的变量
  2. files:role 使用到的文件
  3. handlers:所有 handlers 在这里声明
  4. meta:如果 role 依赖其他 role,在这里定义
  5. tasks:role 要执行的 tasks
  6. templates:jinja2 模版文件,经过 Ansible 渲染后生成最终文件

按照这样的目录规则编写 role,Ansible 会自动解析各目录下的文件并自动 include,这样我们就不需要人工指定各种依赖,像前面 playbook 那样到处 import,很容易套成俄罗斯套娃。

实际上,通过约定的规则来编写 role,会使得 role 变得容易分享。Ansible 官方提供了 Galaxy 这个工具供大家查找和分享 role。大家可以去看看,自己需要的软件,别人是怎么写 role 的。

© 2017 - 2023 · 记事本 · Theme Simpleness Powered by Hugo ·