Ansible 如何更新易趣库存中的dict值

Ansible 如何更新易趣库存中的dict值,ansible,Ansible,我有一个角色测试 在roles/test/defaults/mail.yaml中 # defaults file for test data: a: hello 如何覆盖库存文件中data.a的值 我在清单文件中尝试了以下语法,但不起作用 1) (二) 有没有正确的方法只覆盖一个特定的键而不是整个字典。一般来说,你不能做你想做的事,尽管有一个简单的方法。您可以在链接的文档中了解到这一点,但我不建议启用它,因为这将使您的playbook的行为依赖于ansible配置,无论它在何处运行,如

我有一个角色测试

在roles/test/defaults/mail.yaml中

# defaults file for test
data: 
  a: hello
如何覆盖库存文件中
data.a
的值

我在清单文件中尝试了以下语法,但不起作用

1)

(二)


有没有正确的方法只覆盖一个特定的键而不是整个字典。

一般来说,你不能做你想做的事,尽管有一个简单的方法。您可以在链接的文档中了解到这一点,但我不建议启用它,因为这将使您的playbook的行为依赖于ansible配置,无论它在何处运行,如果(a)您在另一台机器上运行playbook,而忘了包括适当的配置,或者(b)您的playbook可能会引起意外如果你以外的人管理剧本

在标准用法中,如果在
defaults/main.yml
中有:

data:
  a: something
  b: something else
data:
  a: foo
  b: bar
您可以覆盖清单中的
数据
变量本身,但如果您想要字典之类的结构化变量,则需要使用YAML清单格式:

all:
  children:
    master:
      hosts:
        Master:
          ansible_host: 127.0.0.1
          data:
            a: another thing
使用此清单,
数据
的值将是
{“a”:“另一件事”}

您可以通过为默认值和主机特定替代使用不同的变量名来解决此问题。例如,如果在
默认值/main.yml
中有:

data:
  a: something
  b: something else
data:
  a: foo
  b: bar
在您的库存中,或在
主机变量
组变量
中,您有:

host_data:
  a: red
  c: bucket
然后,您可以在访问数据时使用
组合
过滤器:

{{ data|combine(host_data) }}
这将计算为一个字典,如下所示:

{
  "a": "red",
  "b": "bar",
  "c": "bucket"
}
在示例任务中:

- name: iterate over the keys and values of our variable
  debug:
    msg: "{{ item.key }} is {{ item.value }}"
  loop: "{{ (data|combine(host_data))|dict2items }}"
鉴于我们的上述样本数据,将产生:

TASK [iterate over the keys and values of our variable] ***************************************
ok: [Master] => (item={'key': u'a', 'value': u'red'}) => {
    "msg": "a is red"
}
ok: [Master] => (item={'key': u'c', 'value': u'bucket'}) => {
    "msg": "c is bucket"
}
ok: [Master] => (item={'key': u'b', 'value': u'bar'}) => {
    "msg": "b is bar"
}

一般来说,你不能做你想做的事,尽管有一个问题。您可以在链接的文档中了解到这一点,但我不建议启用它,因为这将使您的playbook的行为依赖于ansible配置,无论它在何处运行,如果(a)您在另一台机器上运行playbook,而忘了包括适当的配置,或者(b)您的playbook可能会引起意外如果你以外的人管理剧本

在标准用法中,如果在
defaults/main.yml
中有:

data:
  a: something
  b: something else
data:
  a: foo
  b: bar
您可以覆盖清单中的
数据
变量本身,但如果您想要字典之类的结构化变量,则需要使用YAML清单格式:

all:
  children:
    master:
      hosts:
        Master:
          ansible_host: 127.0.0.1
          data:
            a: another thing
使用此清单,
数据
的值将是
{“a”:“另一件事”}

您可以通过为默认值和主机特定替代使用不同的变量名来解决此问题。例如,如果在
默认值/main.yml
中有:

data:
  a: something
  b: something else
data:
  a: foo
  b: bar
在您的库存中,或在
主机变量
组变量
中,您有:

host_data:
  a: red
  c: bucket
然后,您可以在访问数据时使用
组合
过滤器:

{{ data|combine(host_data) }}
这将计算为一个字典,如下所示:

{
  "a": "red",
  "b": "bar",
  "c": "bucket"
}
在示例任务中:

- name: iterate over the keys and values of our variable
  debug:
    msg: "{{ item.key }} is {{ item.value }}"
  loop: "{{ (data|combine(host_data))|dict2items }}"
鉴于我们的上述样本数据,将产生:

TASK [iterate over the keys and values of our variable] ***************************************
ok: [Master] => (item={'key': u'a', 'value': u'red'}) => {
    "msg": "a is red"
}
ok: [Master] => (item={'key': u'c', 'value': u'bucket'}) => {
    "msg": "c is bucket"
}
ok: [Master] => (item={'key': u'b', 'value': u'bar'}) => {
    "msg": "b is bar"
}