我想在ansible的列表中添加一个项目,这取决于满足某些条件。
这不起作用:
some_dictionary:
app:
- something
- something else
- something conditional # only want this item when some_condition == True
when: some_condition
我不确定这样做的正确方法。我可以创建一个新任务以某种方式添加到app
中的some_dictionary
值吗?
答案 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'时附加。
希望,这有帮助。