Day 29:Playbook 的模组化

前天我提到了希望可以研究一下如何做 playbook 的模组化,今天就来整理一下有哪些方式可以帮助我们管理比较复杂的 playbook 吧。

变数

第一个部分先来看看,在 Ansible 里面我们可以如何去定义变数。

inventory

inventory 里面可以直接定义变数,像是以下这个范例就会在 localhost 这个 host 上定义 foo 的值为 "bar"

[local]
localhost ansible_connection=local foo=bar

我们也可以针对整个 group 设定变数,像是这样。

[local]
localhost ansible_connection=local

[local:vars]
foo=bar

但是,以上的方法都是要将变数写进同一份档案内,所以我们的变数会跟 host 绑在一起,某些情况下我们或许不希望这样。

host_vars / group_vars

但还好 Ansible 也有提供分档案的写法,那就是把变数的定义放在 host_vars/ 或是 group_vars/ 底下,这两个资料夹底下的档名就对应着 host 或是 group。

举例来说,若我们想要在 locahost 底下定义 foo=bar 的话,那麽可以在 inventory file 的同层目录下的 host_vars/localhost(可以加上副档名)内,直接以 dictionary 定义变数们:

foo: bar

另外也支援 json 格式:

{
    "foo": "bar"
}

而 group variable 也是类似的概念,不过只是改成在 local 这个 group 底下定义变数。最後需要注意一点,与 inventory 不同,这些定义变数的档案并不支援 ini 格式。

vars_files

之前我们曾经有写过,直接在 playbook 里面使用 vars 定义变数,不过若是要分成不同档案的话就要改成使用 vars_files 了。举例来说,若我们把变数存在 vars.yml,那麽 playbook 可以这样写。

---
- name: Read variable from file
  hosts: all
  vars_files:
    - vars.yml
  tasks:
    - name: Print
      ansible.builtin.debug:
        var: foo

然後 vars.yml 长这样:

foo: bar

另外,这种特性也可以让我们方便的替换不同的档案,很适合撰写根据不同的环境 (e.g. dev, test) 来设定变数的 playbook,这部分可以参考冻仁大大之前写的文章

Task

关於 task 的重用就没有那麽多选项了,Ansible 提供了 import_task 跟 include_task 两个 module 来帮助我们引用其他的 task,例如我们把 playbook 改成这样:

---
- name: Read variable from file
  hosts: all
  vars_files:
    - vars.yml
  tasks:
    - name: Print
      include_tasks: print.yml

然後在 print.yml 写入以下内容:

- name: Print
  ansible.builtin.debug:
    var: foo

再次执行之後就会发现跟原来一样可以成功印出 foo 的内容。

那麽 import_tasks 跟 include_tasks 究竟有什麽不同呢?根据官方的说明,他们分别是静态跟动态的,也就是处理时机的不同,import_tasks 会在 ansible-playbook 这个指令 parse playbook 的时候就把 task 档案包进来,但是 include_tasks 是在执行到它的时候才会把 task 包进来。

Playbook

除了 task,playbook 也是可以重用的,需要透过 import_playbook 来使用,而这部份就没有提供 include 版本了,也就是说 playbook 的重用是没有动态版本的。使用范例如下(假设刚刚的 playbook 叫做 var-test.yml):

- import_playbook: var-test.yml

另存为 import.yml,则执行 ansible-playbook import.yml 就跟执行 ansible-playbook var-test.yml 是等价的。

小结

今天整理了该如何重用 playbook 里面的内容,不过其实还有 role 的机制没有讲到,这部分就留到明天再来补充吧。

参考资料


<<:  Day28 客制化Hook

>>:  【程序】铁人赛结赛心得 转生成恶役菜鸟工程师避免 Bad End 的 30 件事 - 30

万事真能从影片完整复制学习吗?(教与学篇)

我们看电视综艺节目的森川葵,不管学习什麽技艺,都能很快学会,让教的人相当惊讶,且啧啧称奇,把这个电视...

DAY 19:Prototype Pattern,创建物件不再从头开始浪费时间

什麽是 Prototype Pattern? 将物件以拷贝的方式建立 如果某类物件在初始化时,会消耗...

Day22-D3 基础图表:长条图

本篇大纲:开放资料下载、绘制长条图 今天的一天一图表,我们来画图表世界中最常见的 长条图 吧!长条...

Day26

在强行别语言中我们必须先定义变数的型别,例如vector a(10); 一个int向量只能放int元...

为了转生而点技能-JavaScript,day14(this下篇: Call、apply呼叫及bind

Call呼叫:呼叫函式的方法,并且能指定 this 值。 用法:函式名.call(指定的this变数...