介绍Ansible的模板功能

 __________________
< template について書くよ >
 ------------------
        \   ^__^
         \  (oo)\_______
            (__)\       )\/\
                ||----w |
                ||     ||

尽管几乎是 Jinja2 的 Ansible,但我会整理一下一些需要频繁搜索的内容(有些内容在整理之前我还不知道,有时候重新查看文档是很好的)。
它不仅在模板模块中使用,也在任务定义的 YAML 中使用。

(原文)QiitaのシンタックスハイライトはJinjaにも対応しているのですね。

(翻译)原来Qiita的语法高亮功能也支持Jinja呢。

Ansible 管理的

首先,即使Subversion的$Id$非常方便,我不会使用它,因为其中存在陷阱。(参考:http://docs.ansible.com/ansible/intro_configuration.html#ansible-managed)

在模板文件中

{{ ansible_managed }}

写在那儿时,它将根据 ansible.cfg 等配置文件中设置的格式在执行时进行替换。可以添加谁何时进行的更新。

ansible_managed = Ansible managed: {file} modified on %Y-%m-%d %H:%M:%S by {uid} on {host}

然而,这个功能十分棘手,因为它会将时间戳(timestamp)包括在内来比较文件是否有变动,所以如果在文件本来不应有任何变动的情况下,却加入了时间戳,就会导致文件被替换。这将引发每次都触发通知处理程序的悲惨结果。请务必留心。

默认

在Ansible的某个版本之后,默认情况下如果引用了未定义的变量会导致错误并终止操作,但是如果指定了默认值,就不会出问题了。所以,如果没有特别指定,就使用这个值。

可以使用角色的default/main.yml文件,但如果需要引用的文件增多,这样做可能会令人不太开心,所以对于简单的值,可以使用这种方法。

{{ some_variable | default('foo bar') }}

在任务中,非常方便的一点就是在1.8版本中引入的默认值(省略)。虽然我在写这个的时候才知道(链接:http://docs.ansible.com/ansible/playbooks_filters.html#omitting-undefined-variables-and-parameters ),但其实已经有例子了。当想要在with_items循环处理时,大多数情况下只想指定其中一个,而其他的如文件权限或者所有者之类的指定都是不必要的。在此之前,要么给每个item赋值,要么使用默认值来进行设置。但使用ommit,可以使未定义的情况下整个项目都不存在。非常方便(其实直到现在我才知道…)

列表操作 (List operations)

最小值,最大值

http://docs.ansible.com/ansible/playbooks_filters.html#list-filters
该网页介绍了如何在Ansible中使用列表过滤器来提取最小值和最大值。

独特,联盟… , …)

以下是用中文本地化的方式转述:
可以使用集合理论过滤器来计算两个列表之间的并集、差集等操作。

随机的 de)

http://docs.ansible.com/ansible/playbooks_filters.html#random-number-filter 中的数字将从列表中随机选择。您可以提取包括在数字内的随机值或指定步长的随机值(例如,每10个单位的100个值)。这在与 cron 模块一起使用时非常方便,可以避免在多台服务器上同时执行。文档中还有 cron 的示例。

{{ 60 | random(step=5) }} * * * * /some/command

洗牌

请参考以下链接以了解有关shuffle过滤器的详细信息:
http://docs.ansible.com/ansible/playbooks_filters.html#shuffle-filter

确认动作

- hosts: all
  gather_facts: no
  vars:
    aaa:
      - A
      - B
      - C
    bbb:
      - A
      - B
      - C
      - X
      - Y
      - Z
    ccc: [1,2,3,4,5]
    ddd: [1,1,2,2,3,3,4,4,5,5]
    eee: [1,2,3]
    fff: [3,4,5]
  tasks:
    - debug: msg="[aaa] {{ aaa }}"
    - debug: msg="[bbb] {{ bbb }}"
    - debug: msg="[ccc] {{ ccc }}"
    - debug: msg="[ddd] {{ ddd }}"
    - debug: msg="[random] {{ aaa | random }}"
    - debug: msg="[unique] {{ ddd | unique }}"
    - debug: msg="[union1] {{ aaa | union(bbb) }}"
    - debug: msg="[union2] {{ aaa | union(ccc) }}"
    - debug: msg="[intersect] {{ bbb | intersect(aaa) }}"
    - debug: msg="[difference] {{ bbb | difference(aaa) }}"
    - debug: msg="[symmetric_difference] {{ eee | symmetric_difference(fff) }}"
    - debug: msg="[max] {{ ccc | max}}"
    - debug: msg="[min] {{ ccc | min}}"
    - debug: msg="[shuffle] {{ bbb | shuffle}}"

准备一下

ansible-playbook -i localhost, test.yml

如果那样做,就可以进行操作确认了。

进行数学运算

根据文档,Ansible中似乎可以使用指数、平方根和对数。

其他过滤器

请确认相关内容包括IP地址、评论字段和哈希处理,详见以下链接:http://docs.ansible.com/ansible/playbooks_filters.html

加入是有使用场合的哦

{{ list | join(" ") }}

如果要合并的列表是简单列表,这个方法就可以。但如果是哈希/字典列表的话,怎么处理呢?

aaa:
  - en: apple
    ja: ringo
  - en: orange
    ja: mikan
  - en: grape
    ja: budou

如果有一个变量,并且只想连接 en 或 ja,可以按照下面的方法进行。
也可以连接两个变量。

{{ aaa | map(attribute='en') | join(',') }}
{{ aaa | map(attribute='ja') | join(',') }}

结果

apple,orange,grape
ringo,mikan,budou

关于map()函数,请参考http://jinja.pocoo.org/docs/dev/templates/#map。

循环处理

最后是一个循环处理。

这里有各种任务(task)的循环(Loop)的介绍,嗯,没想到还有这种功能,让我们来看一下吧。任务(task)的with_xxx参数有很多不同类型的值,when条件也可以用在with_xxx的每个值上。
http://docs.ansible.com/ansible/playbooks_loops.html

请点击此处了解有关在模板文件中进行循环处理的信息:
http://jinja.pocoo.org/docs/dev/templates/

{% for item in items %}
{% if item.key1 == 'AAA' %}
  {{ item.key1 }} {{ item.key2 }}
{% elif item.key1 == 'BBB' %}
  ...
{% else %}
  ...
{% endif %}
{% endfor %}

在不同的编程语言中,我们通常会用到 if、elif、else 和 endif 这些条件语句。(当我们使用多种语言时,我们常常会为 elif 部分犹豫不决,到底应该用哪个来着?)

当需要为循环的每个项目编号时,可以使用loop.index(从1开始)和loop.index0(从0开始)这两个变量。
还有用于标识第一个和最后一个的布尔变量,分别为loop.first和loop.last。

{% for item in items %}
{% if loop.first %}Begin{% endif %}
{{ loop.index }}: {{ item }}
{% if loop.last %}End{% endif %}
{% endfor %}

请点击此处查看详细信息:http://jinja.pocoo.org/docs/dev/templates/#list-of-control-structures。

逃生

如果模板文件中包含{{或{%,请使用raw。

{% raw %}
...
{% endraw %}

总结

雖然我沒有任何重點地寫下來,但如果我再有想法,我會繼續寫下去。
因為看起來我的日曆還有空白的時間。

广告
将在 10 秒后关闭
bannerAds