Ansible根据另一个字典属性的值有条件地设置变量值

时间:2017-01-29 11:57:02

标签: ansible

我有一个词典结构,我包括在我的角色执行中,我试图根据另一个值在其中一个词典中设置一个项目。 以下示例中发生的情况是,在" another_host"上运行时执行将失败。因为它没有名为" value2"在字典中,Ansible给出了"' dict对象'没有属性"错误。

我不确定是不是因为我试图做一些与Ansible的设计相冲突的事情,或者只是一个更简单的方法来实现我和我#39;我试图这样做。

dict1:
  abc:
    name: abc
    value: something
  xyz:
    name: xyz
    value: "{{ dict2[inventory_hostname].values.value2 | default(blah) }}"

dict2:
  some_host:
    values:
      value1: aaa
      value2: bbb
  another_host:
    values:
      value1: aaa

1 个答案:

答案 0 :(得分:0)

我回答了类似的问题here

首先,避免对dict键使用values名称,因为它是系统“关键字”。在您的示例中,您尝试访问value2系统方法的values()属性,这肯定会失败。

其次,|default('def')构造可以正常工作,如果您的顶级变量未定义(示例中为dict2)或底层键未定义(示例中为value2)。所以,没有value2就好了。

但是如果您有中级键未定义,例如:

top:
  middle1:
    leaf1: 1
  middle3:
    leaf3: 3

top.middle2.leaf2 | default('def')会出错。在这种情况下,将每个级别默认为空dict {}可以完成工作:((top | default({})).middle2 | default({})).leaf2 | default('def')