想要测试在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の使い方、エラー処理の方法など


广告
将在 10 秒后关闭
bannerAds