Ansible (2.9) playbook 使用哪个 YAML 版本?

问题描述 投票:0回答:1

为什么选择 YAML 1.2

根据 Ansible 文档文章 YAML 语法

允许的转义列表可以在 YAML 规范中的“转义序列”(YAML 1.1) 或“转义字符”(YAML 1.2) 下找到。

这可能暗示 Ansible 实际上确实根据 YAML 1.2 解析 playbook。此外,第一个 Ansible 版本于 2012 年发布,距离 YAML 1.1 明显被弃用(?)而转而使用 YAML 1.2 已经过去了 3 年。

为什么选择 YAML 1.1

另一方面,同一篇文档文章提到了这一点:

布尔转换很有帮助,但是当您想要文字

yes
或其他布尔值作为字符串时,这可能会出现问题。在这些情况下只需使用引号。 [...]

如果我理解正确的话,

"yes"
到(布尔)true的这种转换已在YAML 1.2中被删除

此外,

yes
(表面上评估为布尔值 true)在官方用户指南中随处可见(随机选择的示例:此处)。


我非常简单地浏览了解析器代码(在 Ansible 2.9 版本中),它们似乎使用自定义解析器,而不是第三方库。评论很少,我看不懂。

这个问题有明确的答案吗?我觉得很奇怪的是,面向 YAML 的软件(YAML 是一种对语法准确性“众所周知”敏感的语言,说得好听)没有明确说明它根据哪个版本的标准来解析其配置文件。

ansible yaml
1个回答
0
投票

这是我的处理方式:

首先我安装 ruamel 工具

- name: "install_missing_libraries : install the ruamel.yaml python module" ansible.builtin.shell: | pip install ruamel.yaml pip install ruamel.yaml.cmd

然后我在角色中使用它

################################################################ # # This role saves a data strucuture as a nicely formatted yaml # # It takes in input : # # - save_as_yaml_path # The path of the target file. # NB) If the file exists, it will be replaced # # - save_as_yaml_data_structure # The data structure that will be serialized in yaml format # ################################################################ - name: "save_as_yaml : Delete the target file if it exists" ansible.builtin.file: state: absent path: "{{ save_as_yaml_path }}" - name: "save_as_yaml : Create the target file" ansible.builtin.file: state: "touch" path: "{{ save_as_yaml_path }}" ################################################################ # # In this step we force the default_style='\"' to have a # file we are sure the ruamel tools used in the next step wiil # correctly understand # ################################################################ - name: "save_as_yaml : Serialize the data structure in the target file" ansible.builtin.lineinfile: path: "{{ save_as_yaml_path }}" line: "{{ save_as_yaml_data_structure | to_nice_yaml(indent=2, default_style='\"') }}" ################################################################ # # This step seems to only format the yaml file but it does more and its essential. # # The ansible plugins are based on the PyYaml library which use the spec 1.1 of YAML, and then have an interpretation on the way to serialize the differents types of data (string, numbers, ...). # # the problem is that this way of serialize isn't compatible with the librairies version used by java. Exemple # # name: 00019 # # is considered as a string in ansible but as a number in java. Then we obtains 19.0 in java instead of "00019" # # The problem is that the PyYaml library don't put quotes around 00019 because for that librairy it isn't required by the spec. # # Then the fact to post-process the generated yaml using the tool ruamel will format it in the YAML 1.2 format compatible with java # ################################################################ - name: "save_as_yaml : Format the generated yaml" when: ruamel_yaml_cmd_path is undefined ansible.builtin.shell: | yaml rt --indent 2 --width 1024 --save {{ save_as_yaml_path }} rm {{ save_as_yaml_path }}.orig - name: "save_as_yaml : Format the generated yaml" when: ruamel_yaml_cmd_path is defined ansible.builtin.shell: | {{ ruamel_yaml_cmd_path }}/yaml rt --indent 2 --width 1024 --save {{ save_as_yaml_path }} rm {{ save_as_yaml_path }}.orig

注意:从 AWX 模板运行 ansible 脚本时使用“ruamel_yaml_cmd_path”变量。使用 AWX,ansible 脚本在“AWX EE”容器中执行。 ruamel 工具安装在“/runner/.local/bin”中。然后我们传递以下额外变量
ruamel_yaml_cmd_path:/runner/.local/bin
但在开发阶段,我在 WSL 中运行 ansible 脚本,并且不需要该变量。

然后角色就这样使用了

- name: Save the encrypted application properties file include_role: name: save_as_yaml vars: save_as_yaml_path: './roles/tests/files/application_crypted_debug.yml' save_as_yaml_data_structure: "{{ application_yaml_content }}"

我希望它可以帮助别人。

问候 克劳德

© www.soinside.com 2019 - 2024. All rights reserved.