首页 > 解决方案 > 替代的 ansible 语法

问题描述

我看过一个看起来像这样的剧本:

- hosts:
  - foo
  - bar
  roles:
    - role: whatever

它有效,但从文档中我预计:

一个。主机将作为单个空格分隔的行给出,例如:

- hosts: foo bar

而不是一个列表。

湾。剧本中“roles”键的值将是一个列表,例如:

  roles:
    - whatever

而不是键:值对。

有人可以解释一下我在 yaml 中缺少什么,这使得这些替代方案在解析后就等效,或者在 ansible 文档中它解释了这些替代定义的什么地方?

标签: ansible

解决方案


TL;DR
用于hosts使用您和其他使用它的人最熟悉的语法。
对于,仅当您还想为角色设置其他属性时才roles需要该语法。role: <name>

更长的答案 我偶尔也想知道这个。
在文档部分Intro to Playbooks, Basics中,它说:

hosts行是一个或多个组或主机模式的列表,以冒号分隔,如使用模式文档中所述。

然而,它并没有明确提到这个列表也可以是一个空格分隔的字符串。

roles戏剧的属性而言,我认为替代语法变体是直截了当的。如果您只是传递一个名称(单个字符串),那么这显然是角色的名称。

如果你想传递额外的参数,比如变量,那么你需要创建一个字典。在文档中查看一起使用的两种语法的示例(搜索“角色可以接受其他关键字”)。

这两个问题的明确答案在源代码中:

这是解析hosts剧中列表的部分: https ://github.com/ansible/ansible/blob/devel/lib/ansible/playbook/play.py#L104-L116

这是为以下角色执行的部分roleshttps ://github.com/ansible/ansible/blob/devel/lib/ansible/playbook/role/definition.py#L68-L135

中还有另一个提示playbook/base.py#preprocess_data

不常用的方法对遗留术语进行一些预处理

例如,Play该类继承/覆盖了这个方法,就在我上面链接的代码片段的正下方。


推荐阅读