Как стать автором
Обновить

Комментарии 13

Ansible, Perl, Bash - почему нельзя сделать на чем-то одном? У вас уже есть ansible, который может и конфиги рендерить как угодно и дергать systemd. Дальше при таком подходе обычно появляются матрешки типа "bash запускает ansible, который рендерит bash, который дергает systemd". А потом приходит новый сотрудник и хватается за голову в попытке понять, что там происходит.

Ой, матрешка уже есть...

		print DYN_YML "- name: copy script 'rollback_ifcfg_changes.sh' to remote\n";
		print DYN_YML "  ansible.builtin.copy:\n";
		print DYN_YML "    src: \"{{playbook_dir}}/../scripts_for_remote/rollback_ifcfg_changes.sh\"\n";
		print DYN_YML "    dest: \"~/rollback_ifcfg_changes.sh\"\n";
    		print DYN_YML "    mode: '0700'\n";
		print DYN_YML "\n";
		print DYN_YML "######################################################\n";
		print DYN_YML "\n";

Продемонстрируйте, пожалуйста, как с помощью одного ansible можно прописать уникальную конфигурацию сети для N элементов.

Вариантов много. Можно конфиги зашаблонизировать и включать отдельные блоки через if. Можно в конфиги макросы положить для генерации этих блоков по подставленным параметрам. Можно просто папки в templates наделать по отдельным хостам или группам хостов. Можно netplan воткнуть и весь конфиг описывать в ямле, ямлы складировать по хостам, внутри шаблоны опять же блоками через макросы сделать. Настройки положить в host/group_vars. Можно тем же способом systemd конфиги раскладывать:

    - name: Copy netplan config
      template:
        src: "roles/netplan/templates/etc/netplan/95-{{ inventory_hostname }}.yaml"
        dest: "/etc/netplan/95-{{ inventory_hostname }}.yaml"

1) Netplan - это не про RHEL, а про Ubuntu.
2) А вот так, чтоб через один конфиг проводить настройки, есть варианты на чистом ansible?

Я не про конкретный ansible, netplan. У меня посыл в том, что поддерживать 4 сущности в едином инструменте - перебор. Если вы взялись за perl, у вас в нем есть экспертиза, там приличный кусок кода написан и он, наверное, полезен, зачем вам там еще bash и тем более зачем из перлового скрипта генерить yaml таски для ansible, которые будут запускаться питоном? Чтобы дополнительно еще отлаживать проблемы миграции между версиями ansible и еще версиями питона на разных машинах?

Perl используется только на хосте с ansible.
Bash - для отката конфигурации. И я это в публикации описал.

Как один из вариантов на ansible (ну примесь шелла будет наверное) для хранения настроек можно взять yaml по типу конфига netplan или cloud-init. Они практически стандартные и в случае чего можно будет прямо напрямую в некоторые системы подсовывать. А для тех, где нетплана нет, сделать рендерер на ansible (собственно, чем netplan и занимается для бэкендов). Можно в один файл положить, можно разложить по отдельному файлу на хост.

host:
  ethernets:
    eth1:
      dhcp4: no
    eth2:
      dhcp4: no
  bonds:
    bond0:
      interfaces: [ eth1,eth2 ]
      parameters:
        mode: 802.3ad
        lacp-rate: fast
        mii-monitor-interval: 100
  vlans:
    vlan10:
      id: 10
      link: bond0
  bridges:
    br10:
      interfaces: [ vlan10 ]
      addresses: [ "1.2.3.4/24" ]
      routes:
        - to: a.b.c.d
          via: "{{ common_gw_variable }}" а ее положить в group_vars/all

в ansible раскладывать конфиги так
  - template: src=ifcfg-bond-template dest=ifcfg-bond-{{ item }}
    with_items: тут bonds/bridges/ethernets

или в jinja шаблонах через for по листу или дикту

для манипуляций с текущими интерфейсами и адресами есть факты хоста
со всякими переменными типа ansible_eth0.ipv4.address
и фильтры типа |ipaddr()

А можно вообще поставить netbox и использовать его как источник данных, хоть для ansible, хоть для perl

бэкап-возврат конфигурации можно делать по-разному, зависит от системы и желаний. Один из вариантов - переименовывать на хосте папку с конфигами целиком, класть новые конфиги, типовой скрипт по крону регулярно проверяет, не появилась ли метка на хосте (ее кладем в конце плейбука где-нибудь после проверки доступности сети), если не появилась - переименовываем обратно. Можно через симлинки придумать систему. Главное чтобы скрипт был максимально одинаковый и простой.

Ну а если у вас все равно есть рендеринг в perl, то уж копирование файлов на нем без ansible сделать проблем не должно составить. Ansible большой, тяжелый и имхо если не использовать его возможности вроде переменных, шаблонов, макросов, фильтров, то лучше вообще на него не завязываться.

Спасибо! Как-то уж читал аналогичную инфу, но тут речь про NetworkManager, а у меня - про network-scripts. Вероятно, как-нибудь запилю аналог с использованием NM

Это официальная рекомендация от RedHat. Может, пришло время начать отказываться от наследия initd и переходить на более современные сетевые рендереры: NetworkManager и systemd-networkd?

А также реализовать откат конфигурации по таймауту.

Неприятный баг, созданный собственноручно (увы, недосмотрел), обнаружил сегодня (2023-02-19 21:33).

Как оказалось, в код ansible-хелпера "conf_int_ipv4_via_network_scripts" закралась ошибочка, не позволявшая корректно настраивать сетевые интерфейсы (или их сочетание), связанные с VLAN-ами.

Ошибка устранена.

Имя ansible-хелпера сменилось на "conf_ipv4_via_network_scripts_v1".
===
https://github.com/vladimir-chursin000/ansible_helpers/tree/main/conf_ipv4_via_network_scripts_v1

Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации

Истории