如何在ansible模板中获取嵌套变量?

如何在ansible模板中获取嵌套变量?,ansible,jinja2,ansible-2.x,ansible-template,Ansible,Jinja2,Ansible 2.x,Ansible Template,如何获取嵌套如下的变量: mongoservers: - mongo_master: dev_01 label: mongomaster dev01 urls: - mongomaster01.dev.local.net - mongomaster02.dev.local.net - mongo_master: dev_02 label: mongomaster dev02 urls: - mongomaster.dev03.local.net -

如何获取嵌套如下的变量:

mongoservers:
- mongo_master: dev_01
  label: mongomaster dev01
  urls:
    - mongomaster01.dev.local.net
    - mongomaster02.dev.local.net
- mongo_master: dev_02
  label: mongomaster dev02
  urls:
    - mongomaster.dev03.local.net
    - mongomaster.dev04.local.net

我想从上面的yaml访问变量中的URL我的条件是if
mongoserver.mongo\u master
dev01
我想获取属于它的所有URL。

你可以用它筛选和查询你的哈希列表。阅读以理解查询语言

在以下示例剧本中,我使用以下查询:

[?mongo_master=='dev_01'].urls[]
这可以解释为

对于传入列表中具有等于
dev_01
元素的
mongo_master
元素的每个元素,选择其内部的
url
元素,最后展平列表

以下是完整的示例剧本:

---
- name: Filter list
  hosts: localhost
  gather_facts: false

  vars:
    mongoservers:
    - mongo_master: dev_01
      label: mongomaster dev01
      urls:
        - mongomaster01.dev.local.net
        - mongomaster02.dev.local.net
    - mongo_master: dev_02
      label: mongomaster dev02
      urls:
        - mongomaster.dev03.local.net
        - mongomaster.dev04.local.net

  tasks:
    - name: filter
      vars:
        query: >-
          [?mongo_master=='dev_01'].urls[]
      debug:
        msg: "{{ mongoservers | json_query(query) | list }}"
其中:

PLAY [Filter list] ********************************************************************************************************************************************************************************************************

TASK [filter] *************************************************************************************************************************************************************************************************************
Wednesday 25 September 2019  17:57:39 +0200 (0:00:00.039)       0:00:00.039 *** 
ok: [localhost] => {
    "msg": [
        "mongomaster01.dev.local.net",
        "mongomaster02.dev.local.net"
    ]
}

PLAY RECAP ****************************************************************************************************************************************************************************************************************
localhost                  : ok=1    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   

您可以使用筛选和查询哈希列表。阅读以理解查询语言

在以下示例剧本中,我使用以下查询:

[?mongo_master=='dev_01'].urls[]
这可以解释为

对于传入列表中具有等于
dev_01
元素的
mongo_master
元素的每个元素,选择其内部的
url
元素,最后展平列表

以下是完整的示例剧本:

---
- name: Filter list
  hosts: localhost
  gather_facts: false

  vars:
    mongoservers:
    - mongo_master: dev_01
      label: mongomaster dev01
      urls:
        - mongomaster01.dev.local.net
        - mongomaster02.dev.local.net
    - mongo_master: dev_02
      label: mongomaster dev02
      urls:
        - mongomaster.dev03.local.net
        - mongomaster.dev04.local.net

  tasks:
    - name: filter
      vars:
        query: >-
          [?mongo_master=='dev_01'].urls[]
      debug:
        msg: "{{ mongoservers | json_query(query) | list }}"
其中:

PLAY [Filter list] ********************************************************************************************************************************************************************************************************

TASK [filter] *************************************************************************************************************************************************************************************************************
Wednesday 25 September 2019  17:57:39 +0200 (0:00:00.039)       0:00:00.039 *** 
ok: [localhost] => {
    "msg": [
        "mongomaster01.dev.local.net",
        "mongomaster02.dev.local.net"
    ]
}

PLAY RECAP ****************************************************************************************************************************************************************************************************************
localhost                  : ok=1    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   

我们可以在模板
{mongoserver | json_查询([?mongo_master=='dev_01'].url[])列表}
中执行此操作,但如果出现语法错误,则需要引用整个查询:
{mongoserver | json_查询([?mongo_master='dev_01'].url[]);列表}
。我习惯性地把它放在一个var中,以检查潜在的引用和逃避地狱问题。哦,是的!救生员。谢谢你,我们可以在模板
{mongoserver | json|u查询([?mongo|u master=='dev_01'].url[])列表}
中执行,但是如果出现语法错误,你需要引用整个查询:
{mongoserver | json|u查询([?mongo_master='dev u 01'].url[]);列表}
。我习惯性地把它放在一个var中,以检查潜在的引用和逃避地狱问题。哦,是的!救生员。谢谢,伙计