maneira recomendada de configurar uma interface de rede centos-7 com configurações estáticas via ansible

4

Sou novo no ansible e um pouco de googling não me levou rapidamente para a solução certa para a minha pergunta.

Qual é a maneira 'com o grão' para atribuir configurações de rede estáticas a um host centos-7 com ansible. Eu sinto que isso deve ser uma necessidade muito comum - e deve haver muitas pessoas com dúvidas sobre a abordagem correta a tomar depois de todas as mudanças no sistema de configuração de rede na transição de rhel-6 para rhel-7 (ou seja , network-manager por padrão, nome de dispositivo consistente por padrão do kernel, systemd).

Antes do ansible eu tinha desinstalado o network-manager e configurado manualmente os hosts via arquivos /etc/init.d/network-scripts/ifcfg-* - eu acho que poderia fazer o mesmo com ansible usando o fato 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 agora é tão bom e para isso eu quero ter certeza de que não estou indo desnecessariamente contra o grão ansible. Estou disposto a não desinstalar o gerenciador de rede se houver boas maneiras de gerenciar a configuração da interface mediada pelo gerenciador de rede por meio do ansible ...

    
por Ben 10.02.2015 / 21:36

1 resposta

3

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.

    
por 04.03.2015 / 00:02