Ansible from_yaml 在组合过滤器后删除双引号和位置更改

Posted

技术标签:

【中文标题】Ansible from_yaml 在组合过滤器后删除双引号和位置更改【英文标题】:Ansible from_yaml is removing double quotation and position change after combine filter 【发布时间】:2021-10-07 21:24:36 【问题描述】:

下面是我的程序。当我尝试使用 from_yaml 进行转换并写回文件时,它会用单引号删除双引号。有办法解决吗

- slurp:
    src: "/home/myname/config.yml"
  register: fileContent

- set_fact:
    fileContent: " fileContent['content'] | b64decode | from_yaml | combine (myvariable) "

- copy:
    content: " fileContent"
    dest: "/home/myname/config.yml"

示例 config.yml

key:
  key:
    key1: "value"
    key2:
      key1: "value"
      key2: "value"

还有组合时,为什么元素的位置会发生变化。有没有办法保持位置只是改变值

【问题讨论】:

欢迎来到 ***!请确保包含minimal, reproducible example:YAML 中的键必须是唯一的,您不能在同一映射中拥有两次key:(config.yml 中的第 3-4 行和第 5-6 行)。另一个文件是什么?它还使用 YAML 语法,因此它显然不是“程序”。指的是myname.config.yml,那是你的config.yml吗? fileContent['content'] 来自哪里(不在你的config.yml 中)?期望的和实际的输出是什么? 嗨。我只有一个 config.yml 文件。我已经更新了配置文件。问题之一是我不太清楚为什么双引号被单引号代替 您的问题可能是here 所描述的问题,如果是这样,我认为您无法在此级别避免它。为什么更改报价会成为问题? 您好,输出文件需要用双引号括起来,以便以后处理。除了为什么要结合键值变化的排列。我得到了预期的结果,但顺序正在改变。有什么想法吗? 因为 yaml dict 中键的声明顺序绝对不重要,不能保证稳定,不应依赖。否则使用列表。这和引用的变化是没有问题的:结果数据结构是绝对相同的。如果您自己的“后期处理”工具不喜欢这样,那么您应该修复它(或更改数据结构)。 【参考方案1】:

问:"有没有办法保持位置只改变值?"

答:没有。Ansible 中没有这样的过滤器可以保留这种格式。如果您需要任何特殊格式,则必须使用template。

除了更改格式之外,您的代码实际上应该可以正常工作。例如

- hosts: localhost
  tasks:
    - slurp:
        src: config.yml
      register: fileContent
    - set_fact:
        fileContent: " fileContent.content|
                         b64decode|from_yaml|
                         combine(myvariable) "
      vars:
        myvariable:
          next_key:
            key1: "value"
            key2:
              key1: "value"
              key2: "value"
    - copy:
        content: " fileContent "
        dest: config2.yml

提供有效的 JSON

shell> cat config2.yml 
"key": "key": "key1": "value", "key2": "key1": "value", "key2": "value", "next_key": "key1": "value", "key2": "key1": "value", "key2": "value"

文件的内容取决于格式。例如上面的默认 JSON。您可以将其更改为 YAML,例如

    - copy:
        content: " fileContent|to_nice_yaml "
        dest: config2.yml

给予

shell> cat config2.yml 
key:
    key:
        key1: value
        key2:
            key1: value
            key2: value
next_key:
    key1: value
    key2:
        key1: value
        key2: value

或者你可以通过使用过滤器to_nice_json获得漂亮的JSON,例如

    - copy:
        content: " fileContent|to_nice_json "
        dest: config2.yml

给予

shell> cat config2.yml 

    "key": 
        "key": 
            "key1": "value",
            "key2": 
                "key1": "value",
                "key2": "value"
            
        
    ,
    "next_key": 
        "key1": "value",
        "key2": 
            "key1": "value",
            "key2": "value"
        
    

【讨论】:

我注意到由于form_yaml,双引号变成了单引号。有办法解决吗

以上是关于Ansible from_yaml 在组合过滤器后删除双引号和位置更改的主要内容,如果未能解决你的问题,请参考以下文章

ansible中过滤器的介绍以及如何自定义过滤器

在 Ansible 动态清单中,如何按标签过滤主机?

组合框更改后子表单不重新查询

ansible过滤器详解

Ansible - 对输出应用过滤器,然后注册为变量

Ansible如何使用Filter插件转换数据