我是 ansible 的新手,稍微用谷歌搜索并不能让我快速找到问题的正确解决方案。
使用 ansible 为 centos-7 主机分配静态网络设置的“符合要求”的方法是什么。我觉得这肯定是一个非常普遍的需求——在从 rhel-6 过渡到 rhel-7 的过程中,网络配置系统发生了很多变化(即默认情况下使用网络管理器、默认情况下从内核使用一致的设备命名、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"
}
Ansible 到目前为止非常棒,为此我想确保我不会不必要地违背 Ansible 的初衷。如果有好的方法可以通过 Ansible 管理网络管理器介导的接口配置,我愿意不卸载网络管理器...
答案1
在对 ansible 更加熟悉之后,我又回到了这个问题——我想分享我的解决方案。
首先要注意的是:NetworkManager 有以下概念:配置插件-- 用于将外部信息源适配到 NetworkManager 配置中。Redhat 分发了一个名为 ifcfg-rh 的插件,它试图将 /etc/sysconfig/network-scripts/ifcfg* 样式的配置文件适配到 NetworkManager 配置中,但是这种方法存在很多问题... 并且 network-scripts/ifcfg* 配置格式从来都不是特别简单... 网络脚本文件更改的语义是什么以及新设置何时应用也相当令人困惑。此外,ifcfg-* 类型的文件不支持 NetworkManager 支持的所有网络配置。
我发现放弃 ifcfg-rh 插件并改用 keyfile 插件更加容易且更直接。
在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
处理程序看起来像这样:
- 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
然后,我创建适合我想要部署的各种网络配置的 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>
我认为这是一个好方法,但也很高兴收到任何反馈。
答案2
如今(2019 年秋季),原生 Ansible nmcli 模块就是答案:https://docs.ansible.com/ansible/latest/modules/nmcli_module.html