我有一本如下所示的剧本,它在大多数情况下都可以正常运行。但是最近我注意到的是,它被卡在 ALL 组中的某些服务器上,并停在那里。它甚至不会前进到 ALL 列表中的其他服务器。
# This will copy files
---
- hosts: ALL
serial: "{{ num_serial }}"
tasks:
- name: copy files
shell: "(ssh -o StrictHostKeyChecking=no abc.com 'ls -1 /var/lib/jenkins/workspace/copy/stuff/*' | parallel -j20 'scp -o StrictHostKeyChecking=no abc.com:{} /data/records/')"
- name: sleep for 5 sec
pause: seconds=5
因此,当我开始调试时,我注意到在实际的服务器上它被卡住了-我可以ssh(登录)正常,但是当我运行ps
命令时,它只是挂起了,而且我没有将光标移回去因此这意味着ansible在该服务器上执行以上scp命令也会陷入困境。
因此,我的问题是,即使我的某个服务器处于该状态,为什么不只是Ansible超时并移至其他服务器?我们在这里有什么可以做的,以便ansible不会仅在等待服务器响应时暂停所有操作。
Note服务器已启动并正在运行,我可以ssh正常运行,但是当我们运行ps
命令时,它只是挂起,因此Ansible也挂起了。
有什么方法可以在 ALL 组中的所有服务器上运行此命令ps aux | grep app
,并使执行该命令的所有服务器的列表都正确(如果挂起了某些命令,服务器超时,然后移至“所有”列表中的其他服务器),然后将该列表传递给我上面的ansible剧本?我们可以在一本书中完成所有这些工作吗?
答案 0 :(得分:2)
Ansible没有此功能,拥有它甚至可能很危险。在这种情况下,我的建议是:查看失败,重建服务器,再次运行。
可以在剧本中构建所需的功能,您可以做的是创建一个虚拟async任务来触发问题,并验证结果。如果异步任务没有在合理的时间内完成,请使用meta: end_host
任务移至下一个主机。
您可能需要用ignore_errors: yes
标记其中一些任务。
很抱歉,我从未尝试过为您提供完整的答案。
答案 1 :(得分:2)
您可以使用strategies实现目标。默认情况下:
播放采用线性策略进行,其中所有主机都将运行 主机开始下一个任务之前执行任务
通过使用免费策略,每台主机将尽可能快地运行到播放结束。例如:
---
- hosts: ALL
strategy: free
tasks:
- name: copy files
shell: "(ssh -o StrictHostKeyChecking=no abc.com 'ls -1 /var/lib/jenkins/workspace/copy/stuff/*' | parallel -j20 'scp -o StrictHostKeyChecking=no abc.com:{} /data/records/')"
- name: sleep for 5 sec
pause: seconds=5
另一种选择是使用timeout运行命令,然后使用registers处理命令是否成功执行。例如,timeout 5 sleep 10
由于超时而返回124,而timeout 5 sleep 3
由于命令在超时发生之前终止而返回0。在ansible脚本中,您可以使用类似以下内容的
tasks:
- shell: timeout 5 ps aux | grep app
register: result
ignore_errors: True
- debug:
msg: timeout occured
when: result.rc == 124
答案 2 :(得分:0)
如“ Alassane Ndiaye”所述,您可以尝试下面的代码片段。 当shell不超时时我要提供条件的地方
tasks:
- shell: timeout 5 ps aux | grep app
register: result
ignore_errors: True
- name: Run your shell command
shell: "(ssh -o StrictHostKeyChecking=no abc.com 'ls -1 /var/lib/jenkins/workspace/copy/stuff/*' | parallel -j20 'scp -o StrictHostKeyChecking=no abc.com:{} /data/records/')"
when: result.rc != 124 && result.rc != 0