私はansibleを使い始めたばかりですが、少しグーグルしても私の質問に対する正しい解決策にすぐには導けません。
Ansibleを使用して静的ネットワーク設定をcentos-7ホストに割り当てる「粒度の高い」方法とはこれはかなり一般的なニーズだと思います-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"
}
Ansible farはとても素晴らしいので、これのために、不必要な穀物に不必要に向かわないようにします。 ansibleを介してネットワークマネージャーを介したインターフェイス構成を管理する良い方法がある場合は、ネットワークマネージャーをアンインストールしないことをいとわない...
私はansibleに少し慣れた後、これに戻りました-私の解決策を共有したいと思いました。
最初に知っておくべきこと:NetworkManagerには Configuration plugins -という概念があり、これを使用して外部の情報ソースを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
次に、展開するさまざまな種類のネットワーク構成に適したキーファイル構成ファイルを作成します。
例:files/dhcp.conf
[connection]
id=dhcp
uuid=50263651-4f14-46bc-8dd8-818bf0fe3367
type=ethernet
autoconnect=true
[ipv6]
method=auto
[ipv4]
method=auto
または、静的ネットワーク設定と2つのサブネット上の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>
これは良いアプローチだと思いますが、どんなフィードバックでも満足です。
最近(2019年秋)のネイティブAnsible nmcliモジュールが答えになります: https://docs.ansible.com/ansible/latest/modules/nmcli_module.html