如何使用 Ansible 處理網路變更並重新啟動?

如何使用 Ansible 處理網路變更並重新啟動?

我目前正在開發 Ansible 使用的網路設定角色來自訂來自 Debian 11 範本的全新虛擬機器。

以下角色從DHCP 變更為靜態介面配置,然後重新啟動網路服務。 )

  - 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 移動到重新啟動網路服務任務,並永遠掛起...

**從 Ansible 的角度來看,是否可以使用新 IP 動態重新連線到主機?或者,繞過重啟networking.service的執行結果? **

答案1

雖然非常接近列出的問題https://serverfault.com/users/378597/peter-zhabin用途win_shell,不適用於 Linux。

在我的腦海中,這似乎是 Linux 下的解決方案,將 win_shell 更改為 shell,儘管我稍微修改了建議,使其更接近 Linux 中的 bash shell。

  1. asyncpoll用於網路重啟任務。
  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 將重新啟動轉換為 shell,將重新啟動操作置於背景。這可能不需要,但 YMMV 嘗試使用相同的邏輯ansible.builtin.serviceshell,如果不這樣做也可行的話,測試應該非常簡單進行比較。

相關內容