Назад | Перейти на главную страницу

Распечатать Ansible факты из цикла

Надеюсь, что кто-то может спасти мое рассудок, так как я безуспешно искал в Google все сопли. Похоже, это должно быть довольно просто. Я пытаюсь собрать дуплекс всех интерфейсов в списке хостов, используя факты Ansible. К счастью, повара у нас есть повсюду, и многие факты включают эту информацию.

Моя проблема в том, что я не могу понять, как пройти через интерфейсы для печати этой дуплексной информации. В частности, мне нужно распечатать факт [ohai_network.interfaces. {Interface_name} .duplex]. Вот что я пробовал:

  tasks:
  - name: Print interface duplex
    when: "{{ hostvars[ansible_fqdn]['ansible_'~item]['ipv4'] is defined }}"
    debug:
      msg="{{ ansible_hostname }} {{ item }} interface duplex is {{ ohai_network.interfaces.[item].duplex }}"
    with_items:
      - "{{ ansible_interfaces | map('replace', '-','_') | list }}"

Кажется, он не оценил мою переменную [item], добавленную в ссылку на факт. Любая помощь приветствуется!

ОБНОВЛЕНИЕ - Раздел «map ('replace', '-', '_') | list» был добавлен из другого захвата из другого места. Я вижу, что без него результат выглядит нормально. Я также изменил формат справки о фактах, так что теперь плейбук выглядит так:

  tasks:
    - name: Print interface duplex
      when: "{{ hostvars[ansible_fqdn]['ansible_'~item]['ipv4'] is defined }}"
      debug:
        msg="{{ ansible_hostname }} {{ item }} interface duplex is {{ ohai_network['interfaces'][item]['duplex'] }}"
      with_items:
        - "{{ ansible_interfaces }}"

Я все еще получаю сообщение об ошибке:

exception type: <class 'ansible.errors.AnsibleUndefinedVariable'>
exception: 'dict object' has no attribute 'duplex'

Вот результат запрошенной строки var:

