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

рекомендуемый способ настройки сетевого интерфейса centos-7 со статическими настройками через ansible

Я новичок в анзибле, и небольшой поиск в Google не привел меня быстро к правильному решению моего вопроса.

Какой способ «с зерном» назначить статические сетевые настройки хосту centos-7 с помощью ansible. Я чувствую, что это должно быть довольно распространенной потребностью - и должно быть много людей с вопросами о правильном подходе, который следует предпринять после всех изменений в системе конфигурации сети при переходе от rhel-6 к rhel-7 (а именно , сетевой менеджер по умолчанию, согласованное именование устройств по умолчанию из ядра, systemd).

До ansible я удалял network-manager и вручную настраивал хосты через файлы /etc/init.d/network-scripts/ifcfg-* - думаю, я мог бы сделать то же самое с ansible, используя факт ansible_default_ipv4:

    "ansible_default_ipv4": {
        "address": <snip>,
        "alias": "enp3s0",
        "gateway": <snip>,
        "interface": "enp3s0",
        "macaddress": <snip>,
        "mtu": 1500,
        "netmask": "255.255.255.128",
        "network": <snip>,
        "type": "ether"
    }

Ansible far настолько хорош, и для этого я хочу убедиться, что я не иду без надобности против зерна ansible. Я готов не удалять network-manager, если есть хорошие способы управления конфигурацией интерфейса, опосредованного сетевым менеджером, через ansible ...

Я вернулся к этому после того, как немного познакомился с анзиблем - подумал, что поделюсь своим решением.

Первое, о чем следует знать: в NetworkManager есть концепция Плагины конфигурации - которые используются для адаптации внешних источников информации к конфигурации NetworkManager. Redhat распространяет плагин ifcfg-rh, который пытается адаптировать файлы конфигурации в стиле / etc / sysconfig / network-scripts / ifcfg * в конфигурацию NetworkManager, однако с этим подходом есть немало ошибок ... и сетевые скрипты / ifcfg * формат конфигурации никогда не был особенно простым ... Это также довольно сбивает с толку относительно того, какова семантика изменений в файлах сетевых скриптов - и когда именно будут применены новые настройки. Кроме того, файлы типа ifcfg- * не поддерживают все сетевые конфигурации, поддерживаемые NetworkManager.

Я обнаружил, что намного проще и проще отказаться от плагина ifcfg-rh и использовать вместо него плагин keyfile.

В задачах / main.yml:

---

- name: ensure NetworkManager is configured to use keyfile plugin
  copy: src=NetworkManager.conf dest=/etc/NetworkManager/NetworkManager.conf mode=0600
  notify:
   - restart NetworkManager
   - wait for new network settings

- name: ensure NetworkManager settings are initialized from appropriate keyfile configuration
  copy: src={{ myorg_network_profile }}.conf dest=/etc/NetworkManager/system-connections/ansible_generated.conf mode=0600
  notify:
    - restart NetworkManager
    - reload network interface
    - wait for new network settings

Обработчики выглядят примерно так:


 - name: reload network interface
   shell: nmcli con reload 
 - name: restart NetworkManager 
   service: name=NetworkManager state=restarted 
 - name: wait for new network settings
   sudo: false 
   local_action: 
      module: wait_for host={{ ansible_ssh_host | default(inventory_hostname) }} port=22 delay=10 timeout=300

с помощью NetworkManager.conf, который выглядит так:

[main]
plugin=keyfile

Затем я создаю файлы конфигурации ключевых файлов, подходящие для различных типов сетевых конфигураций, которые я хочу развернуть:

пример: files / dhcp.conf

[connection]
id=dhcp
uuid=50263651-4f14-46bc-8dd8-818bf0fe3367
type=ethernet
autoconnect=true

[ipv6]
method=auto

[ipv4]
method=auto

или для хоста со статическими сетевыми настройками и ip в двух подсетях:

[connection]
id=custom-connection-profile
uuid=50263651-4f14-46bc-8dd8-818bf0fe3362
type=ethernet
autoconnect=true

[ipv6]
method=auto

[ipv4]
method=manual
dns=192.168.0.1;192.168.0.x;
dns-search=foo.com;
address1=192.168.0.4/24,192.168.0.1
address2=172.19.0.12/25,172.19.12.1

Чтобы превратить недавно установленную систему со случайным IP-адресом в хост со статически назначенным адресом:

ansible-playbook site.yml -i hosts.ini --extra_vars "ansible_ssh_host=<ip_address_of_newly_installed_host>" --limit <ansible_hostname_from_inventory>

Я думаю, что это хороший подход, но рад любой обратной связи.

В наши дни (осень 2019 года) ответом будет собственный модуль Ansible nmcli: https://docs.ansible.com/ansible/latest/modules/nmcli_module.html