繁体   English   中英

使用 shell 脚本在 json 中传递动态 terraform 变量

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM