我目前正在开发 Ansible 使用的网络配置角色,以定制来自 Debian 11 模板的全新虚拟机。
以下角色从 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 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
,如果不这样做也是可行的,测试应该非常简单。