我有一个 ansible 剧本,它首先使用 set_fact
初始化一个事实,然后是一个使用该事实并从中生成 YAML 文件的任务。
剧本看起来像这样
- name: Test yaml output
hosts: localhost
become: true
tasks:
- name: set config
set_fact:
config:
A12345: '00000000000000000000000087895423'
A12352: '00000000000000000000000087565857'
A12353: '00000000000000000000000031200527'
- name : gen yaml file
copy:
dest: "a.yaml"
content: "{{ config | to_nice_yaml }}"
实际输出
当我运行剧本时,a.yaml 中的输出是
A12345: 00000000000000000000000087895423
A12352: 00000000000000000000000087565857
A12353: '00000000000000000000000031200527'
请注意,只有最后一行的值包含在引号中
预期输出
预期输出是
A12345: '00000000000000000000000087895423'
A12352: '00000000000000000000000087565857'
A12353: '00000000000000000000000031200527'
所有值都应加引号。
我一生都无法弄清楚为什么只有最后一行的值用单引号打印。
我已经在 Ansible 版本 2.7.7 和版本 2.11.12 上尝试过此操作,两者都针对 Python 3.7.3 运行。行为是相同的。
最佳答案
这是因为031200527
是an octal number ,而 087895423
则不需要,因此,八进制标量需要引用,但其他值不需要,因为前导零在 yaml 中的解释方式与 00hello
完全相同 -只是 ascii 0
后跟其他 ascii 字符
如果它真的让你很烦恼,并且出于某种原因必须引用标量,to_nice_yaml
接受相同的 kwargs as does pyyaml.dump
:
- debug:
msg: '{{ thing | to_nice_yaml(default_style=quote) }}'
vars:
quote: "'"
thing:
A1234: '008123'
A2345: '003123'
在这种情况下也会引用键,但无条件引用标量
关于ansible - 使用 `to_nice_yaml` 过滤器时 Ansible 中的奇怪行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72371849/