如何用yq为含锚点、别名的YAML文件添加数组元素?
为SOPS配置文件添加带锚点的密钥及对应别名
原始SOPS配置文件:
keys: - &node0001 ageXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX - &node0002 ageYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY creation_rules: - path_regex: secrets.yaml$ key_groups: - age: - *node0001 - *node0002
需要实现的目标:
- 在
keys数组新增带锚点&node0003的密钥条目 - 在
creation_rules的age列表中添加对应别名*node0003
最终效果:
keys: - &node0001 ageXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX - &node0002 ageYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY - &node0003 ageZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ creation_rules: - path_regex: secrets.yaml$ key_groups: - age: - *node0001 - *node0002 - *node0003
之前尝试的命令存在两个问题:
- 添加密钥时无法生成YAML锚点,只能添加普通字符串
- 添加的是字符串
node0003而非YAML别名*node0003
解决方案(单条yq命令)
使用mikefarah/yq(v4及以上版本)的以下命令即可完成需求:
yq ' .keys += [{ "&node0003": "ageZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ" }] | .creation_rules[0].key_groups[0].age += [{"*node0003": null}] ' .sops.yaml
命令说明:
- 添加带锚点的密钥:通过对象
{ "&node0003": "ageZZZZ..." }的形式添加,yq会自动将其解析为YAML锚点格式的数组条目 - 添加对应别名:用
{ "*node0003": null }的形式让yq识别为YAML别名,而非普通字符串,添加到目标列表中
如果需要直接原地修改文件,加上-i参数:
yq -i ' .keys += [{ "&node0003": "ageZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ" }] | .creation_rules[0].key_groups[0].age += [{"*node0003": null}] ' .sops.yaml
内容的提问来源于stack exchange,提问作者Martijn de Munnik
相关产品推荐
相关产品推荐

