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.有没有办法防止这种警告?
来到这里,我将不同意其他答案并支持YAML合并.Playbook布局非常主观,最适合您的取决于您需要描述的配置.
是的,ansible 与includes或with_items/with_dict 循环具有类似合并的功能.
我为YAML合并找到的用例是任务只有少数异常值,因此可以覆盖的默认值是最紧凑和可读的表示.让ansible抱怨完全有效的语法令人沮丧.
相关安莎代码中的评论表明,开发者知道比用户更好.
大部分来自yaml.constructor.SafeConstructor.我们在这里复制它,以便我们可以在用户有重复的dict键时警告用户(pyyaml默默允许覆盖键)
PyYAML默默地允许"覆盖"密钥,因为密钥优先级在YAML标准中明确处理.