Ansible卡在状态不佳的某些服务器上吗?

时间:2019-06-11 07:18:54

标签: ansible

我有一本如下所示的剧本,它在大多数情况下都可以正常运行。但是最近我注意到的是,它被卡在 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剧本?我们可以在一本书中完成所有这些工作吗?

3 个答案:

答案 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