Надеюсь, что кто-то может спасти мое рассудок, так как я безуспешно искал в 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') }}"