【问题标题】:Set list item default with Ansible使用 Ansible 设置列表项默认值
【发布时间】:2014-09-19 23:40:39
【问题描述】:

使用 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 }} 之类的东西)。

我可以为角色中的每个任务设置使用default 过滤器,但我想为角色设置一次,然后在整个角色中使用它。

有没有办法做到这一点?

【问题讨论】:

  • 如果您期望 jinja2 模板中的值,那么您可以使用{{ value | default('...') }}。更好的描述在这里jinja.pocoo.org/docs/dev/templates/#default
  • @cdr 是的,但我必须在我想使用它的每个位置都这样做。

标签: ansible


【解决方案1】:

我认为您最好的选择是定义第二个变量并在您的任务中使用它:

item_b: "{{ list1.item1.b  | default('a' + list1.item1.a) }}"

【讨论】:

  • 当我需要遍历任务中的列表时,这将如何工作?
  • 这是一个 hack,但你可以这样做 {{ item.item1.b | default(...) }},然后在循环中使用 {{item_b}}。 jinja 模板被延迟评估,因此您可以在循环中使用它之前在另一个 var 中引用 with_items' {{item}}。另一个选项是第二个列表,其中包含您想要的默认值。
  • 我没有意识到您可以像这样在循环上下文之外引用“项目”。我得试试看。你是对的,虽然它看起来像一个黑客。
【解决方案2】:

假设你有角色 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 中设置这些默认值。

【讨论】:

  • 如果我正确理解了您的答案,则它不适用于循环或任意长的列表。
  • 你是对的。但这是为角色仅设置一次默认值的唯一方法。
猜你喜欢
  • 1970-01-01
  • 2013-11-23
  • 2013-06-02
  • 2017-02-26
  • 2020-07-06
  • 2018-12-06
  • 2013-10-23
  • 2017-03-31
  • 2020-08-08
相关资源
最近更新 更多