介绍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 %}
总结
雖然我沒有任何重點地寫下來,但如果我再有想法,我會繼續寫下去。
因為看起來我的日曆還有空白的時間。