想要测试在Ansible角色中出现错误处理的情况
首先
我认为在Ansible Role中,已经实现了在意外状态下停止的错误处理。我考虑了如何测试这个错误处理被触发的情况。
太长不看。
-
- エラー処理が発生することをテストをするには、blockセクションでAnsible Roleを
-
- 実行してエラーを起こし、rescueセクションでエラーの内容を確認する。
rescueセクションでは、変数ansible_failed_taskとansible_failed_resultで
エラーが発生したタスクの状況が確認可能。
预设条件
基本条件
先决条件
-
- Ansible Roleの基本的なディレクトリ構成を理解していること。
- Ansibleにおけるblockセクション、rescueセクションの使い方を理解していること。
执行环境
-
- Python: 3.6.8
- Ansible: 2.9.7
详细
1. 进行 Ansible Role 测试
-
- 今回はテスト用にAnsible Role「check-pass-flag」を作成しました。
-
- メイン処理(tasks/main.yml)はシンプルで、変数pass_flagがtrueでない場合に
-
- エラーが発生します。
-
- Ansible Roleでは、想定通りのタスクでエラーが発生するかを確認できるように、以下に注意しました。
タスク名は重複しないようにする
assertモジュールにはエラーメッセージ(fail_msg)を明示する
---
- name: "Task1 - display pass_flag"
debug:
var: pass_flag
- name: "Task2 - check if pass_flag is true"
assert:
that:
- pass_flag is boolean
- pass_flag is true
fail_msg: "This task failed because pass_flag is not true" # エラーメッセージ
2. 确认错误内容
2-1. 用于检查错误内容的Playbook。
-
- ここでは、エラー内容の確認用Playbookを実行します。ポイントは以下の通りです。
変数pass_flagをfalse(trueではない値)にして、あえてAnsible Roleでエラーを
発生させる
blockセクションでAnsible Roleを実行してエラーを起こし、rescueセクションで
エラーの内容を確認する。エラーの内容は、変数ansible_failed_taskと
ansible_failed_resultに格納されるので、debugモジュールで確認する
---
- name: "Test Ansible Role check-pass-flag"
hosts: localhost
vars:
pass_flag: false
gather_facts: false
tasks:
- block:
# ポイント1: 変数pass_flagがfalseなのでエラーが発生する
- name: "Import check-pass-flag"
import_role:
name: "check-pass-flag"
rescue:
# ポイント2: blockでエラーが発生すると以下の処理が実行される
- name: "Display ansible_failed_task"
debug:
var: ansible_failed_task
- name: "Display ansible_failed_result"
debug:
var: ansible_failed_result
检查变量ansible_failed_task。
当执行Playbook时,由于按预期发生了Ansible Role中的任务「Task2 – 检查pass_flag是否为真」的错误,因此首先我们需要确认变量ansible_failed_task的内容。
作为测试,可以确认错误消息(args.fail_msg)和错误的任务名(name)是否可见。
---
args:
that:
- pass_flag is boolean
- pass_flag is true
fail_msg: This task failed because pass_flag is not true # エラーメッセージ
action: assert
async_val: 0
async: 0
changed_when: []
delay: 5
delegate_to: None
delegate_facts: None
failed_when: []
loop: None
loop_control: None
notify: None
poll: 15
register: None
retries: 3
until: []
loop_with: None
name: Task2 - check if pass_flag is true # エラーしたタスク名
# ~以下、省略~
2-3. 检查变量ansible_failed_result。
我们也需要检查变量ansible_failed_result。其内容似乎比ansible_failed_task少,但我们可以了解到哪个断言语句出错了。作为测试,我们可以确认出错的断言语句(assertion)和错误信息(msg)。
---
assertion: pass_flag is true # エラーしたassert文
changed: false
evaluated_to: false
failed: true
msg: This task failed because pass_flag is not true # エラーメッセージ
3. 对错误处理进行操作确认
3-1. 错误处理动作确认的Playbook测试
-
- ここでは、エラー処理の動作確認用Playbookを実行します。ポイントは以下の通りです。
Ansible Roleでエラーが発生しなかった場合に備えて、failモジュールで強制的にエラーを発生させる
変数ansible_failed_taskとansible_failed_resultの内容にもとづき、
assertモジュールで想定通りのエラーが発生していることを確認する
---
- name: "Test Ansible Role check-pass-flag"
hosts: localhost
vars:
pass_flag: false
gather_facts: false
tasks:
- block:
# 変数pass_flagがfalseなのでエラーが発生する
- name: "Import check-pass-flag"
import_role:
name: "check-pass-flag"
# ポイント1: Ansible Roleでエラーが発生しなかった場合、ここでエラーになる
- name: "Force fail"
fail:
rescue:
# ポイント2: エラーしたタスク名とエラーメッセージを確認
- name: "Check ansible_failed_task"
assert:
that:
- ansible_failed_task.name == 'Task2 - check if pass_flag is true'
- >-
ansible_failed_task.args.fail_msg
== 'This task failed because pass_flag is not true'
# ポイント2: エラーしたassert文とエラーメッセージを確認
- name: "Check ansible_failed_result"
assert:
that:
- ansible_failed_result.assertion == 'pass_flag is true'
- >-
ansible_failed_result.msg
== 'This task failed because pass_flag is not true'
3-2. Playbook的执行结果
当运行Playbook时,发生了预期的错误,即在Ansible Role的任务“Task2 – 检查pass_flag是否为true”中发生了错误。但是,我们可以确认在rescue部分中发生了预期的错误处理。
$ ansible-playbook test-check-pass-flag-2.yml
PLAY [Test Ansible Role check-pass-flag] *******************************************************************************
TASK [check-pass-flag : Task1 - display pass_flag] *********************************************************************
ok: [localhost] =>
pass_flag: false
TASK [check-pass-flag : Task2 - check if pass_flag is true] ************************************************************
fatal: [localhost]: FAILED! => changed=false
assertion: pass_flag is true
evaluated_to: false
msg: This task failed because pass_flag is not true
TASK [Check ansible_failed_task] ***************************************************************************************
ok: [localhost] => changed=false
msg: All assertions passed
TASK [Check ansible_failed_result] *************************************************************************************
ok: [localhost] => changed=false
msg: All assertions passed
PLAY RECAP *************************************************************************************************************
localhost : ok=3 changed=0 unreachable=0 failed=0 skipped=0 rescued=1 ignored=0
最后一点 (zuì yī
blockセクションでAnsible Roleを実行してエラーを起こし、rescueセクションで
エラーの内容を確認することで、エラー処理の動作確認ができました。
Ansible Roleのテストについて、正常の動作だけでなくエラー処理の動作確認も
することで、より品質の高いAnsible Roleが開発できるのではないかと思います。
请提供网页链接
请提供参考的网址链接
请给出参考链接
Ansible Documentation – Blocks
Blocksの使い方、エラー処理の方法など