Я новичок в анзибле, и небольшой поиск в 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