2017-02-21 5 views
1

私は可用性のために複数のホストを持つシステムを持っています。私はただ一つのホストでAnsibleプレイブックを実行する必要があります。ただし、これらのホストのうちのいくつかには到達できない場合があります。私はhost1、host2、host3を持っているとしましょう... host1に到達できない場合、私はAnonymousにhost2を試して欲しいと思います。もしhost2が到達可能で、Anipalがいくつかのbashスクリプトをうまく実行するならば、私はAnsibleが残りのホストをスキップするようにします。助言がありますか?1つのホストで成功した場合、実行可能なプレイブックを終了するにはどうすればよいですか?

+0

は、あなたが "一部" の定義にはどうすればよい "* *成功したいくつかのbashスクリプトを実行しますか"? – techraf

+0

「到達不能」をどのように定義しますか? sshが到達不能なホストを自動的にスキップします。 – sm4rk0

+0

@ sm4rk0私はそれが答えにどのように影響するのだろうかと不思議です。試行を続けるか停止するかは、謎の「いくつかの」スクリプトの実行が成功するかどうかという唯一の決定要因です。あなたの意見では、「到達不能」の定義はどのような役割を果たしますか? – techraf

答えて

-1

到達可能ではないホストは考えられませんが、セットアップフェーズでは到達不能なホストのリストは削除されます。

ホストの残りのリストでは、そのbashスクリプトの特定のタスクに対して 'run_once:yes'を使用します。利用可能なホストから最初に一致するホストを選択します。

1

これはおそらく最適な解決策ではありませんが、より良い解決策を見つけることができませんでした。

  • (オプション)完全に(あなたがホストの事実を収集する必要がない場合)はスキップする必要のあるホストをスキップし、Falseからgather_factsを設定します。
  • serialを1に設定すると、デフォルトの5台のホストではなく、一度に1台のホストで完全に再生されます。
  • 再生の最後にホストファクト(例ではdone)をTrueに設定するか、より具体的な条件(コマンド出力)が必要な場合はregisterを使用してください。
  • 変数がTrueに設定されているときに実行される(またはregisterを使用した場合は期待値を持つ)再生を開始するときに、すべてのホストに対してend_playmetaを使用します。全てhostvars(インベントリ内のすべてのホストのために設定されているすべての変数を含むPythonの辞書)をループに
    1. for:私は値をこのように抽出するJinja2 template languageを使用します。
    2. ifホストがTrueに設定された変数を持つかどうかを確認し、その場合は文字列Trueを返します。
    3. defaultdoneがホストに対して定義されていない場合(エラー'dict object' has no attribute 'done')、デフォルト値を設定するフィルタ。たとえば、

- hosts: all 
    serial: 1 
    gather_facts: False 

    tasks: 
    - meta: end_play 
    when: "{% for item in hostvars.values() %}{% if item.done|default(False) %}True{% endif %}{% endfor %}" 

    # The rest of the play goes here 

    - set_fact: 
     done: True 
関連する問題