TASK [Print interface duplex] ********************************************************************************************************************
 [WARNING]: when statements should not include jinja2 templating delimiters such as {{ }} or {% %}. Found: {{
hostvars[ansible_fqdn]['ansible_'~item]['ipv4'] is defined }}
ok: [REDACTED] => (item=lo) => {
    "changed": false, 
    "item": "lo", 
    "ohai_network.interfaces": {
        "ens160": {
            "addresses": {
                "00:00:00:00:00:01": {
                    "family": "lladdr"
                }, 
                "10.204.76.244": {
                    "broadcast": "10.0.0.255", 
                    "family": "inet", 
                    "netmask": "255.0.0.0", 
                    "prefixlen": "8", 
                    "scope": "Global"
                }
            }, 
            "arp": {
                "10.204.76.1": "00:00:00:00:00:01", 
                "10.204.76.3": "00:00:00:00:00:01"
            }, 
            "auto_negotiation": "off", 
            "duplex": "Full", 
            "encapsulation": "Ethernet", 
            "flags": [
                "BROADCAST", 
                "MULTICAST", 
                "UP", 
                "LOWER_UP"
            ], 
            "link_speed": 10000, 
            "mdi_x": "Unknown", 
            "mtu": "1500", 
            "number": "0", 
            "port": "Twisted Pair", 
            "ring_params": {
                "current_rx": 256, 
                "current_rx_jumbo": 128, 
                "current_rx_mini": 0, 
                "current_tx": 512, 
                "max_rx": 4096, 
                "max_rx_jumbo": 4096, 
                "max_rx_mini": 0, 
                "max_tx": 4096
            }, 
            "routes": [
                {
                    "destination": "default", 
                    "family": "inet", 
                    "metric": "100", 
                    "proto": "static", 
                    "via": "10.0.0.1"
                }, 
                {
                    "destination": "10.0.0.0/8", 
                    "family": "inet", 
                    "metric": "100", 
                    "proto": "kernel", 
                    "scope": "link", 
                    "src": "10.0.0.2"
                }
            ], 
            "state": "up", 
            "transceiver": "internal", 
            "type": "ens16"
        }, 
        "lo": {
            "addresses": {
                "127.0.0.1": {
                    "family": "inet", 
                    "netmask": "255.0.0.0", 
                    "prefixlen": "8", 
                    "scope": "Node"
                }
            }, 
            "encapsulation": "Loopback", 
            "flags": [
                "LOOPBACK", 
                "UP", 
                "LOWER_UP"
            ], 
            "mtu": "65536", 
            "state": "unknown"
        }
    }
}
ok: [REDACTED] => (item=ens160) => {
    "changed": false, 
    "item": "ens160", 
    "ohai_network.interfaces": {
        "ens160": {
            "addresses": {
                "00:00:00:00:00:01": {
                    "family": "lladdr"
                }, 
                "10.204.76.244": {
                    "broadcast": "10.0.0.255", 
                    "family": "inet", 
                    "netmask": "255.0.0.0", 
                    "prefixlen": "8", 
                    "scope": "Global"
                }
            }, 
            "arp": {
                "10.0.0.1": "00:00:00:00:00:01", 
                "10.0.0.2": "00:00:00:00:00:01"
            }, 
            "auto_negotiation": "off", 
            "duplex": "Full", 
            "encapsulation": "Ethernet", 
            "flags": [
                "BROADCAST", 
                "MULTICAST", 
                "UP", 
                "LOWER_UP"
            ], 
            "link_speed": 10000, 
            "mdi_x": "Unknown", 
            "mtu": "1500", 
            "number": "0", 
            "port": "Twisted Pair", 
            "ring_params": {
                "current_rx": 256, 
                "current_rx_jumbo": 128, 
                "current_rx_mini": 0, 
                "current_tx": 512, 
                "max_rx": 4096, 
                "max_rx_jumbo": 4096, 
                "max_rx_mini": 0, 
                "max_tx": 4096
            }, 
            "routes": [
                {
                    "destination": "default", 
                    "family": "inet", 
                    "metric": "100", 
                    "proto": "static", 
                    "via": "10.0.0.1"
                }, 
                {
                    "destination": "10.0.0.0/8", 
                    "family": "inet", 
                    "metric": "100", 
                    "proto": "kernel", 
                    "scope": "link", 
                    "src": "10.0.0.2"
                }
            ], 
            "state": "up", 
            "transceiver": "internal", 
            "type": "ens16"
        }, 
        "lo": {
            "addresses": {
                "127.0.0.1": {
                    "family": "inet", 
                    "netmask": "255.0.0.0", 
                    "prefixlen": "8", 
                    "scope": "Node"
                }
            }, 
            "encapsulation": "Loopback", 
            "flags": [
                "LOOPBACK", 
                "UP", 
                "LOWER_UP"
            ], 
            "mtu": "65536", 
            "state": "unknown"
        }
    }
}

Сложно разобраться в том, что здесь происходит. Я не понимаю, как «ohai_network.interfaces» отображается в ваших варах хоста. Если вы смогли добавить задачу, которая выводит на печать переменные хоста (- debug: var = hostvars [inventory_hostname]), а затем добавить в свой вопрос раздел ohai из этого вывода, я смогу дать вам полное решение.

Приведенный ниже фрагмент должен помочь вам преодолеть некоторые из ошибок, которые у вас есть, но может не разрешить данные ohai:

# As per the warning in your output, 'when' clauses should not be wrapped with curly braces. Also better to use 'inventory_hostname' in this case
- name: Print interface duplex
  debug:
    msg: "{{ ansible_hostname }} {{ item }} interface duplex is {{ ohai_network['interfaces'][item]['duplex'] | default('not_defined') }}"
  when: hostvars[inventory_hostname]['ansible_' + item]['ipv4'] is defined
  with_items: "{{ ansible_interfaces }}"

Если это не сработает, попробуйте:

msg: "{{ ansible_hostname }} {{ item }} interface duplex is {{ ohai_network.interfaces[item]['duplex'] | default('not_defined') }}"