LINUX.ORG.RU
ФорумAdmin

Ansible, проблема с шаблоном jinja2

 


0

1

Всем привет. Не получается настроить шаблон для определения сетевого адаптера по его IP адресу

Во второй строке закралась ошибка (['ansible_'+interface]), не могу понять что делаю не так...

{% for interface in ansible_interfaces %}
{% if hostvars[inventory_hostname]['ansible_'+interface].ipv4.address == LANIP %}
INTERFACES="{{ interface }}"
{% endif %}
{% endfor %}

Если в ручную прописать нужный адаптер (['ansible_enp3s0']), то скрипт отрабатывает как надо.

С jinja2 синтаксисом столкнулся в первые, два для убил на мануалы, но так и не дошло, в итоге получаю такую ошибку :

fatal: [host]: FAILED! => {
    "msg": "The task includes an option with an undefined variable. The error was: 'dict object' has no attribute u'ansible_br-141a37688284'\n\nThe error appears to have been in '/home/ansible/playbooks/testj2.yml': line 10, column 6, but may\nbe elsewhere in the file depending on the exact syntax problem.\n\nThe offending line appears to be:\n\n  tasks:\n   - pause:\n     ^ here\n"

Playbook

---
- hosts: host
  become: yes
  become_user: root
  become_method: sudo
  vars:
    LANIP: 192.168.{{ IP }}.1
  tasks:
   - pause:
        prompt: "{{ lookup('template', 'demo.j2') }}"

У тебя же написано. Для интерфейса br-141a37688284 ключа «ansible_br-141a37688284» в словаре нет.

У тебя больше чем один интерфейс и соответственно не для всех из них эта конструкция - hostvars[inventory_hostname]['ansible_'+interface].ipv4.address - работает.

alpha ★★★★★ ()
Последнее исправление: alpha (всего исправлений: 1)
Ответ на: комментарий от Masterplan
{% if 'ipv4' in hostvars[inventory_hostname]['ansible_'+interface] %}
{% if hostvars[inventory_hostname]['ansible_'+interface].ipv4.address == LANIP %}
...
{% endif %}
{% endif %}

Только наверное тебе вообще не это нужно, а достаточно:

INTERFACES={{ hostvars[inventory_hostname].ansible_default_ipv4.interface }}
alpha ★★★★★ ()
Ответ на: комментарий от alpha

Огромное спасибо, первый вариант как раз то что мне нужно

{% for interface in ansible_interfaces %}
{% if 'ipv4' in hostvars[inventory_hostname]['ansible_'+interface] %}
{% if hostvars[inventory_hostname]['ansible_'+interface].ipv4.address == LANIP %}
INTERFACES="{{ interface }}"
{% endif %}
{% endif %}
{% endfor %}

То есть, как я понял, нужна обязательная проверка наличия ключей у интерфейсов? Если не сложно, то подскажите хороший мануал про данному синтаксису...

Masterplan ()

может проверить определена ли прееменная?

{% if hostvars[inventory_hostname]['ansible_'+interface] is defined and hostvars[inventory_hostname]['ansible_'+interface].ipv4.address == LANIP %}
CaHbl4 ()
Ответ на: комментарий от Masterplan

Тут нет никакой особой магии, это просто многоуровневый вложенный словарь в питоне. Если ты обращаешься на smth['A']['B']['C'] и при этом в словаре smth['A'] не существует ключа 'B', то будет ошибка.

alpha ★★★★★ ()
Последнее исправление: alpha (всего исправлений: 1)
Ответ на: комментарий от Masterplan

Курсы почти по любому языку программирования лучше вообще в глаза не видеть, особенно в формате видео.

Куча времени просто в трубу улетает.

Для простых вещей просто запускай интерпретатор удава в соседней консоли и пробуй там - быстрее, нагляднее, без оверхеда. В крайнем случае, заюзай функцию help.

Вот еще примеры для админов: https://legacy.gitbook.com/book/natenka/pyneng/details

anonymous ()
Ответ на: комментарий от anonymous

Курсы почти по любому языку программирования лучше вообще в глаза не видеть, особенно в формате видео.

Мне вот этот понравился: https://player.oreilly.com/videos/9781771373609

Там не самое начало, со списками и словарями, а чуть поинтереснее, и рассказывают неплохо.

alpha ★★★★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.