この記事は、エーピーコミュニケーションズ 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のカスタムルールについて書きます。