如何在cloud-init的runcmd段中正确转义特殊字符?
解决cloud-init runcmd中执行复杂yq命令的问题
核心原因
你的命令失效是因为YAML解析器会把{"path": "dir1"}里的大括号、冒号当成YAML的键值对结构,导致整个cloud-init配置文件语法错误,进而无法正常解析包括user块在内的所有配置。
两种可行解决方案
方案1:用YAML单引号包裹命令,转义内部单引号
将整个命令用单引号包裹,命令内部的单引号需要写成两个连续单引号(YAML单引号字符串的转义规则):
runcmd: - 'yq -i ''block1 += {"path": "dir1"}'' /ws1/project.yml'
方案2:将命令拆分为参数列表(推荐)
cloud-init支持将runcmd的每个命令拆分为列表形式,每个参数作为独立元素,彻底避免YAML转义问题:
runcmd: - [yq, -i, '.block1 += {"path": "dir1"}', /ws1/project.yml]
这种方式不需要处理任何转义,cloud-init会直接将参数传递给yq执行,是最可靠的写法。
内容的提问来源于stack exchange,提问作者Dim Dim
相关产品推荐
相关产品推荐

