Ansibleのplaybookを健全に保つためにAnsible-lintを導入した話
技術本部の西山です。FORCIAでは少数精鋭で顧客のサービスを担当するため、フルスタックエンジニアとしての活躍が求められます。私自身もWebエンジニアですが、インフラ寄りも積極的にキャッチアップしており、最近ではAnsibleやServerspecを利用してのサーバ構築自動化プロジェクトにも従事していました。
今回は、Ansibleのplaybookを健全化するためにAnsible-lintを導入した話を紹介します。
導入の背景
FORCIAではサーバ構築時にAnsibleを利用しており、現在では下記の様にAnsibleのplaybookが肥大化してきています。
[forcia@localhost]$ pwd /data/git-repos/configuration ### repository root [forcia@localhost]$ find ./ -type f -name "*.yml" -exec wc -l {} \; | awk '{sum+=$1} END {print sum}' 5465 ### playbookの合計行数
今後のAnsibleの実装を進めていくに当たり、playbookのlinterであるAnsible-lintを導入してコードの秩序を保っていきたいと思います。
導入手順
Ansible-lintのinstall
Ansible-lintのdocumentを参照してインストールする。
- 依存モジュールを明確にするため、requirements.txtを利用
ansible-lint==3.5.1
- pipでinstall
[forcia@localhost]$ pip3 install -r requirements.txt
configuration fileの用意
documentを参照して設定ファイル(.ansible-lint)を用意する。
- .ansible-lintの中身
exclude_paths: - ./common_script/ - ./ansible/bin/ - ./ansible/module/ - ./ansible/apps/ parseable: true quiet: true skip_list: - skip_this_tag # skipするタグを指定 - skip_this_id # skipするidを指定 use_default_rules: true verbosity: 1
※設定項目の意味はこちらを参照
CLIで実際に動かしてみる
[forcia@localhost]$ pip3 install -r requirements.txt
動きました。
[forcia@localhost]$ ansible-lint ./ansible/**/*.yml -p | wc -l 35
35個のエラー。思ったよりは多くないですがlinterを導入した甲斐がありました。
CIの設定
precommitの設定
フォルシアでは、nodeを触る機会が多いので、package.jsonにnpm run precommit
の定義を書くことが多いですが、今回はAnsibleなので、Pythonのお作法に則ります。
※設定方法は公式を参照
- requirements.txtにpre-commitモジュールを追加
ansible-lint==3.5.1 pre-commit==1.12.0
- pre-commitモジュールをインストール
[forcia@localhost]$ pip install -r requirements.txt
- .pre-commit-config.yamlの作成
- repo: https://github.com/ansible/ansible-lint.git rev: v3.5.1 hooks: - id: ansible-lint files: \.(yaml|yml)$
- pre-commitの設定内容をgitに反映
[forcia@localhost]$ pre-commit install
以上でcommitの度にlinterが走るようになりました。
Ansible-lintに触れて感じたこと
Ansible-lintを導入してみて良かった点は playbookの記述方法をルール化できたことです。今回は下記のエラーが見つかり、修正できました。
[forcia@localhost]$ ansible-lint ./ansible/**/*.yml -p | awk '{ print $2 }' | sort | uniq -c 14 [E201] ### Trailing whitespace 3 [E202] ### Octal file permissions must contain leading zero 5 [E301] ### Commands should not change things if nothing needs doing 10 [E305] ### Use shell only when shell functionality is required 3 [E502] ### All tasks should be named
E202: permission設定する場合は755でなく0755のように4桁で書きなさいなど、yamlのlinterでは気づけない、playbook特有の事項も指摘してくれるので大変使い勝手が良いと感じました。
一方、下記を課題に感じたのでcontributionしていけたらと思っています。
- Ansible-lintにエラー箇所を自動修正してくれるformatter機能があると修正が楽で嬉しい
- 実行時間が長く(設定方法が悪いのかもしれませんが)、linter実行速度に改善の余地がありそう
さいごに
今後は、今回対応できなかった下記の点について、順次対応を進めていきたいと考えています。
- 社内jenkinsサーバでもlinterをチェックするjobの設定する
- こちらを参考に、独自ruleを作成する
- documentのreadmeに一部記述が古い箇所があったのでプルリクを出す(早速contributionチャンス!)
Ansibleのlinterを検討している方の参考になれば幸いです。
西山諒平
技術本部 2015年度新卒入社。
大手旅行会社のシステムを担当。
フロントサイド~サーバサイド・DB・サーバ構築など何にでも興味津津な雑食系エンジニア。