web-dev-qa-db-ja.com

Ansible Playbookで動的変数を記述する方法

extra varsパラメーターに基づいて、変数値をansible playbookに書き込む必要があります

ansible-playbook playbook.yml -e "param1=value1 param2=value2 param3=value3"

param1のみが渡された場合

myvariable: 'param1'  

param1、param2のみが渡された場合

myvariable: 'param1,param2' 

param1、param2、paramが渡された場合、変数値は

myvariable: 'param1,param2,param3' 

テンプレートを使用して変数を動的に作成しようとすると、プレイブックは常に以前の変数値を取ります。ただし、dest=roles/myrole/vars/main.yml内では、正しい値が書き込まれます。

ここで試してみるもの

- hosts: local
  user: roop
  gather_facts: yes
  connection: local

  tasks: 

  - template: src=roles/myrole/templates/myvar.j2 dest=roles/myrole/vars/main.yml

  - debug: var=myvariable

  roles:
        - { role: myrole }

myroleディレクトリ内にtemplatevarsを作成しました

- roles
  - myrole
    - vars/main.yml
    - templates/myvar.j2 

templates/myvar.j2

{% if param1 is defined and param2 is defined and param3 is defined %}
  myvariable: 'param1,param2,param3'
{% Elif param1 is defined and param2 is defined %}
  myvariable: 'param1,param2'
{% Elif param1 is defined %}
  myvariable: 'param1'
{% else %}
  myvariable: 'default-param'
{% endif %} 

私が知っているように、2つの条件のみであれば、以下のようにinline expressionを使用してこれを行うことができます

{{ 'param1,param2' if param1 is defined and param2 is defined else 'default-param' }}

<do something> if <something is true> else <do something else>

上記のようにif - Elif - elseinline expressionは可能ですか?または、ansibleプレイブックで値を動的に割り当てる他の方法はありますか?

33
Roopendra

あなたが望むことをするためのよりスマートな方法があると確信していますが、これはうまくいくはずです:

- name         : Test var
  hosts        : all
  gather_facts : no
  vars:
    myvariable : false
  tasks:
    - name: param1
      set_fact:
        myvariable: "{{param1}}"
      when: param1 is defined

    - name: param2
      set_fact:
        myvariable: "{{ param2 if not myvariable else myvariable + ',' + param2 }}"
      when: param2 is defined

    - name: param3
      set_fact:
        myvariable: "{{ param3 if not myvariable else myvariable + ',' + param3 }}"
      when: param3 is defined

    - name: default
      set_fact:
        myvariable: "default"
      when: not myvariable

    - debug:
       var=myvariable

お役に立てば幸いです。変数を動的に構築し、イテレータでこれを行うことができるかどうかはわかりません。しかし、小さなpythonコードまたは他の言語を記述して、それをansibleにプラグインすることもできます。

39
DomaNitro

my_var:宣言された変数

VAR:値がチェックされる変数

param_1、param_2:変数VARの値

value_1、value_2、value_3:my_varの値に従ってmy_varに割り当てられる値

my_var: "{{ 'value_1' if VAR == 'param_1' else 'value_2' if VAR == 'param_2' else 'value_3' }}"
23
AnshBikram

私はまず、そのような複雑さを必要としないように、一歩下がってプレイを整理することをお勧めしますが、実際にそうする場合は、次を使用してください:

   vars:
    myvariable: "{{[param1|default(''), param2|default(''), param3|default('')]|join(',')}}"
15
bcoca