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