解析 stdout 文本以在 ansible 中映射
Parsing stdout text to map in ansible
所以,
我得到了加壳程序生成的清单文件。
我想将可用区和 AMI ID 解析成
一张地图,这样我稍后会用匹配的区域和 AMIS 更新我的地形变量。
这是文件:
{
"builds": [
{
"name": "amazon-ebs",
"builder_type": "amazon-ebs",
"build_time": 1545650590,
"files": null,
"artifact_id": "us-east-1:ami-0caa33152d1160000",
"packer_run_uuid": "ba1f3c4c-9da1-60ed-e45e-1dc374bc148b"
}
],
"last_run_uuid": "ba1f3c4c-9da1-60ed-e45e-1dc374bc148b"
}
用正则表达式 grep 相关行并清理它是小菜一碟:
grep -E "ami-\w" manifest.json | tr -d "[:space:],\"" | tr ":" "," | sed 's/artifact_id,//g
(输出:us-east-1,ami-0caa33152d1160000)
但是,我找不到如何将输出注册到地图并稍后使用循环和条件访问它。
鉴于变量在文件打包器中-manifest.txt 你可能想使用 json_query.
vars_files:
- packer-manifest.txt
tasks:
- set_fact:
ami_id: "{{ builds | json_query('[].artifact_id') }}"
- debug:
msg: "{{ ami_id[0].split(':')[1] }}"
结果是:
"msg": "ami-0caa33152d1160000"
您应该用 jq
and rewrite it to a json file that you can pass to terraform with the -var-file
argument, see 解析 json 个文件。
旁注:将状态从 Packer 传递到 Terraform 的更好策略是将状态保存在 AWS 中。通过在 Packer 构建的结果 AMI 上设置一些标签,然后使用 data.aws_ami_id
查找最新版本。
我不会这样做的。在这一点上我会单独留下 packer,您可以轻松地使用 Terraform 中的数据资源来查找 ami ID,请参见此处的示例:
所以, 我得到了加壳程序生成的清单文件。
我想将可用区和 AMI ID 解析成 一张地图,这样我稍后会用匹配的区域和 AMIS 更新我的地形变量。
这是文件:
{
"builds": [
{
"name": "amazon-ebs",
"builder_type": "amazon-ebs",
"build_time": 1545650590,
"files": null,
"artifact_id": "us-east-1:ami-0caa33152d1160000",
"packer_run_uuid": "ba1f3c4c-9da1-60ed-e45e-1dc374bc148b"
}
],
"last_run_uuid": "ba1f3c4c-9da1-60ed-e45e-1dc374bc148b"
}
用正则表达式 grep 相关行并清理它是小菜一碟:
grep -E "ami-\w" manifest.json | tr -d "[:space:],\"" | tr ":" "," | sed 's/artifact_id,//g
(输出:us-east-1,ami-0caa33152d1160000)
但是,我找不到如何将输出注册到地图并稍后使用循环和条件访问它。
鉴于变量在文件打包器中-manifest.txt 你可能想使用 json_query.
vars_files:
- packer-manifest.txt
tasks:
- set_fact:
ami_id: "{{ builds | json_query('[].artifact_id') }}"
- debug:
msg: "{{ ami_id[0].split(':')[1] }}"
结果是:
"msg": "ami-0caa33152d1160000"
您应该用 jq
and rewrite it to a json file that you can pass to terraform with the -var-file
argument, see 解析 json 个文件。
旁注:将状态从 Packer 传递到 Terraform 的更好策略是将状态保存在 AWS 中。通过在 Packer 构建的结果 AMI 上设置一些标签,然后使用 data.aws_ami_id
查找最新版本。
我不会这样做的。在这一点上我会单独留下 packer,您可以轻松地使用 Terraform 中的数据资源来查找 ami ID,请参见此处的示例: