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

广告
将在 10 秒后关闭
bannerAds