28

私は現在、この一般的な形式に従い、cron ジョブを介して実行される Ansible プレイを作成しています。

pre_tasks:
  -Configuration / package installation

tasks:
  -Work with installed packages

post_tasks:
  -Cleanup / uninstall packages

上記の問題は、tasksセクション内のコマンドが失敗することがあり、失敗するとpost_tasksセクションが実行されず、システムが乱雑な状態になることです。障害や致命的なエラーpost_tasksが発生した場合でも、コマンドを強制的に実行することはできますか?

私の現在のアプローチは、セクションのignore_errors: yes下のすべてに適用してから、各タスクに条件を適用して、前のコマンドが成功したかどうかを個別に確認することです。taskswhen:

この解決策はハックのように見えignore_errors: yesますが、設定を使用しても、タスクで致命的なエラーが発生した場合、プレイ全体がすぐに失敗するため、さらに悪化します。そのため、手動で確認するために cron 化された bash スクリプトも実行する必要があります。リーチプレイ実行後。

私が望むのは、tasks失敗してpost_tasksも実行されるという保証だけです。bash スクリプト ラッパーに頼らずにこれを行う方法があると確信しています。

4

4 に答える 4

54

この機能は Ansible 2.0 で利用可能になりました。

これは、新しいスタンザ マーカーblockrescue、およびのドキュメントalwaysです。

于 2015-08-02T04:34:01.647 に答える
0

@MarkTamskyは正しいですが、簡単な説明もあります。

複数のタスクをblocks にグループ化すると、タスク ディレクティブが 1 レベル深くなり (ほとんどの OO 言語の「try」ブロックのコードのように)、より高いレベルで、これらのブロックの 1 つ以上が発生した場合に何が起こるかを制御できます。タスクは失敗します ( rescue「try」ブロックの後の「catch」のように)。

また、ブロック タスクの実行の最後にいくつかのタスクを実行する必要がある場合 (つまり、それらのブロック タスクが失敗したかどうかに関係なく) を使用できますalways(Python の「finally」のように)。

(ドキュメントから直接コピー):

- name: Attempt and graceful roll back demo

  block: # <--- a block of tasks
    - name: Print a message
      ansible.builtin.debug:
        msg: 'I execute normally'

    - name: Force a failure
      ansible.builtin.command: /bin/false

    - name: Never print this
      ansible.builtin.debug:
        msg: 'I never execute, due to the above task failing, :-('

  rescue: # <--- a rescue
    - name: Print when errors
      ansible.builtin.debug:
        msg: 'I caught an error'

    - name: Force a failure in middle of recovery! >:-)
      ansible.builtin.command: /bin/false

    - name: Never print this
      ansible.builtin.debug:
        msg: 'I also never execute :-('

  always: # <--- an always
    - name: Always do this
      ansible.builtin.debug:
        msg: "This always executes"

注意 1: 各ブロックは「タスク」にある必要があります。

 tasks:
   - name: some name
     block:
       - name: some name
         <module>

注意 2:ブロック レベルのすべてのディレクティブ (例: whenbecomeなど) は、ブロック自体ではなく、「ブロック内の各タスクに 1 つずつ」適用されます。

于 2021-11-23T10:42:11.140 に答える
-14

blockは使用せずpost_tasks、クリーンアップ プロセスを通常の一部として使用しますtasks

于 2014-05-27T07:03:52.040 に答える