如何将Hashicorp Vault存储的CoreDNS配置导出为多行YAML文件
可行解决方案
方案1:不修改Vault中现有存储的内容,直接格式化单行输出
当前Vault中存储的是单行配置字符串,可以通过awk对输出内容做结构化拆分,直接生成符合要求的格式化内容,完整命令如下:
vault kv get -format=json ${VAULT_PATH}/coredns-custom | jq -r '.data.data.config' | awk '{ if(match($0, /^([^{]+) {([^}]+)}$/, res)) { print res[1] "{" split(res[2], opts, / +/) print " " opts[1] print " " opts[2], opts[3] print " " opts[4], opts[5], opts[6], opts[7] print "}" } }' > coredns-custom.yaml
如果后续CoreDNS配置会动态调整,可以用更通用的sed处理逻辑,自动识别括号内的每条配置项并换行缩进:
vault kv get -format=json ${VAULT_PATH}/coredns-custom | jq -r '.data.data.config' | sed -E ' s/^([^{]+) \{/\1 {\ / s/([a-z]+ [0-9]+|[a-z]+|forward [^}]+)/\ \1/g s/ *}$/\ }/' > coredns-custom.yaml
方案2:修改Vault存储内容为带转义换行的格式,导出时解析换行
你之前插入\n不生效,是因为Vault返回的JSON中\n是转义后的字符串,jq默认不会自动把转义字符替换为真实换行,需要主动做替换处理:
- 先把Vault中存储的config值修改为带转义换行的内容:
{ "config": "test.domain.com:53 {\n errors\n cache 30\n forward . 1.1.1.1 1.1.1.2\n}" }
- 导出时用jq的gsub方法替换转义换行符为真实换行,命令如下:
vault kv get -format=json ${VAULT_PATH}/coredns-custom | jq -r '.data.data.config | gsub("\\\\n"; "\n")' > coredns-custom.yaml
内容的提问来源于stack exchange,提问作者musicman
相关产品推荐
相关产品推荐

