43

基于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被传递,那么变量值将是

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 }

所以在我创建的myroletemplate目录中vars

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

模板/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如下方式执行此操作

{{ '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 playbook中动态分配价值的任何其他方式?

4

3 回答 3

44

我相信有一种更聪明的方法可以做你想做的事,但这应该可行:

- 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

于 2014-04-24T19:31:01.553 回答
35

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' }}"
于 2017-01-02T11:29:29.573 回答
20

我首先建议你退后一步,看看组织你的戏剧不需要如此复杂,但如果你真的这样做,请使用以下内容:

   vars:
    myvariable: "{{[param1|default(''), param2|default(''), param3|default('')]|join(',')}}"
于 2014-07-01T03:23:32.880 回答