2016-10-18 10 views
2

まだ@Ansibleを学んでいます。 MongoDBのリストアを自動化しようとしています。不可能 - wait_for中にタスクを繰り返す

私はMongoDBを実行する3台のサーバーを持っています。復元後、MongoDBサーバーの状態をシェルコマンドで出力することができます(下記参照)。

私がしたいこと出力が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を出力するタスクをどのモジュールで繰り返す必要がありますか?

また、このプレイブックを間違った方法で使用していますか?

答えて

2

これはwait_forではなくdo-until loopの使用例です。

mongoReplInfoを次のように2回登録します。すぐに600秒後に。次に、あなたの状態の値をチェックすることができます。

- name: Register MongoDB sync status 
    shell: mongo --eval "printjson(rs.status())" 
    register: mongoReplInfo 
    until: false 
    retries: 2 
    delay: 600 

しかし、条件が満たされたときにループが終了するようにするのではなく、再試行の回数を増やし、untilパラメータで条件をチェックする必要があります。リンク先のドキュメントの章のように。

+0

私に正しい方向を指してくれてありがとう。 ' - 名前:までmongoStatus :mongoStatus.stdout.find( "lastHeartbeatMessage")= 1回の リトライシェルモンゴ--eval "printjson(rs.status())" レジスタ:まだ アクションを同期する場合を確認します! 50 遅延:10 run_once:true' 私が使ったもの – Kevin

関連する問題