解析 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,请参见此处的示例:

https://www.terraform.io/docs/providers/aws/d/ami.html