web-dev-qa-db-ja.com

プレイブックのエラーを修正した後、失敗したタスクの実行を継続する方法は?

Ansibleプレイブックを作成およびデバッグする際の一般的なワークフローは次のとおりです。

  1. ansible-playbook ./main.yaml
  2. 一部のタスクでPlaybookが失敗する
  3. このタスクを修正し、1行目を繰り返して、以前のすべてのタスクが再び実行されるのを待ちます。時間がかかります

理想的には、失敗したタスクの実行を再開し、インベントリとすべてのファクトを以前のタスクで収集したいと思います。それも可能ですか?プレイブックの作成/デバッグを高速化する方法は?

53
Sergey Alaev

http://docs.ansible.com/playbooks_startnstep.html をご覧ください。特定のタスクでプレイブックの実行を開始する場合は、--start-at-taskオプションを使用して実行できます。

ansible-playbook playbook.yml --start-at-task="install packages"

上記は、「install packages」という名前のタスクでプレイブックの実行を開始します。

または、この前の答えを見てください ansible playbookで1つのタスクのみを実行する方法?

最後に、プレイが失敗すると、通常は次のようなものが提供されます。

PLAY RECAP ******************************************************************** 
           to retry, use: --limit @/home/user/site.retry

その--limitコマンドを使用すると、失敗したタスクから再試行する必要があります。

41
Mxx

将来の読者:

--limit @/home/user/site.retryはこのようなシナリオでは役に立ちません。.retryは失敗したホストのみを保存するため、失敗したホストに対してすべてのタスクを実行します。

最新バージョン(Ansible 2.x)を使用している場合、--start-at-taskroles内で定義されたタスクに対して機能しません。

--stepフラグを使用するだけで、同様の効果を実現できます(例:ansible-playbook playbook.yml --step)。このステップでは、各タスクを実行する前に尋ねられ、(N)o/(y)es/(c)ontinueを選択できます。

このアプローチでは、必要に応じてタスクを選択的に実行し、修正後、失敗したポイントから続行します。

23
Segmented

Future Futureの読者:

Ansible 2.4.2.0現在、--start-at-taskは、作成したロールで定義されたタスクに対して機能します。

Ansibleチームはこの問題に対処するつもりはありません。ロールをdem等性に保ち、プレイ全体をリプレイすることをお勧めします。これには時間がありません。私の役割では、@ JeremyWhitingのような大量の事実を使用していないため、この--start-at-task機能を使用できます。

ただし、これは手動のタスクなので、代わりにansible rpmを作成し、これらの基本的な手順に従う「再開」機能を追加しました。

  • /etc/ansible/ansible.cfgでansibleログを有効にします(log_pathのコメントを解除します)
  • 各実行前にログをクリアします
  • 障害が発生すると、「再開」機能は最後の「TASK」行についてこのログを取得し、sedを使用して「[]」内の内容を取得します。
  • 次に、--start-at-task = "$ start_at_task"を使用して、最後の実行プレイを呼び出します。
  • 再開したい失敗したタスクでプレイを停止するために、ロールに「any_errors_fatal:true」があることを確認してください

Ansibleチームはこの基本的な(そして非常に便利な)機能を作成したくないので、唯一の選択肢はいくつかのbashスクリプトを介して一緒にハックすることです。

1
Trent