APC 技術ブログ

株式会社エーピーコミュニケーションズの技術ブログです。

株式会社 エーピーコミュニケーションズの技術ブログです。

Ansible Lintの使い方について

この記事は、エーピーコミュニケーションズ Advent Calendar 2019 の2日目のエントリです。

こんにちは。技術開発部所属の伊藤です。 Playbookを人手で標準化するのはしんどいなと思ったときに 便利なAnsible Lintについて書きます。


Ansible Lintとは

Lintとは、静的解析ツールです。 Ansible向けのLint、Playbookの文法チェックツールです。 全ては公式ドキュメントに記載があります。


Ansible Lintのインストールから実行まで

今回はkatacodaを使います。

ディレクトリを作成するPlaybookを書き、Ansible Lintを実行しました。

$ pip install ansible-lint
(略)
Successfully installed ansible-lint-4.1.0
$ pwd
/root/tutorial
$ vi test.yml
---
- hosts: localhost
  gather_facts: no

  tasks:
    - name: make dir
      file:
        path: /root/tutorial/test
        state: directory
        mode: 0755
$ ansible-lint test.yml
$ 

エラーが無ければ、何も表示されません。 そのためPlaybookを編集し、エラーを出力させてみます。

  • nameを削除
  • mode: 0755の後ろに半角スペースを追加
$ vi test.yml
- hosts: localhost
  gather_facts: no

  tasks:
    - file:
        path: /root/tutorial/test
        state: directory
        mode: 0755
$ ansible-lint test.yml
[502] All tasks should be named
test.yml:5
Task/Handler: file state=directory mode=493 path=/root/tutorial/test __file__=test.yml __line__=5

[201] Trailing whitespace
test.yml:8
        mode: 0755
  • [502] :すべてのタスクに名前を付けてください
  • [201] :末尾に空白があります

このような結果になりました。 なお、規約の問題であるため、Playbookは実行されます。

$ ansible-playbook test.yml
 [WARNING]: No inventory was parsed, only implicit localhost is available

 [WARNING]: provided hosts list is empty, only localhost is available. Note
that the implicit localhost does not match 'all'


PLAY [localhost] ***************************************************************

TASK [file] ********************************************************************
changed: [localhost]

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


ルール一覧の確認

下記はデフォルトルールです。

$ ansible-lint -T
ANSIBLE0002 ['[201]']
ANSIBLE0004 ['[401]']
ANSIBLE0005 ['[402]']
ANSIBLE0006 ['[303]']
ANSIBLE0007 ['[302]']
ANSIBLE0008 ['[103]']
ANSIBLE0009 ['[202]']
ANSIBLE0010 ['[403]']
ANSIBLE0011 ['[502]']
ANSIBLE0012 ['[301]']
ANSIBLE0013 ['[305]']
ANSIBLE0014 ['[304]']
ANSIBLE0015 ['[104]']
ANSIBLE0016 ['[503]']
ANSIBLE0017 ['[501]']
ANSIBLE0018 ['[101]']
ANSIBLE0019 ['[102]']
behaviour ['[503]']
bug ['[304]']
command-shell ['[304]', '[305]', '[306]', '[303]', '[301]', '[302]']
deprecated ['[105]', '[104]', '[102]', '[103]', '[101]']
formatting ['[204]', '[205]', '[104]', '[206]', '[201]', '[202]', '[203]']
idempotency ['[301]']
idiom ['[602]', '[601]']
metadata ['[704]', '[703]', '[701]', '[702]']
module ['[403]', '[401]', '[402]', '[404]']
oddity ['[501]']
readability ['[502]']
repeatability ['[403]', '[401]', '[402]']
resources ['[303]', '[302]']
safety ['[305]']
task ['[502]', '[501]', '[503]', '[504]']


Ansible Lint のオプションについて

特定のルールのみ実行したい場合は、「-t TAGS」を付けます。

# ansible-lint -t 502 test.yml
[502] All tasks should be named
test.yml:5
Task/Handler: file state=directory mode=493 path=/root/tutorial/test __file__=test.yml __line__=5


特定のルールをチェックさせない場合は、「-x SKIP_LIST」を付けます。

$ ansible-lint -x 502 test.yml
[201] Trailing whitespace
test.yml:8
        mode: 0755

先ほどは502のエラーが出ましたが、今回はチェック対象外としているため表示されません。


まとめ

Playbookの規約をシステムにチェックしてもらうとかなり捗りますね。 次回はAnsible Lintのカスタムルールについて書きます。