还在学习@Ansible。尝试自动化MongoDB恢复。
我有三台运行MongoDB的服务器。还原后,可以使用shell命令输出MongoDB服务器的状态(参见下文)。
我想要Ansible做的是在输出中10分钟后出现字符串'lastHeartbeatMessage'时执行任务。
- name: Register MongoDB sync status
shell: mongo --eval "printjson(rs.status())"
register: mongoReplInfo
- debug: var=mongoReplInfo
- name: Copy rs.status to local log
local_action: copy content={{ mongoReplInfo }} dest=/tmp/mongoStatus
- name: Copy rs.status to server
copy: src=/tmp/mongoStatus dest=/tmp/mongoStatus
- name: Check if slave is still syncing
wait_for: path=/tmp/mongoStatus search_regex=lastHeartbeatMessage
- name: Succesfull sync
shell: 'run_succesfull_command'
when: lastHeartbeatMessage is absent after 10 min
- name: Failed sync
shell: 'run_succesfull_command'
when: lastHeartbeatMessage is present after 10 min
现在我正在使用wait_for。但状态只写入文件一次,并且不会更新。我应该使用哪个模块来重复将rs.status
输出到服务器的任务?
或者我是以错误的方式拍摄这本剧本?
答案 0 :(得分:2)
这是do-until loop而非wait_for
的用例。
以下内容将注册mongoReplInfo
两次:立即注册,600秒后注册- name: Register MongoDB sync status
shell: mongo --eval "printjson(rs.status())"
register: mongoReplInfo
until: false
retries: 2
delay: 600
。然后你可以检查你的病情值。
until
但是您应该增加重试次数并检查array(24) {
["id"]=>
string(4) "3478"
["joindate"]=>
string(19) "2016-10-17 21:20:28"
["ip"]=>
string(12) "xxx.xxx.xx.xx"
...
}
array(24) {
["id"]=>
string(4) "3479"
["joindate"]=>
string(19) "2016-10-17 21:20:28"
["ip"]=>
string(12) "xxx.xxx.xx.xx"
...
}
参数中的条件,以便在满足条件时退出循环。就像链接的doc章一样。