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ディレクトリ内にtemplate
とvars
を作成しました
- 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 - else
のinline expression
は可能ですか?または、ansibleプレイブックで値を動的に割り当てる他の方法はありますか?
あなたが望むことをするためのよりスマートな方法があると確信していますが、これはうまくいくはずです:
- 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にプラグインすることもできます。
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' }}"
私はまず、そのような複雑さを必要としないように、一歩下がってプレイを整理することをお勧めしますが、実際にそうする場合は、次を使用してください:
vars:
myvariable: "{{[param1|default(''), param2|default(''), param3|default('')]|join(',')}}"