Voltei a isso depois de me tornar um pouco mais familiarizado com o ansible - pensei em compartilhar minha solução.
Antes de mais nada, o NetworkManager tem o conceito de plugins de configuração - que são usados para adaptar fontes externas de informação na configuração do NetworkManager. O Redhat distribui um plugin chamado ifcfg-rh que tenta adaptar os arquivos de configuração do estilo / etc / sysconfig / network-scripts / ifcfg * para a configuração do NetworkManager, no entanto existem algumas dicas com esta abordagem ... e os scripts de rede / ifcfg * O formato de configuração nunca foi particularmente simples ... Também é bastante confuso sobre o que é a semântica de alterações nos arquivos de scripts de rede - e quando exatamente novas configurações serão aplicadas. Além disso, os arquivos do tipo ifcfg- * não suportam todas as configurações de rede suportadas pelo NetworkManager.
Eu achei muito mais fácil e mais simples abandonar o plugin ifcfg-rh e usar o plugin keyfile.
Dentro do tasks / 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
Os manipuladores são parecidos com isto:
- 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
com um NetworkManager.conf que se parece com isto:
[main]
plugin=keyfile
Eu então crio arquivos de configuração de arquivos-chave adequados para os vários tipos de configurações de rede que eu quero implantar:
exemplo: arquivos / dhcp.conf
[connection]
id=dhcp
uuid=50263651-4f14-46bc-8dd8-818bf0fe3367
type=ethernet
autoconnect=true
[ipv6]
method=auto
[ipv4]
method=auto
ou para um host com configurações de rede estáticas e um ip em duas sub-redes:
[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
Para transformar um sistema recém-instalado em um ip aleatório em um host com um endereço estaticamente atribuído:
ansible-playbook site.yml -i hosts.ini --extra_vars "ansible_ssh_host=<ip_address_of_newly_installed_host>" --limit <ansible_hostname_from_inventory>
Eu acho que esta é uma boa abordagem, mas feliz por qualquer retorno.