Как экранировать двоеточие (":") в имени переменной с помощью Ansible или Jinja2? - PullRequest
1 голос
/ 14 мая 2019

Я получаю информацию о сетях Openstack с помощью модуля Ansible os_networks_facts .

Этот модуль возвращает информацию в структуре openstack_networks:

    "openstack_networks": [
    {
        "admin_state_up": true,
        "id": "5632dc44-dbda-4752-8155-fe782e95cc29",
        "mtu": 0,
        "name": "public_RSC",
        "port_security_enabled": true,
        "router:external": true,
        "shared": false,
        "status": "ACTIVE",
        "subnets": [
            "7b07432c-f0a0-415a-8b28-7e87918cc6d4",
            "a56e25cb-0710-4a64-869e-4af2d5bf9c64",
            "c4ff60af-44bc-4252-ab38-fd242d51f0f2"
        ],
        "tenant_id": "6025f8013cee46c093cb97cb36a1a86e"
    },
    {
        "admin_state_up": true,
        "id": "7812f951-4bc9-41c0-9db2-1f49b8a7ee47",
        "mtu": 0,
        "name": "kuby-network",
        "port_security_enabled": true,
        "router:external": false,
        "shared": false,
        "status": "ACTIVE",
        "subnets": [
            "6ad9ce9b-ba54-4d74-bbb6-8dfc50526eff"
        ],
        "tenant_id": "a9cffc26ba5a4a8e883f04dc7180a91d"
    }
]

Я хочу проверить значение атрибута router: external. Но этот атрибут содержит двоеточие в своем имени.

Когда я пытаюсь напечатать его в Ansible с:

- hosts: localhost
  connection: local
  gather_facts: false

  tasks:
    - name: get network information
      os_networks_facts:
        cloud: "{{ InfraCloudName }}"

    - name: debug
      debug:
        msg: "{{ item.router:external }}"
      with_items: "{{ openstack_networks }}"

У меня ошибка:

TASK [debug] ******************************************
fatal: [localhost]: FAILED! => {"msg": "template error while templating string: expected token 'end of print statement', got ':'. String: {{ item.router:external }}"}

Когда я пытаюсь проверить это в шаблоне jija2 с:

Networks
========

{% for n in openstack_networks %}
# {{ n.name }}

{% if n.router:external %}
{{ n.name }} is an external network.
{% endif %}

{% endfor %}

У меня также есть ошибка:

fatal: [localhost]: FAILED! => {"changed": false, "msg": "AnsibleError: template error while templating string: expected token 'end of statement block', got 'external'. String: Networks\n========\n\n{% for n in openstack_networks %}\n# {{ n.name }}\n\n{% if n.router:external %}\n{{ n.name }} is an external network.\n{% endif %}\n\n{% endfor %}\n"}

Итак, есть ли способ избежать ":" в имени переменной?

1 Ответ

4 голосов
/ 14 мая 2019

Помните, что есть два синтаксиса для доступа к словарным ключам в Jinja. Вы можете написать это:

variable.key

Или вы можете написать:

variable['key']

Поскольку во второй форме ключ является строкой в ​​кавычках, он может содержать символы, которые недопустимы в идентификаторах. Итак, вы хотите:

    - name: debug
      debug:
        msg: "{{ item['router:external'] }}"
      with_items: "{{ openstack_networks }}"
...