解析标准输出文本以在Ansible中进行映射

时间:2018-12-24 16:39:14

标签: ansible terraform packer

所以, 我得到了打包程序生成的清单文件。

我想将可用区域和AMI ID解析为 一张地图,以便稍后使用匹配的区域和AMIS更新我的Terraform变量。

这是文件:

{
  "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

但是,我找不到如何将输出注册到地图上并随后使用循环和条件访问它的方法。

3 个答案:

答案 0 :(得分:2)

鉴于该变量位于您可能要使用 json_query 的文件packer-manifest.txt中。

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"

答案 1 :(得分:0)

您应该使用jq解析json文件,并将其重写为一个json文件,您可以使用¿参数see将其传递到terraform。

旁注:将状态从Packer传递到Terraform的更好策略是将状态保留在AWS中。通过在Packer构建的结果AMI上设置一些标签,然后使用-var-file查找最新版本。

答案 2 :(得分:0)

我不会这样。此时,我将只剩下打包程序,您可以轻松地使用Terraform中的数据资源来查找ami ID,请参见此处的示例:

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