ansible - 使用 `to_nice_yaml` 过滤器时 Ansible 中的奇怪行为

标签 ansible yaml

我有一个 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 运行。行为是相同的。

最佳答案

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

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

关于ansible - 使用 `to_nice_yaml` 过滤器时 Ansible 中的奇怪行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72371849/

相关文章:

ansible - 用 ansible 替换配置文件中的一行

regex - Ansible,字符串第一个字符的正则表达式

ruby-on-rails - 如何在 Rails 启动时加载配置?

azure - 如何在 Ansible 模块中使用 BLOB URI 作为源 : azure_rm_image

Ansible 变量优先级 - 什么是 'role params' 和 'include params'

ruby-on-rails - 为什么在 Fixnum 上调用时 `from_now` 是错误的?

google-app-engine - Dispatch.yaml 路由到特定模块版本?

python - Python 3 引发的 IndentationError : unexpected indent,。Pod 部署 YAML 中 Kubernetes args 条目中使用的代码

json - 如何在 AWS 中使用 CloudFormation 模板包含 'mysql_secure_installation'

Ansible - 将 group_vars 和 host_vars 中的变量一起放到一个列表中