我需要一些帮助来理解为什么,当我为 Ansible 剧本创建一个 YAML 文件时,该文件完全反映了模块文档中指定的内容,当 Python 读取 YAML 时,列表和 list_items 没有被正确解析。
我的理解是,在阅读 Github 上有关 Ansible 模块的文档时,项目会显示在列中,以表示它们相对于它们上方和下方的项目的关系。此外,如果一个项目被定义为“ list / elements=dictionary ”,那么这意味着以下内容:
项目的键入必须通过添加冒号和空格来完成(这定义了“字典”项目)
下一行/后续行必须以相同的缩进级别(或更高级别)开始,并以连字符和空格开头(这表示“列表”项)
列表中项目的顺序必须严格遵守。
后续列表项必须与列表中的第一项处于同一缩进级别
如果列表中的任何给定子项是 ITSELF 另一个“ list / elements=dictionary ”项,则再次重复第 2 步。
(示例:取自cisco.ios.ios_ospfv2模块)所以如果“进程”的主要项目是由以下组成的“列表/元素=字典”:
- 区域(也是“列表/元素=字典”)
- 网络(也是“列表/元素=字典”)
- process_id(整数)
那么上述正确的 YAML 语法将是:
processes:
- areas:
- area_id: 0 ##dictionary_item
- authentication: ##dictionary_item
message_digest: true ##boolean
- network:
- address: '10.1.1.0' ##string
- area: '0' ##string
- wildcard_bits: 0.0.0.255. ##integer
- process_id: 1
然而,即使我在启动 Playbook 时没有收到任何 YAML 错误,但我确实收到了一堆晦涩的 Python 回溯。但是,如果我将代码更改为 THIS(见下文),它就可以工作!
processes:
- process_id: 1
areas:
- area_id: '0'
authentication:
message_digest: true
network:
address: 0.0.0.0
area: 0
wildcard_bits: 255.255.255.255
我的问题:
- 如果 list_items 的顺序很重要,为什么当我遵循模块文档中指定的顺序时我的文件不起作用……但是当忽略该顺序时它确实起作用(根据文档,“process_id”不应该是第一个)模块)?
- 我知道并非每个 list_item 都需要以连字符空格开头。但我确实认为第一个 list_item 需要这个。那么为什么(在我的第一个示例中)当我用连字符表示“网络”下的子项时我的剧本失败了......但是当我从这个列表中删除所有连字符时,它确实有效?但是,“区域”下的第一个 list_item 确实需要连字符??
(很抱歉这篇长文……我不知道能比这更进一步)