きり丸の技術日記

技術・エンジニアのイベント・資格等はこちらにまとめる予定です

Ansibleで失敗時のエラーメッセージをカスタマイズしたい

※ もっといいやり方があれば教えてください。


この記事では、Ansibleでエラーメッセージをカスタマイズするやり方を記します。

正確な表現としては異なるので、あくまで「したい」です。

環境

  • Ansible
    • 2.11.5

ゴール

  • 処理失敗時に、目的のエラーメッセージを出力する

対応

実行するタスクとエラーメッセージを出力するタスクの2つを用意する

失敗時のエラーメッセージを直接加工できるオプションはなさそうでした。

ですので、コマンドを実行するタスクと、実行結果をもとにエラーメッセージを出力するタスクを分ける必要があります。

実行するタスクの設定

実行するコマンドをcommandに設定してください。

次に、後続のタスクでメッセージをハンドリングしたいため、registerで結果を変数に設定してください。

次に、failed_when: falseもしくは、ignore_errors: trueのどちらかを設定してください。オプションの意味は次のとおりです。

  • failed_when
    • 失敗の条件をカスタマイズするためのオプション。たとえば、「diffでファイルの差分がない状態をエラーとしたい」場合は、通常のコマンドだとエラーにならないため、failed_whenオプションで異常とする。等々のユースケースがあります。今回は、後続処理に回したいため、あえてエラーとしないfalseを設定します。
  • ignore_errors
    • エラー無視設定のオプション。trueに設定しておくことで、エラーが発生しても後続処理を実行してくれます。ただし、エラーメッセージ自体は出力されます。
    - name: "コマンドを実行するタスク"
      command: "実行コマンド"
      register: result
      failed_when: false # エラーメッセージを出力しない
      ignore_errors: true # エラーが発生しても無視する

エラーメッセージを出力するタスクの設定

whenを使うことで、タスクの実行条件を設定できます。先ほどのコマンドの実行結果をresultに設定していますので、result.rc != 0と設定すると、コマンドに失敗した時だけタスクを実行します。

次に、failを設定し、実行しているタスクではなく、エラーメッセージのタスクで失敗させます。こちらのオプションのmsgに値を設定することで、エラーメッセージをカスタマイズできます。

詳細なエラーが欲しい場合は、実行結果に設定しているresultを出力すればよいでしょう。

    - name: "エラーメッセージをカスタマイズする"
      when: result.rc != 0
      fail: 
        msg: "{{ result }} 
        エラーメッセージをカスタマイズする"

hogehogeという存在しないコマンドを実行しています。

TASK [コマンドを実行するタスク] *************************************************************************************************************************************************************************
ok: [localhost]

TASK [エラーメッセージをカスタマイズする] ***************************************************************************************************************************************************************
fatal: [localhost]: FAILED! => {"changed": false, "msg": "{'rc': 2, 'stdout': '', 'stderr': '', 'cmd': 'hogehoge', 'failed': False, 'msg': \"[Errno 2] No such file or directory: b'hogehoge'\", 'stdout_lines': [], 'stderr_lines': [], 'changed': False, 'failed_when_result': False} エラーメッセージをカスタマイズする"}

PLAY RECAP **********************************************************************************************************************************************************************************************
localhost                  : ok=2    changed=0    unreachable=0    failed=1    skipped=0    rescued=0    ignored=0   

ソースコード

使い方はREADME.MDに載せています。GitHub Codespacesで実行しました。

pip install ansible
ansible-playbook -i localhost error_message.yml 

終わりに

正直、Ansibleでエラーメッセージを加工したい、という要件はかなり限定的だと思います。

そもそもなぜこのユースケースが必要だったかというと。今の職場では、AnsibleでGit pullして最新化してからビルドしてデプロイしようとしています。この「Git pull」でIDと発行したトークンを使用しているのですが、現状としては開発者個人に紐づいてしまっています。本来であれば、デプロイ用のIDとトークンを用意したほうがよいのは理解していますが、管理が煩雑になるため用意しませんでした。

ただ、現状では動いているものの、開発者個人が退職したタイミングでAnsibleのタスクが動かなくなってしまいます。出力されるエラーメッセージも「認証エラー」しか出力されないため、退職してトークンが無効化されたという真因にたどり着くのは時間がかかります。

そのリスクを低減するために、エラーメッセージに障害対応用のQ&Aサイトへのリンクを貼りたかった。という要望が開始地点でした。

まぁ、これで対応できたのはいいものの、日本語メッセージが文字化けして効率的に誘導できなかったんですがね…。

他のユースケースで使えないかもしれませんが、かなりハマったのでメモとしてブログに残すことにします。


この記事がお役に立ちましたら、各種SNSでのシェアや、今後も情報発信しますのでフォローよろしくお願いします。

参考情報

f:id:nainaistar:20210928225009p:plain