Ansible でネットワークの変更と再起動を処理するにはどうすればよいでしょうか?

Ansible でネットワークの変更と再起動を処理するにはどうすればよいでしょうか?

現在、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 シェルに近づくように提案を少し変更しました。

  1. ネットワーク再起動タスクにはasyncと を使用します。poll
  2. 次に、set_factノードの IP を更新します。
  3. 次に、ssh ポートが新しい IP で応答するまで待ちます。
  4. 最後に、残っているタスクを続行します。
  - 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

関連情報