こちらの記事はAnsible lint Advent Calendar 2022 19日目の記事になります。
今回はルール risky-shell-pipe について説明します。
risky-shell-pipe
risky-shell-pipe は ansible.builtin.shell モジュールでbashのpipefailオプション
が付与されているか検証します。
bashのmanによると
pipefail オプションが有効になっている場合を除き、 パイプラインの返却ステータスは最後のコマンドの終了ステータスになります。 pipefail が有効になっている場合には、 0 以外のステータスを返した最後の (一番右の) コマンドの値が パイプラインの返却ステータスになり、 全てのコマンドが正常終了した場合にのみ 0 になります。
とあります。
例えば
false | true
echo "Ansible lint"
と書くとAnsible lintが表示されます。pipefailオプション
を設定すると処理が途中で失敗しているためAnsible lintは表示されません。
set -o pipefail
false | true
echo "Ansible lint"
risky-shell-pipeはパイプ処理の途中でコマンドが失敗した場合、タスクが期待通りに失敗することを保証します。
問題のあるコード
---
- name: Example playbook
hosts: localhost
tasks:
- name: Pipeline without pipefail
shell: false | cat
修正されたコードその1
---
- name: Example playbook
hosts: localhost
become: no
tasks:
- name: Pipeline with pipefail
shell: set -o pipefail && false | cat
修正されたコードその2
---
- name: Example playbook
hosts: localhost
become: no
tasks:
- name: Pipeline with pipefail, multi-line
shell: |
set -o pipefail # <-- pipefailオプションを付与する
false | cat