再開可能な再生は可能ですか(例:site.retryを使用)。

再開可能な再生は可能ですか(例:site.retryを使用)。

Ansible を使用する場合、しばしば「等値」という属性が使用されます。役割を2番目に適用すると、同じ結果が得られます。たとえば、設定ファイルに同じ行の2番目のコピーを追加しません。

「回復可能」と呼ぶことができる別の属性があります。コントローラとターゲットの間にネットワークパーティションが発生した場合、パーティションが解決された後に中断された再生を再実行できますか?

アンシプールヒントこの属性は、失敗したターゲットをリストし、再試行を許可することによって実装されます。

ところが実際の事例を見るとこんな属性がないようです。スクリプトが正しく回復しない状況を識別する方法を提案してください。

- name: Create Mysql configuration file
  template: src=my.cnf.j2 dest=/etc/my.cnf
  notify:
  - restart mysql

- name: Start Mysql Service
  service: name=mysqld state=started enabled=yes

たとえば、ansible-examplesの上記のコードスニペットは「回復可能」属性を実装しません。プロファイルの作成後に「restart mysql」ハンドラが実行される前に再生が中断された場合、「restart mysql」ハンドラは実行されません。

答え1

原則として、サービスの再起動後にタイムスタンプファイルをタッチすると、再開可能な再生が可能です。その後、サービスを再起動するための条件は、再起動タイムスタンプが設定ファイルの変更時刻より前かどうかです。 (からインスピレーションを受けるmake)。

設定ファイルには、デフォルトのansibleモジュールを使用することもできます。

- name: Create Mysql configuration file
  template: src=my.cnf.j2 dest=/etc/my.cnf

- name: query  | mysql has been restarted with new config file
  template: src=my.cnf.j2 dest=/ansible-managed/mysql/restarted/my.cnf
  check_mode: yes
  register: mysql_restarted

- name: ensure | mysql has been restarted with new config file
  service: name=mysqld state=restarted
  when: mysql_restarted|changed    

- name: record | mysql has been restarted with new config file
  template: src=my.cnf.j2 dest=/ansible-managed/mysql/restarted/my.cnf

(または例えば

- name: query  | mysql has been restarted with new config file
  copy: remote_src=yes src=/etc/my.cnf dest=/ansible-managed/mysql/restarted/my.cnf
  check_mode: yes
  register: mysql_restarted

remote_srcそれでもただディレクトリではなく別の設定ファイルを使用してください。)

答え2

アンサーブル文書話すしかし、それはそうです。 「ホストに接続できないなど、特定のエラーが原因でハンドラが実行されない可能性があります。」

ここに少し混乱があると言います--force-handlers。質問4777--force-handlersこの状況では、回復を許可するために通知があるかどうかにかかわらず、すべてのハンドラを実行するオプションを要求します。質問は「現在実装済み」コメントで終わります。ナレーター:実装されていません。一つ開いた新しい質問そのような機能を要求します。

残念ながら、この意見の結果、一部の人々はstackexchangeや他の場所でこの問題を解決しようと提案しましたが、実際には--force-handlersそうではありませんでした。


完全な解決策は、保留中のハンドラを記録するようにansibleのデータベースを変更することです。 (タスクが差し迫った変更を検出するとすぐにハンドラが記録されます。)

それ以外にも、そのような妨害を避けたいと思うでしょう。これはハンドラーと条件付きジョブの両方を再確認し、|changed再試行先ですべてのジョブを実行する必要があるためです。

レッスン:ハンドラを使用し、|changedスクリプト全体にハンドラが広がることを避けると便利です。

あまりエレガントではありませんが、正しい解決策は、ansibleを修正し、すべてのハンドラを強制的に実行するオプションを提供することです。または、スキップしていないすべてのタスクを変更されたものとして扱うこともできます。元の実行でサービスを再起動する必要がある場合は、サービスを再起動するために2番目の実行をスケジュールすることが完全に無理ではありません。欠点は、元々実行していた場合にのみ再起動するだけです。一部提供する。

再生の中断を防ぐために、ansible「フルモード」を使用することもできます。または、ansibleがリモートで実行されているために主な問題が発生した場合は、screen/を使用して永続セッションを使用して同じサイトのサーバーでansibleを実行できますtmux

関連情報