在Ansible 2中防止重复键警告

udo*_*dan 4 ansible ansible-playbook ansible-2.x

我在我的角色中使用了很多YAML锚点和引用来将逻辑保留在一个位置而不是在多个任务中重复自己.以下是一个非常基本的例子.

- &sometask
  name: "Some Task"
  some_module: with a lot of parameters
  with_items: list_A

- <<: *sometask
  name: "Some OTHER Task"
  with_items: list_B
Run Code Online (Sandbox Code Playgroud)

这个例子可能没有显示它实际上是如何有用的,但确实如此.想象一下,你循环遍历一个dicts列表,将各个键从每个dict传递给模块,可能有相当复杂的"when","failed_when"和"changed_when"条件.你只想干.

因此,不是将整个任务定义两次,而是使用锚点到第一个任务,并将其所有内容合并到一个新任务中,然后覆盖不同的部分.这很好.

需要明确的是,这是基本的YAML功能,与Ansible本身无关.

上面定义的结果(以及Ansible在解析YAML文件时看到的内容)将评估为:

- name: "Some Task"
  some_module: with a lot of parameters
  with_items: list_A

- name: "Some Task"
  some_module: with a lot of parameters
  with_items: list_A
  name: "Some OTHER Task"
  with_items: list_B
Run Code Online (Sandbox Code Playgroud)

Ansible 2现在有一个功能,可以在任务中多次定义键时进行投诉.它仍然有效,但在运行playbook时会产生不必要的噪音:

TASK [Some OTHER Task] *******************************************************
 [WARNING]: While constructing a mapping from /some/file.yml, line 42, column 3, found a duplicate dict key (name).  Using last defined value only.

 [WARNING]: While constructing a mapping from /some/file.yml, line 42, column 3, found a duplicate dict key (with_items).  Using last defined value only.
Run Code Online (Sandbox Code Playgroud)

Ansible配置允许防止deprecation_warnings和command_warnings.有没有办法防止这种警告?

Phi*_*hil 7

来到这里,我将不同意其他答案并支持YAML合并.Playbook布局非常主观,最适合您的取决于您需要描述的配置.

是的,ansible 与includes或with_items/with_dict 循环具有类似合并的功能.

我为YAML合并找到的用例是任务只有少数异常值,因此可以覆盖的默认值是最紧凑和可读的表示.让ansible抱怨完全有效的语法令人沮丧.

相关安莎代码中的评论表明,开发者知道比用户更好.

大部分来自yaml.constructor.SafeConstructor.我们在这里复制它,以便我们可以在用户有重复的dict键时警告用户(pyyaml默默允许覆盖键)

PyYAML默默地允许"覆盖"密钥,因为密钥优先级在YAML标准中明确处理.


Mih*_*dor 6

从 Ansible 2.9.0 开始,这可以通过将ANSIBLE_DUPLICATE_YAML_DICT_KEY环境变量设置为 来实现ignore。此变量的其他可能值是warn,这是默认值并保留原始行为,以及error,这会使剧本执行失败。

有关实现的详细信息,请参阅此拉取请求。