こちらの記事は Ansible lint Advent Calendar 2022 カレンダー2 22日目の記事になります。
今回はルール empty-string-compare について説明します。
empty-string-compare
empty-string-compare は Ansible playbook 等で条件を指定する際に空の文字列が利用されていないかチェックします。空の文字列の比較は jinja2 フィルターの形式 にします。
-
when: var != ""
ではなくwhen: var | length > 0
と記述する -
when: var == ""
ではなくwhen: var | length == 0
と記述する
jinja2 フィルターはvar | length
でvar
が何文字かをカウントします。その文字数のカウントの結果と0
を比較します。プログラミング的に言えば副作用を避けるために文字列と数値の比較
ではなく数値と数値の比較
にすると言う処理になります。
empty-string-compare はopt-in
のため初期設定では無効になっています。empty-string-compare を有効にするには Ansible lint の設定ファイルを変更します。
.ansible-lint
enable_list:
- empty-string-compare
問題のあるコード
Ansible がターゲットの OS 情報を取得できない場合/sbin/shutdown -t now
を実行する処理です。
--
- name: Example playbook
hosts: all
tasks:
- name: Shut down
ansible.builtin.command: /sbin/shutdown -t now
when: ansible_os_family == "" # <- 空の文字列で比較している
修正されたコード
---
- name: Example playbook
hosts: all
tasks:
- name: Shut down
ansible.builtin.shell: |
/sbin/shutdown -t now
echo $var ==
when: ansible_os_family | length == 0 # <- jinja2 テンプレートの形式で記述する