templates - Ansible 提取属性并创建新字典

标签 templates ansible ansible-2.x

我有一个 json 对象,如下所示:

  [
     {
        "id": "subnet-1",
        "tags": {
            "Name": "showcase"
        }
     },
    {
        "id": "subnet-2",
        "tags": {
            "Name": "qa"
        }
    }
   ]

我想创建一个新字典,其中只有 subnetIds,标签名称“Name”用作键,“id”用作值,如下所示:

   {
    "showcase": "subnet-1",
    "qa": "subnet-2",
   }

目前我有以下代码没有帮助:

 - name: Populate SubnetIds
      set_fact:
        SubnetIds: "{{ subnet_facts.subnets | map(attribute='tags.Name') | join(',') }}"

最佳答案

重组复杂数据结构的最简单方法是模板查找。
知道 Ansible 在模板化后评估 JSON 数据这一事实,我们可以执行以下操作。

创建一个帮助器 subnets.j2 来形成所需的对象:

{
 {% for s in subnets %}
 "{{ s.tags.Name }}":"{{ s.id }}" {% if not loop.last %},{% endif %}
 {% endfor %}
}

通过在您的剧本中查找来调用它:

- name: Populate SubnetIds
  set_fact:
    SubnetIds: "{{ lookup('template', 'subnets.j2') }}"
  vars:
    subnets: "{{ subnet_facts.subnets }}"

由于 Ansible 模板化过程的最后一步尝试将 JSON 评估为对象,因此本例中的 SubnetIds 成为普通字典。

如果您为特定任务制作辅助模板,您可以在 j2 文件中使用 subnet_facts.subnets 而不是 subnets,因此无需传递额外的 varssubnets 值。

关于templates - Ansible 提取属性并创建新字典,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40034175/

相关文章:

c++ - shared_ptr 删除器问题

variables - Ansible 从 ansible play/playbook 获取 "hosts"键的值

c++ - 从类型包中解压缩模板-模板参数

c++ - 从 Derived<X> 到 Base<X> 的 reinterpret_cast 安全吗?

c++ - 调用模板成员函数

ansible - 是否有可用角色的 Ansible "not"标签?

ansible:尝试切换用户时变得失败(超时错误)

ansible - 尝试使用 ansible 构建包时找不到命令

ansible - 从 playbook 编辑 AnsibleVault 文件

ansible - 通过 set_fact 分配的一些 float 被转换为字符串