You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Excel转YAML时单引号异常转为三个,Ansible适配问题求助

解决PyYAML生成Ansible YAML时添加单引号的问题

你的问题根源在于PyYAML会自动处理字符串的引号逻辑:当你手动给字符串值包裹单引号(比如"'{}'".format(v)),这些单引号会被当成字符串内容的一部分,而非YAML的语法引号。PyYAML会根据内容自动转义或省略引号,导致出现'''value'''或无引号的异常输出。

下面是两种可靠的解决方法:

方法一:给特定值强制添加单引号

使用PyYAML的SingleQuotedScalarString类包装需要单引号的字符串,明确告诉PyYAML该值需要用单引号包裹:

from yaml.scalarstring import SingleQuotedScalarString
import yaml

# 替换你的变量生成逻辑
vars = {}
for k, v in data.items():
    # 用SingleQuotedScalarString包装值
    vars.update({k: SingleQuotedScalarString(v)})

data = {
    'all': {
        'children': {
            'fortigates': {
                'hosts': {
                    'provisioning_ip': {},
                },
                'vars': vars
            }
        }
    }
}

# 序列化输出
with open('output.yaml', 'w') as yaml_file:
    yaml.dump(data, yaml_file, default_flow_style=False,
              sort_keys=False)

这种方法只会给你指定的变量值添加单引号,其他字符串保持PyYAML的默认处理逻辑。

方法二:全局强制所有字符串使用单引号

如果你希望生成的YAML中所有字符串都用单引号包裹,可以自定义Dumper类,重写字符串的序列化逻辑:

import yaml

class SingleQuoteDumper(yaml.Dumper):
    def represent_str(self, data):
        # 指定字符串用单引号包裹
        return self.represent_scalar('tag:yaml.org,2002:str', data, style="'")

vars = {}
for k, v in data.items():
    vars.update({k: v})  # 这里不需要手动加引号

data = {
    'all': {
        'children': {
            'fortigates': {
                'hosts': {
                    'provisioning_ip': {},
                },
                'vars': vars
            }
        }
    }
}

# 序列化时使用自定义Dumper
with open('output.yaml', 'w') as yaml_file:
    yaml.dump(data, yaml_file, default_flow_style=False,
              Dumper=SingleQuoteDumper, sort_keys=False)

注意事项

如果字符串本身包含单引号(比如it's),PyYAML会自动将其转义为两个单引号('it''s'),这是YAML的合法语法,Ansible可以正常解析。

内容的提问来源于stack exchange,提问作者EHMars

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 04:06:27