![Ansible: block-rescue ブロックが使用されている場合でも include_tasks によって致命的なエラーがスローされる](https://rvso.com/image/717732/Ansible%3A%20block-rescue%20%E3%83%96%E3%83%AD%E3%83%83%E3%82%AF%E3%81%8C%E4%BD%BF%E7%94%A8%E3%81%95%E3%82%8C%E3%81%A6%E3%81%84%E3%82%8B%E5%A0%B4%E5%90%88%E3%81%A7%E3%82%82%20include_tasks%20%E3%81%AB%E3%82%88%E3%81%A3%E3%81%A6%E8%87%B4%E5%91%BD%E7%9A%84%E3%81%AA%E3%82%A8%E3%83%A9%E3%83%BC%E3%81%8C%E3%82%B9%E3%83%AD%E3%83%BC%E3%81%95%E3%82%8C%E3%82%8B.png)
1つのホスト変数で定義されたいくつかの値に基づいて複数のタスクを含めようとしていますが、block-rescueブロックを使用していても致命的なエラーがスローされます。変数がありますプロフィール定義ホスト変数/ホスト名.yml:
profiles: '["profile1","trap1"]'
そしてその役割テストプロファイルでロールここで、タスク ディレクトリには次の .yml ファイルがあります。プロファイル1.yml、プロファイル2.yml、メイン.yml。
main.yml ファイルの内容は次のとおりです。
- name: import profiles
block:
- include_tasks: "{{ item }}.yml"
with_items: "{{ profiles|default([]) }}"
rescue:
- debug: msg='Error encountered while trying to include a .yml file corresponding to a defined profile from profiles variable. Profiles - "{{ profiles }}"'
when: profiles is defined
プレイブックの内容は次のとおりです。
- name: Test profiles config
hosts: myhost
roles:
- test_profiles
出力は次のようになります。
TASK [test_profiles : include_tasks] ***********************************************************************************************************************************************************************
included: /etc/ansible/roles/test_profiles/tasks/profile.yml for <my_host>
fatal: [<my_host>]: FAILED! => {"reason": "Unable to retrieve file contents\nCould not find or access '/etc/ansible/trap1.yml'"}
TASK [test_profiles : Ensure that profile directory exists into the D:\profiles directory] ************************************************************************************************
ok: [<my_host>]
TASK [test_profiles : Update profile.properties file] ***************************************************************************************************************************************************
ok: [<my_host>]
TASK [test_profiles : debug] *******************************************************************************************************************************************************************************
ok: [<my_host>] => {
"msg": "Error encountered while trying to include a .yml file corresponding to a defined profile from profiles variable. Profiles - \"[\"profile1\",\"trap1\"]\""
}
to retry, use: --limit @/etc/ansible/playbook_test_profiles.retry
PLAY RECAP ********************************************************************************************************************************************************************************************************
<my_host> : ok=5 changed=0 unreachable=0 failed=1
私の観点からすると、この致命的なエラーは発生しないはずです。ここで何が間違っているのでしょうか。どうすればこのエラーを解消できるでしょうか。いつ条件付きだが成功しなかった。
私は使用していますアンシブル 2.4.2.0タスクは一部の Windows ホストに対して実行されます。
答え1
block
/ はrescue
エラーの発生を防止しません。失敗したタスクを検出し、rescue
ブロックを実行してエラーから回復します。ただし、失敗したタスクはそのまま残り、プレイの要約に表示されます。
プレイブックを設計するときは、フェイルファスト アプローチを使用することをお勧めします。この場合、ローカル ファイルをスキャンして、ユーザー入力 (指定された構成) が有効かどうか、プロファイル ファイルが配置されているかどうかをテストできます。ユーザーassert
/fail
モジュール。
答え2
最終的に、block-rescueブロックを削除しました。.ymlファイルが存在するかどうかを確認する方法を見つけました。これは、ロールパス変数(現在のロールのパスを返します - Ansible 1.8以降で利用可能 - これはロール内でのみ機能します)とテストファイル。
上記のロールの main.yml は次のようになります。
- name: Import profiles
include_tasks: "{{ item }}.yml"
with_items: "{{ profiles|default([]) }}"
when: (role_path + '/tasks/' + item + '.yml') | is_file
このチェックにより、致命的な例外はスローされなくなり、trap1.yml ファイルはスキップされます。
出力は次のようになります。
TASK [test_profiles : Import profiles] ***********************************************************
skipping: [<my_host>] => (item=trap1)
included: /etc/ansible/roles/test_profiles/tasks/profile1.yml for <my_host>
TASK [test_profiles : Ensure that profile directory exists into the D:\profiles directory] *******
ok: [<my_host>]
TASK [test_profiles : Update profile.properties file] ********************************************
changed: [<my_host>]
to retry, use: --limit @/etc/ansible/playbook_test_profiles.retry
PLAY RECAP ***************************************************************************************
<my_host> : ok=4 changed=1 unreachable=0 failed=0
この解決策で問題ありませんが、他の提案も歓迎します。