
現在、Debian 11 テンプレートから作成された新しい仮想マシンをカスタマイズするために Ansible で使用されるネットワーク構成ロールを開発しています。
次のロールは、DHCP から静的インターフェイス構成に変更し、ネットワーク サービスを再起動します。テスト目的で、IP/ネットマスク/ゲートウェイを追加変数として設定します (ロールを使用するサーバーに応じて動的に変更されます)
- name: ens3 reconfiguration
ansible.builtin.template:
src: interfaces.j2
dest: /etc/network/interfaces
- name: Restart networking.service
ansible.builtin.service:
name: networking
state: restarted
理解のために、interfaces.j2 の内容を以下に示します。
# The primary network interface
auto ens3
iface ens3 inet static
address {{ ens3_ip }}/{{ ens3_netmask }}
gateway {{ ens3_gateway }}
dns-nameservers X.X.X.X
dns-search my_domain.net
ここでの問題は、ネットワーク インターフェイスが DHCP で構成されているため、たとえば 10.0.0.1 があり、それを 10.0.0.50 に再構成すると、Ansible が networking.service の再起動タスクに移動し、永久にハングしてしまうことです...
**Ansible の観点から、新しい IP でホストに動的に再接続することは可能ですか? または、restart networking.service の実行結果をバイパスすることは可能ですか? **
答え1
非常に近い質問ですが、https://serverfault.com/users/378597/peter-zhabin用途ウィンシェルただし、Linux には適用されません。
頭に浮かぶのは、Linux での解決策としては win_shell を shell に変更することのように思えますが、Linux の bash シェルに近づくように提案を少し変更しました。
- ネットワーク再起動タスクには
async
と を使用します。poll
- 次に、
set_fact
ノードの IP を更新します。 - 次に、ssh ポートが新しい IP で応答するまで待ちます。
- 最後に、残っているタスクを続行します。
- name: Async restart of networking.service
shell: "sleep 1; systemctl restart networking.service &"
args:
executable: /bin/bash
async: 100
poll: 0
- name: set_fact for the nodes new IP
set_fact:
ansible_host: "10.0.0.50"
- name: wait_for ssh port access
local_action:
module: wait_for
host: "{{ ansible_host }}"
port: 22
delay: 60
state: started
register: network_responding
次に、を登録した後でプレイブックに別のタスクを追加します。wait_result
そのタスクには、次のような条件付きの when 句を含めることができます。
when: network_responding|bool == true
私は再起動をbashでシェルに変換し、再起動操作をバックグラウンドで実行しました。これは必要ないかもしれませんが、同じロジックを使用しようとすると、結果は異なります。ansible.組み込みサービス、これなしでも実行可能である場合、テストを比較するのはかなり簡単なはずですshell
。