使用“to_nice_yaml”过滤器时 Ansible 中的奇怪行为

Strange behavior in Ansible when using `to_nice_yaml` filter

我有一个 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 上尝试过此操作,两者都 运行ning 反对 Python 3.7.3。行为相同。

这是因为 031200527an 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'

在这种情况下也将引用键,但无条件引用标量