てくなべ (tekunabe)

ansible / network / automation / StackStorm

[Ansible] 公式 lint ツール、ansible-lint 4.0.0 リリース。新しいドキュメントサイトやデフォルトルール追加など

■ はじめに

Ansible Playbook の 書式をチェックする lint ツール ansilbe-lint のバージョン 4.0.0 が 2018/12/18 にリリースされました。

  • 以下 changelog から引用
    • New documentation site docs.ansible.com/ansible-lint
    • Additional default rules for ansible-lint, listed in docsite default rules
    • Fixed running with role path containing single or multiple dirs #390
    • Fixed double sudo rule output #393
    • Severity property added to rules to be used by Galaxy #379
    • Packaging: consistency and automation #389
    • Updated rule TrailingWhitespaceRule.py to remove carriage return char #323
    • Allow snake_case module names for rules #82
    • Suggest tempfile module instead of mktemp command #422
    • Update tox to run with only supported ansible versions #406
    • GitHub repository edits: move to ansible org, add CODE_OF_CONDUCT, add ROADMAP, label edits

インストールやアップグレードは、今までと同じく「pip install ansible-lint」、「pip install --upgrade ansible-lint」でできます。

この記事では、個人的にきになった、新しいドキュメントサイトと、追加されたデフォルトルールについてまとめます。


■ 新しいドキュメントは doc.ansible.com 配下に

https://docs.ansible.com/ansible-lint/ が新しいドキュメントのサイトです。

f:id:akira6592:20181224125025p:plain

anisble-lint はいままで、willthames/ansible-lint というリポジトリで開発されていましたが、2018年10月に ansilbe 配下の ansilbe/ansible-lint に移動しました。これでドキュメントもコードも ansible 配下ということになりました。

なお、現在では ansible 本体のドキュメント上では、anislbe-lint は

the official, highly configurable best-practices linter for Ansible playbooks, by Ansible.

と記載されています。


■ デフォルトルールの追加

ansible-lint 4.0.0 で 14 個のデフォフォルトルールが追加されました

ここでは、今回追加されたデフォルトルールの中で、気になったルールをいくつか確認してみます。

Deprecated module は使わないこと

Ansible では、将来利用不可になるなどの利用で、利用が推奨されていないモジュールがあります。ドキュメント上では、Deprecated module と表現されます。このルールでは、Deprecated module を使用を禁止します。

{{ var_name }} の変数名の前後にはスペースを入れること

  • [E206] Variables should have spaces before and after: {{ var_name }}

Plaubok 内では、変数名を {{ }} で囲いますが、その際、変数名の前にスペースを入れる、というルールです。たまに、スペースがない記載を見かけます。

ロール内の copy や template の src には ../templates を指定しないこと

  • [E404] Doesn’t need a relative path in role

(Playbookではなく)ロール内で使用する、copy や template モジュールの src オプションで、../templates を含む相対パスを使用しない、というルールです。 もともとロールの仕組みとして、明示的な指定をしなくてもロールから見て ../templates/ 配下のファイルを参照する仕様なので、書き方を統一させるいみでのルール追加なのだと思います。

なお、コードを見る限りcopytemplates モジュールの他に、win_copywin_templates モジュールも、このルールの対象のようです。

リテラルと True/False を比較しないこと

  • [E601] Don’t compare to literal True/False

when: var == True ではなく、when: var で、

when: var == Flase ではなく、when: not var で、

というルールです。

空文字を比較しないこと

  • [E602] Don’t compare to empty string

when: var != "" ではなく、when: var で、

when: var == "" でなく、when: not var で、

というルールです。

補足

もちろん、今まで通りデフォルトルールを除外したり(コンフィグファイル内の skip_list )、逆に新しいルールを追加することもできます。

まとめ

これまで、複数の書き方が許容されていたものなどに対して、新たなルールが設けられました。 公式の linter である ansible-lint のデフォルトルールが追加されていくことで、一つの書き方に緩やかに収束していくのだと思います。