我正在使用 ansible 通过以下命令在某些节点上执行脚本(myScript.sh):
- hosts: primaryNodes,!node13
vars:
mongodPath: /usr/local/mongodb
become: yes
become_user: user
tasks:
- name: starting mongod on all shards
shell: "sh {{ mongodPath }}/myScript.sh"
register: out
- debug: var=out.stdout_lines
脚本的执行可能需要大约 2-3 秒或更短的时间才能在 shell 上给出输出消息(取决于节点)。我使用 out.stdout_lines 进行调试,以确保执行状态。
一些节点给出以下正确的输出;
ok: [node16] => {
"out.stdout_lines": [
"about to fork child process, waiting until server is ready for connections.",
"forked process: 2837",
"child process started successfully, parent exiting"
]
}
但其他一些节点,好像已经传递了命令,但是并没有执行它;
ok: [node2] => {
"out.stdout_lines": []
}
我已经设法通过使用以下剧本(添加睡眠)解决了这个问题 - 所有节点现在都给出所需的输出消息(子进程成功启动);
- hosts: primaryNodes,!node13
vars:
mongodPath: /usr/local/mongodb
become: yes
become_user: user
tasks:
- name: starting mongod on all shards
shell: "sh {{ mongodPath }}/myScript.sh && sleep 5s"
register: out
- debug: var=out.stdout_lines
我知道这对于我的情况来说是一个粗略的解决方案,但是有没有办法等待来自节点的响应消息?
答案1
shell: "sh {{ mongodPath }}/myScript.sh && sleep 5s"
这将执行我的脚本,然后等待它结束,然后等待 5 秒钟,您可以尝试以下操作:
shell: "{{ mongodPath }}/myScript.sh && tail -n 10 {{ mongodPath }}/myScript.log"
第二个命令将等待我的脚本成功完成(返回 0),然后它将显示脚本日志,如果没有日志那么您的第一个命令就没有正常工作。