根据ansible

时间:2016-08-26 11:41:23

标签: ansible

我想在ansible的列表中添加一个项目,这取决于满足某些条件。

这不起作用:

  some_dictionary:
    app:
       - something
       - something else
       - something conditional # only want this item when some_condition == True
         when: some_condition

我不确定这样做的正确方法。我可以创建一个新任务以某种方式添加到app中的some_dictionary值吗?

4 个答案:

答案 0 :(得分:4)

您可以使用select()过滤掉所有 falsey 值,但请记住之后再应用list()过滤器。对我来说,这似乎是一种更容易理解的方法:

- name: Test
  hosts: localhost
  gather_facts: no
  vars:
      mylist:
        - "{{ (true)  | ternary('a','') }}"
        - "{{ (false) | ternary('b','') }}"
        - "{{ (true)  | ternary('c','') }}"
 
  tasks:
  - debug:
      var: mylist|select|list

结果:

TASK [debug] *****************************************************************************************************************************************************************************************************************
ok: [localhost] => {
    "mylist|select()|list": [
        "a", 
        "c"
    ]
}

用所需的任何测试替换(true)(false)

答案 1 :(得分:3)

我试图避免这种情况,但如果条件清单是绝对必要的,你可以使用这个技巧:

---
- hosts: localhost
  gather_facts: no
  vars:
    a: 1
    b: 1
    c: 2
    some_dictionary:
      app: "{{ '[\"something\", \"something else\"' + (a + b == c) | ternary(', \"something conditional\"',' ') + ']' }}"
  tasks:
    - debug: var=some_dictionary.app

它将形成一个类似数组的字符串(["item1","item2","item3"]),并且ansible变量templator会在分配给app之前将其转换为列表。

答案 2 :(得分:2)

你是否有必要一次性完成所有事情?

如果您指定要在单独的变量中添加的附加项目,这非常简单,因为您可以执行list1 + list2。

---
- hosts: localhost
  gather_facts: False
  connection: local
  vars:
    mylist:
      - one
      - two
    mycondition: False
    myconditionalitem: foo
  tasks:
    - debug:
        msg: "{{ mylist + [myconditionalitem] if mycondition else mylist }}"

答案 3 :(得分:0)

根据康斯坦丁的解决方案,我开发了以下内容:

- hosts: localhost
  gather_facts: no
  vars:
    a: "{{ True if var1|d(True) else False }}"
    b: "{{ True if var2|d(False) else False }}"
    n: "{{ True if var2|d(True) else False }}"
    some_list: "{{ '[' +
                     a|ternary('\"item1\",',' ') +
                     b|ternary('\"item2\",',' ') +
                     n|ternary('\"itemN\",',' ') + ']' }}"
  tasks:
    - debug: var=some_list

这将创建一个包含项目" item1"的列表。直到" itemN",但每个项目仅在相应的标志扩展为' True'时附加。

希望,这有帮助。