Ansible: 根据条件使用 if 语句而不是 when 来根据条件进行值的更改
在将trz文件远程展开时,根据操作系统类型来更改源文件时,使用when命令会变得冗长,但使用jinja2的if语句等可以更简洁地编写。
当使用”when”时会变得冗长。
- when: ansible_distribution == 'CentOS'
unarchive:
src: foo.trz
dest: /qux
- when: ansible_distribution == 'Ubuntu'
unarchive:
src: bar.trz
dest: /qux
- when: ansible_distribution not in ['CentOS', 'Ubuntu']
unarchive:
src: baz.trz
dest: /qux
使用jinja2的if条件
当使用jinja2的if语句时,可以更简洁地进行编写。
- unarchive:
src: >-
{%- if ansible_distribution == 'CentOS' -%} foo.trz
{%- elif ansible_distribution == 'Ubuntu' -%} bar.trz
{%- else -%} baz.trz
{%- endif -%}
dest: /qux
-
- >- はyamlの構文で、続く節を空白で繋ぎ、最後に改行を付けない。なお、インデントされた全体を””にて囲むならば>-を削除可能。
-
- {%- -%}はjinja2の構文で、内側ではjinja2の構文を含めることが可能、外側では前後の空白、改行を除去する。
従って、もちろんfoo.trzなどを次の行としても可。お好みで。
jinja2では、if, elif, else, endif, for, endfor, setなどが使用可能。
如果在playbook中使用jinja2的情况下需要考虑的事项。
-
- yamlそのものの構文をjinja2にて変更することはできない。
あくまでも値などyamlの一要素に対しての変更のみ。
這段文字的目的是介紹Jinja2,但我們也會附帶其他相應的方法。
Option 1: 使用Hash、字典或者映射来进行对应。
- vars:
dist2src:
CentOS: foo.trz
Ubuntu: bar.trz
else: baz.trz
unarchive:
src: '{{ dist2src[ansible_distribution]|default(dist2src.else) }}'
dest: /qux
在task vars中以Hash(散列)定义匹配项,然后在正文中仅作参考。在这个例子中可能是最合理的选择。
方案3:通过Python中的if语句处理
- unarchive:
src: >-
{{
'foo.trz' if ansible_distribution == 'CentOS' else
'bar.trz' if ansible_distribution == 'Ubuntu' else
'baz.trz'
}}
dest: /qux
也可以这样写。
参考资料在哪里?
选项1: 通过三元滤波器进行适应性解决
- unarchive:
src: >-
{{
( ansible_distribution == 'CentOS' )|ternary ( 'foo.trz' , (
( ansible_distribution == 'Ubuntu' )|ternary ( 'bar.trz' ,
'baz.trz' )
))
}}
dest: /qux
使用可用于三元过滤器的三个运算符的示例。
虽然可能,但这样写不易阅读。
将 ansible_distribution == xxxx 用括号括起来是因为过滤器的优先级高于 ==。
对上述情况的个人感受
在Ansible中有很多可用的方法,但是不知道应该在哪里进行调查,只能不断地搜索和尝试吗?
在下面的选择中,请用中文进行翻译
参考 – Can be translated as:
1. 参照
2. 借鉴
3. 参考资料
-
- プログラマーのための YAML 入門 (初級編)
-
- jinja2: Template Designer Documentation
ほげめも: Ansible の Jinja2 を活用する <- リスト(Array)やディレクトリー(Hash)に値を設定する場合には要注意。set _ = は set dummy = などと置き換えると混乱しないか。
Ansibleのregisterから任意のディクショナリやリストを生成する – Qiita
Ansibleで条件を使用して変数値を設定する方法を教えてください。 – 答えられる
Other Useful Filters