使用Ansible设置列表项默认值
使用Ansible,有没有办法为列表项设置默认值? 例如,如果我在我的group_vars文件中定义一个列表,如下所示:使用Ansible设置列表项默认值,ansible,Ansible,使用Ansible,有没有办法为列表项设置默认值? 例如,如果我在我的group_vars文件中定义一个列表,如下所示: list1: item1: a: 1 item2: a: 2 b: a2 ... #the list can contain more than two items. 然后在某个角色中,我想使用它,但是如果没有设置list1.item1.b,我希望它使用一个计算出的默认值,例如{a+list1.item1.a} 我可以对角色中的每个任务设置使
list1:
item1:
a: 1
item2:
a: 2
b: a2
...
#the list can contain more than two items.
然后在某个角色中,我想使用它,但是如果没有设置list1.item1.b,我希望它使用一个计算出的默认值,例如{a+list1.item1.a}
我可以对角色中的每个任务设置使用默认筛选器,但我希望为角色设置一次,然后在整个角色中使用它
有办法做到这一点吗?我认为您最好的选择是定义第二个变量,并在任务中使用它:
item_b: "{{ list1.item1.b | default('a' + list1.item1.a) }}"
让我们假设你有一个角色
---
name: execute step 1
copy:
src="{{list1_item1_a_parameter}}"
dest="{{list1_item2_b_parameter}}"
name: execute step 2
copy:
src="{{list1_item1_a_parameter}}"
dest="{{list1_item2_a_parameter}}"
现在,让我们来看看你怎么称呼这个角色
---
...
roles:
- { role: A,
list1_item1_a_parameter: '{{list1.item1.a.parameter | default("some default") }}'
list1_item2_a_parameter: '{{list1.item2.a.parameter | default("some default") }}'
list1_item2_b_parameter: '{{list1.item2.a.parameter | default("some default") }}'
}
您也可以在您的角色内部的vars/main.yml上设置这些默认值。如果您希望在jinja2模板中获得该值,那么您可以执行{{value | default'.''}}。这里更好的描述@cdr是的,但我必须在我想使用它的每个位置都这样做。当我需要在任务中循环列表时,这将如何工作?这是一个黑客攻击,但您可以执行{{item.item1.b | default…},然后在循环中使用{{item_b}。jinja模板是惰性计算的,因此在循环中使用之前,您可以在另一个var中引用_items'{{item}}}。另一个选项是第二个列表,它已经具有您想要的默认值。我不知道您可以像这样引用循环上下文之外的项。我得试试。你是对的,虽然这看起来确实像是一个黑客。如果我正确理解你的答案,它将不会与循环或任意长的列表一起工作。你是对的。但这是为角色只设置一次默认值的唯一方法。