web-dev-qa-db-ja.com

AnsibleまたはSaltstackで構成プッシュを自動再試行しますか?

500〜2000の非常に地理的に分散したホストの構成管理システムを選択しようとしています。ネットワークの信頼性はさまざまであるため、特定の時間に多数のホストが一時的に使用できなくなる可能性があります。このため、最初に選択したのはChefでした。これは、「プル」モデルを使用しており、ホストがオンラインになってチェックインすると、すぐに現在の構成を取得するためです。

ただし、ホストが30分ごとに新しい構成についてChefサーバーをポーリングするだけの場合、迅速な展開は不可能です。また、私はルビー主義者ではありません。プッシュベースのモデルを使用したいと思います。このモデルでは、構成をできるだけ迅速にホストにプッシュできます。したがって、自然な選択はAnsibleまたはSaltStack(おそらくSaltStack)のようです。しかし、私の質問は、AnsibleとSaltStackが失敗したホストまたはダウンしたホストをどのように処理するかということです。ホストがオンラインに戻るまで、プッシュを永久に再試行し続ける方法はありますか?これらのツールのいずれかを使用してダウンホストの結果整合性を適切に処理するための既存のパターンはありますか?ありがとう!

1
Will

Saltは、ノードからマスターへのプルモデルで実行されます。次のようなマスターからグローバルコマンドを発行できます

salt 'api*.domain.com` state.highstate

これにより、api * .domain.comのID(ホスト名)を持つすべてのホストでハイステートが実行されます。ハイステートは、完全なシェフの実行のようなものです。

通常、デフォルトでは、ミニオンでマスタースケジュールのハイステートを実行するか、ミニオンでスケジュールを実行して、10分ごとにハイステートを実行すると言います。

したがって、ノードがダウンしていて、マスターでコマンドを実行して状態を実行すると、saltはノードがダウンしていることを実行出力で報告します。これは、さまざまな方法でフォーマットして取り込むことができます。たとえば、mysqlにログを記録することもできます。

したがって、たとえば、マスターサーバーで上記のコマンドを実行して、すべてのapi*.domain.comノードでハイステートを実行したとします。 salt-minionがオンラインに戻った後、5000のうち2つが現在再起動している場合、メッセージバスを介してマスターから偶数を取得し、ハイステートを実行します。

Saltには、マスターのロードを支援するプロキシノードと呼ばれるものもあります。どこかに単一のマスターがあり、各データセンターにプロキシノードがあり、マスターから送信されたすべてのコマンドがプロキシノードを通過し、それらのデータセンターのミニオンがプロキシノードにヒットし、マスターにはヒットしません。

2
Mike

私はAnsibleについてのみこれに答えることができます。

Ansible自体は、到達できないホストを処理しません。接続を試みますが、これが不可能な場合、ホストは現在のプレイから外されます。しかし、Ansibleは、この自分自身に対処するためのいくつかのツールを提供します。

まず、 wait_for モジュールがあります。これにより、ホストが使用可能になるまで非常に高いタイムアウトで待機できます。

- wait_for:
    port: 22
    delay: 10
    timeout: 3600
    Host: "{{ inventory_hostname }}"
  delegate_to: localhost

ただし、Ansibleはデフォルトですべてのホストがこのタスクを通過するまでそれ以上のタスクを処理しないため、これだけでプレイを実行するときに問題が発生します。この場合、これは逆効果です。あなたの説明によると、最後のホストが最終的に到達可能になったときに、最初のホストが再び利用できなくなる可能性があります。

これを解決するには、 strategies という新機能を備えたAnsible2を使用する必要があります。 strategy: freeを使用すると、すべてのタスクを可能な限り高速に実行できます。つまり、ホストが使用可能になるとすぐにすべてのタスクを実行できます。

それでも、接続がダウンする可能性があり、この場合、自動的に再試行する組み込みの方法はありません。 ssh接続を確立できない場合、Ansible〜1.9以降、このホストに対して致命的なエラーがスローされます。この種の接続エラーをキャッチする方法はありません。ただし、他のホストには影響しませんが、すべて正常に再生されます。

ただし、再試行できます。失敗したホストはファイルに保存されます<playbook-name>.retryプレイブック自体の横。失敗したホストのみを再試行するには、次のコマンドを実行できます。

ansible-playbook ... --limit @<playbook-name>.retry
2
udondan

マイクの答えを拡張するには、Saltと同時にプッシュとプルを実行できます。押すのは簡単です

salt 'api*.domain.com` state.highstate

同時に、ミニオンは 組み込みスケジューラ を介してX分または時間ごとにスケジュールされたプルを実行できます。私の好みの方法は、pillarを介して構成することですが、minion構成に追加することもできます。何かのようなもの:

schedule:
  highstate:
    function: state.highstate
    maxrunning: 1
    hours: 1
    splay: 600
1
savamane