Ansible: Обработка ошибок прямого слеша в Dict Obj. Уважать - PullRequest
0 голосов
/ 04 октября 2019

Код:

- name: Testing PyATS

  tasks:

  - name: Read in parse_genie role
    include_role:
      name: clay584.parse_genie

  - name: show interfaces
    ios_command:
      commands:
        - show interfaces
    register: interfaces

  - name: Set Fact Genie Filter
    set_fact: 
      pyats_interfaces: "{{ interfaces['stdout'][0] | parse_genie(command='show interfaces', os='iosxe') }}"

  - name: Debug
    debug:
      var: pyats_interfaces.GigabitEthernet0/0

Ожидается:

 "ansible_facts": {
        "pyats_interfaces": {
            "GigabitEthernet0/0": {
                "arp_timeout": "04:00:00",
                "arp_type": "arpa",
                "auto_negotiate": true,
                "bandwidth": 1000000,
                "counters": {
                    "in_broadcast_pkts": 0,
                    "in_crc_errors": 0,
                    "in_errors": 0,
                    "in_frame": 0,
                    "in_giants": 0, etc.

Получение:

"pyats_interfaces.GigabitEthernet0/0": "VARIABLE IS NOT DEFINED!: 'dict object' has no attribute 'GigabitEthernet0'"

Похоже, что / обрабатывается каксимвол экранирования, в результате чего переменная отображается как неопределенная при поиске в dict. для G0 / 0.

1 Ответ

0 голосов
/ 05 октября 2019

У вас есть 2 эквивалентных синтаксиса для адресации переменных внутри словарей в ansible:

  • Точечная запись:
some.var.to.address
  • Обозначение в скобках:
some['var']['to']['address']

Обе записи могут быть смешаны так, как вы хотите, например: some['var']['to'].address

Хотя они эквивалентны, в некоторых случаях вы вынуждены использовать скобочную запись.

  • , когда имя поля происходит от переменной, например, my_var[item]
  • , когда имя поля содержит специальные символы, например, my_var['field with spaces']

Вы находитесь вэто последнее дело. Поэтому замена вашей строки отладки на следующую должна исправить вашу проблему:

- name: Debug
  debug:
    var: pyats_interfaces['GigabitEthernet0/0']
...