Ansible执行异步shell脚本重命名网卡遇连接重置及异步任务疑问
问题根源
你遇到的两个核心问题分别是异步任务执行时SSH会话挂断导致进程被杀,以及网卡重命名后任务缓存自动清理导致找不到任务,具体原因和解决方案如下:
1. 为什么前两个版本的异步任务会挂起
Ansible默认的异步任务即使设置了async: 0+poll:0,底层启动的进程仍然绑定在当前SSH会话的pty下,一旦SSH会话因为网卡断开终止,会话发出的SIGHUP信号会直接杀掉正在运行的shell脚本,所以才会执行到ip link set down就停止运行。
你后续用括号包裹命令加&放到后台的写法是正确的,相当于手动给进程做了脱离会话处理,进程不会随SSH会话挂断被杀死,所以能跑完整个重命名流程。
2. 为什么清理异步缓存会报错
这个报错属于该场景下的正常现象:你设置的async:90,而整个网卡重命名+SSH重启的流程只需要20秒左右,任务执行完成后Ansible的异步进程会自动清理~/.ansible_async/目录下的缓存文件,等你15秒延迟后重连到节点调用async_status时,缓存文件已经被删除,自然会提示找不到任务。
如果确实要走清理流程,只需要给async_status任务加ignore_errors: yes即可,缓存存在就清理,不存在也不影响实际运行效果。
3. 该场景下的最优异步任务写法
如果不需要追踪异步任务的执行结果,可以直接去掉async和poll参数,用nohup手动后台运行的写法更简单,没有额外复杂度:
- name: Hot Rename Main Iface become: true shell: cmd: | nohup bash -c ' sleep 5 ip link set oldiface down ip link set oldiface name newiface ip link set newiface up nmcli networking off sleep 1 nmcli networking on sleep 5 systemctl restart sshd ' > /dev/null 2>&1 & - name: Wait For Reconnection wait_for_connection: delay: 15 timeout: 180
内容的提问来源于stack exchange,提问作者Cilyan
相关产品推荐
相关产品推荐

