通過 ansible 使用靜態設置配置 centos-7 網路介面的推薦方法
我是 ansible 的新手,在Google上搜尋並沒有快速引導我找到正確的解決方案。
使用 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 far 太棒了,為此我想確保我不會不必要地反對 ansible 穀物。如果有好的方法可以通過 ansible 管理 network-manager 介導的介面配置,我願意不解除安裝 network-manager …
在對 ansible 更加熟悉之後,我又回到了這個話題——我想我會分享我的解決方案。
首先要注意:NetworkManager 有配置外掛的概念——用於將外部資訊源調整到 NetworkManager 配置中。Redhat 分發了一個名為 ifcfg-rh 的外掛,該外掛試圖將 /etc/sysconfig/network-scripts/ifcfg* 樣式的配置文件改編為 NetworkManager 配置,但是這種方法有很多陷阱……以及 network-scripts/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
然後,我創建適合我要部署的各種網路配置的密鑰文件配置文件:
範例:文件/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>
我認為這是一個很好的方法,但對任何回饋都很高興。