[英]Passing dynamic terraform variables in json using shell script
我正在编写一个 shell 脚本,用于使用 shell 将 json 文件中的关键字替换为动态值。
123.json
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"AWS": [
"arn:aws:iam::xxxxxx:role/role1",
"arn:aws:iam::yyyyyy:role/role2"
]
},
"Action": "sts:AssumeRole",
"Condition": {}
}
]
}
我将 role1 和 role2 的值作为 shell 脚本中的 terraform 变量
shell.sh文件有
echo $role1
echo $role2
$ cat 123.json | sed -n '/role1/ s/role1/$role/ p'
$ cat 123.json | sed -n '/role1/ s/role1/$role/ p'
但是 role1 和 role2 没有得到更新。 有人可以帮我吗。
您的 sed 命令不起作用,因为 shell 不会在单引号中扩展变量。 但是 sed 不是编辑结构化格式的好工具,例如 JSON - jq
是更好的选择:
jq --argjson foo "\"$role1\"" '.Statement[].Principal.AWS[0] |= sub("role1$";$foo)' < 123.json
jq --argjson foo "\"$role2\"" '.Statement[].Principal.AWS[1] |= sub("role2$";$foo)' < 123.json
"\"$role2\""
从 shell 个变量创建一个 jq 变量,并在开头和结尾添加文字双引号。
要将 output 保存回文件,您需要使用外部实用程序,因为jq
没有 sed 等工具所具有的 -i 选项。 您可以使用sponge
,它是moreutils的一部分:
$ jq --argjson foo "\"$role1\"" '.Statement[].Principal.AWS[0] |= sub("role1$";$foo)' < 123.json | sponge 123.json
$ jq --argjson foo "\"$role2\"" '.Statement[].Principal.AWS[1] |= sub("role2$";$foo)' < 123.json | sponge 123.json
或手动写入临时文件并移动文件代替 123.json:
$ temp="$(mktemp)"
$ jq --argjson foo "\"$role1\"" '.Statement[].Principal.AWS[0] |= sub("role1$";$foo)' < 123.json > "$temp"
$ mv "$temp" 123.json
$ temp="$(mktemp)"
$ jq --argjson foo "\"$role2\"" '.Statement[].Principal.AWS[1] |= sub("role2$";$foo)' < 123.json > "$temp"
$ mv "$temp" 123.json
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.