如何使用 Ansible 处理网络变化并重启?

如何使用 Ansible 处理网络变化并重启?

我目前正在开发 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 保持一致。

  1. 使用asyncpoll执行网络重启任务。
  2. 然后set_fact更新节点IP。
  3. 接下来等待 ssh 端口在新 I​​P 上响应。
  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,如果不这样做也是可行的,测试应该非常简单。

相关内容