动态构建变量名称并使用Ansible

时间:2018-04-12 09:26:31

标签: ansible devops

我有一个ansible playbook,我需要将从任务返回的值与从元数据文件加载的变量进行比较。

此元数据可以采用任何格式,我决定使用YAML。

我想要实现的是从另一个变量+额外的东西构建一个变量名,然后查找这个值。

我通过网络搜索了答案,但我找不到任何答案。这里也有一些类似的问题,但它们并没有完全解决我的问题。

以下是代码:

temp_task.yml

---
  - name: Temp task
    hosts: xenservers
    gather_facts: no
    vars_files:
      - vars/xenservers_metadata.yml

    tasks:
      - command: ls /home  # just a dummy task..
        ignore_errors: yes

      - set_fact: nic={{ inventory_hostname }}.network
      - debug: msg={{ nic }}
      - debug: msg={{ xen_perf.network }}

xenservers_metadata.yml

---
  - xen:
      network:
        - xenbr0: "9b8be49c-....-....-...-..."

我正在尝试让两个调试消息打印出相同的内容。一个是{{ inventory_hostname }}.network动态构建的,而另一个是我加载的显式变量。

TASK [debug] ********************************************************************************************************************************************************
ok: [xen_perf] => {
    "msg": "xen.network"
}

TASK [debug] ********************************************************************************************************************************************************
ok: [xen] => {
    "msg": [
        {
            "xenbr0": "9b8be49c-....-....-...-..."
        }
    ]
}

第一个调试只打印字符串。第二个打印出我需要的实际数据。如何通过动态构造变量/属性来实现第二个数据输出?

1 个答案:

答案 0 :(得分:1)

您不会在示例中动态构建变量名称。

所有变量(非事实)都存储在vars结构中,您可以通过以下方式访问它们:

- debug:
    msg: "{{ vars[inventory_hostname].network }}"