通过Terraform创建的自定义镜像RHEL8虚拟机在Ansible配置阶段出现SSH超时断连问题
通过Terraform创建的自定义镜像RHEL8虚拟机在Ansible配置阶段出现SSH超时断连问题
看起来你遇到了一个挺头疼的批量部署问题——用Terraform建好7台基于自定义RHEL8镜像的VM后,Jenkins调用Ansible做配置时,总会有1-3台在12-13分钟左右掉链子,要么SSH连接超时,要么直接报管道破裂。结合微软支持工程师提到的NIC未正常关联,咱们可以从几个核心方向一步步排查解决:
一、先搞定NIC关联的基础问题
既然官方工程师已经点出NIC的问题,这是最优先要确认的环节:
- 验证Terraform中NIC与VM的绑定逻辑:检查你的Terraform代码,确保每台VM的NIC都正确关联到指定子网、NSG,且没有重复绑定的情况。可以在代码里加个输出,打印每台VM的NIC ID和状态;或者在Jenkins流水线里加一步,用
az network nic show --ids <nic-id>命令批量验证所有NIC的状态,必须确认所有NIC都是「已关联」状态后,再触发Ansible配置。 - 复查NSG规则:虽然你说NSG已经建好,但还是要再核对一遍:入站规则里有没有放开22端口给Jenkins/Ansible控制节点的IP?出站规则有没有允许VM访问必要的资源(比如yum源、Ansible控制节点的反向连接)?可以临时把SSH的入站源放宽到
0.0.0.0/0测试,排除NSG拦截的可能性。
二、优化SSH连接与超时配置
SSH断连大概率和超时设置、服务稳定性有关:
- 调整Ansible的超时参数:默认的SSH超时时间可能不够用,在
ansible.cfg里把timeout改成120甚至更长;同时在playbook开头加一步等待SSH就绪的任务,避免VM还没完全初始化就发起连接:- name: 等待VM SSH服务稳定 wait_for_connection: timeout: 300 # 最多等5分钟 - 检查VM内部的SSH配置:如果能手动登录断连的VM,去看
/var/log/secure日志,排查SSH服务有没有崩溃。另外,自定义镜像里的/etc/ssh/sshd_config可能有严格的超时设置,建议调整:
修改后重启sshd服务:ClientAliveInterval 60 # 每分钟发一次心跳 ClientAliveCountMax 10 # 连续10次没响应才断开systemctl restart sshd。
三、解决批量VM的初始化延迟问题
Terraform显示VM「运行中」不代表OS内部初始化完成,这也是常见的坑:
- 在Terraform里加SSH就绪等待:用
null_resource配合本地命令,循环检测每台VM的22端口是否开放,确认所有VM都能正常SSH后再往下走:resource "null_resource" "wait_for_all_ssh" { count = 7 provisioner "local-exec" { command = "until nc -zv ${azurerm_linux_vm.vm[count.index].private_ip_address} 22; do sleep 10; done" } depends_on = [azurerm_linux_vm.vm] } - 排查自定义镜像的问题:换官方的RHEL8镜像创建一台VM测试,如果不会断连,那问题肯定出在你的自定义镜像上。检查镜像里的网络配置(比如NetworkManager状态)、是否安装了Azure代理(waagent),有没有残留的异常脚本导致网络不稳定。
四、优化Jenkins+Ansible的流水线逻辑
批量任务本身就容易出问题,拆分和重试能提升稳定性:
- 分批次执行Ansible任务:不要一次性对7台VM跑所有配置,分成2-3批执行,降低单批次的连接压力。
- 给关键任务加重试机制:在Ansible playbook里给容易失败的任务加上重试,比如:
- name: 执行配置脚本 shell: /path/to/your/script.sh retries: 3 delay: 60 register: task_result until: task_result is succeeded
备注:内容来源于stack exchange,提问作者devopsguy
相关产品推荐
相关产品推荐

