通过 ansible 使用静态设置配置 centos-7 网络接口的推荐方法

Ben*_*Ben 8 ansible rhel7 centos7

我是 ansible 的新手,一点点谷歌搜索并没有让我很快找到我的问题的正确解决方案。

使用 ansible 将静态网络设置分配给 centos-7 主机的“with the Grain”方式是什么?我觉得这一定是一个非常普遍的需求——而且一定有很多人对在从 rhel-6 到 rhel-7(即, 默认情况下为 network-manager,默认情况下来自内核 systemd 的一致设备命名)。

在 ansible 之前,我一直在卸载网络管理器并通过 /etc/init.d/network-scripts/ifcfg-* 文件手动配置主机——我想我可以使用 ansible_default_ipv4 事实对 ansible 做同样的事情:

    "ansible_default_ipv4": {
        "address": <snip>,
        "alias": "enp3s0",
        "gateway": <snip>,
        "interface": "enp3s0",
        "macaddress": <snip>,
        "mtu": 1500,
        "netmask": "255.255.255.128",
        "network": <snip>,
        "type": "ether"
    }
Run Code Online (Sandbox Code Playgroud)

Ansible far 非常棒,为此我想确保我不会不必要地反对 ansible 谷物。如果有通过ansible管理网络管理器介导的接口配置的好方法,我愿意不卸载网络管理器...

Ben*_*Ben 6

在对 ansible 更加熟悉之后,我又回到了这个话题——我想我会分享我的解决方案。

首先要注意的是:NetworkManager 具有配置插件的概念——用于将外部信息源调整到 NetworkManager 配置中。Redhat 分发了一个名为 ifcfg-rh 的插件,它试图将 /etc/sysconfig/network-scripts/ifcfg* 样式的配置文件改编为 NetworkManager 配置,但是这种方法有很多问题......以及 network-scripts/ifcfg * 配置格式从来都不是特别简单......它对于网络脚本文件更改的语义是什么也很困惑——以及什么时候会应用新的设置。此外,ifcfg-* 类型文件不支持 NetworkManager 支持的所有网络配置。

我发现放弃 ifcfg-rh 插件并使用密钥文件插件更容易和更直接。

在 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
Run Code Online (Sandbox Code Playgroud)

处理程序看起来像这样:


 - 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
Run Code Online (Sandbox Code Playgroud)

使用如下所示的 NetworkManager.conf:

[main]
plugin=keyfile
Run Code Online (Sandbox Code Playgroud)

然后,我创建适合我要部署的各种网络配置的密钥文件配置文件:

示例:文件/dhcp.conf

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

[ipv6]
method=auto

[ipv4]
method=auto
Run Code Online (Sandbox Code Playgroud)

或者对于具有静态网络设置和两个子网上的 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
Run Code Online (Sandbox Code Playgroud)

要将一个新安装的随机 ip 系统转换为具有静态分配地址的主机:

ansible-playbook site.yml -i hosts.ini --extra_vars "ansible_ssh_host=<ip_address_of_newly_installed_host>" --limit <ansible_hostname_from_inventory>
Run Code Online (Sandbox Code Playgroud)

我认为这是一个很好的方法,但很高兴收到任何反馈。