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 在组合过滤器后删除双引号和位置更改的主要内容,如果未能解决你的问题,请参考以下文章