【问题标题】:How to write dynamic variable in Ansible playbook如何在 Ansible playbook 中编写动态变量
【发布时间】:2014-04-24 08:55:06
【问题描述】:

基于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 }

所以在 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 %} 

我知道如果只有两个条件,那么我可以使用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 playbook中动态分配价值的任何其他方式?

【问题讨论】:

    标签: jinja2 ansible ansible-playbook


    【解决方案1】:

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

    - 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

    【讨论】:

    • @Roopendra 用 16 行代码来连接 3 个值的列表远非好。
    • 同意@ceving 但有时我们专注于解决方案,然后再进行优化。那个时候这是唯一的解决办法。如果您能分享优化的答案,我会很高兴。也许它也会对其他人有所帮助。
    • 假设您有 100 台主机,即使所有主机的值保持不变,这个事实也会为每个主机设置 100 次。您可以使用一个变量,它将设置一个全局事实。
    【解决方案2】:

    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' }}"
    

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

      • 感谢您的回答。按照您的建议更改 myvariable 后获取输出 ",,"
      • 试试rejecttests{{ [param1, param2, param3, param4]|reject('undefined')|join(',') }}
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-06-20
      • 1970-01-01
      • 1970-01-01
      • 2023-01-11
      • 2013-10-22
      • 1970-01-01
      相关资源
      最近更新 更多