如何在Ansible剧本中编写动态变量 [英] How to write dynamic variable in 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,param3 ,则变量值将为
If param1,param2,param3 are passed then variable value will be
myvariable: 'param1,param2,param3'
当我尝试通过模板动态创建变量时,我的剧本总是采用以前的变量值.但是在dest=roles/myrole/vars/main.yml
内它的书写正确值.
When I try to create variable dynamically through template then my playbook always takes previous variable value. But inside dest=roles/myrole/vars/main.yml
its writing correct value.
我在这里尝试
- 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
So inside myrole directory I have created template
and 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 %}
据我所知,如果只有两个条件,那么可以使用inline expression
进行此操作
As I know if only two condition then I can do this using inline expression
like below
{{ 'param1,param2' if param1 is defined and param2 is defined else 'default-param' }}
<do something> if <something is true> else <do something else>
是否可以像上述在inline expression
中的if - elif - else
.还是通过其他方法在ansible剧本中动态分配价值?
Is it possible if - elif - else
in inline expression
like above. Or any other way to assign value dynamically in ansible playbook?
推荐答案
我敢肯定有一种更聪明的方式来做您想做的事,但这应该可行:
I am sure there is a smarter way for doing what you want but this should work:
- 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
Hope that helps. I am not sure if you can construct variables dynamically and do this in an iterator. But you could also write a small python code or any other language and plug it into ansible
这篇关于如何在Ansible剧本中编写动态变量的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!