CircleCIでAnsibleのplaybookに対してAnsible-lintを実行する

概要

Ansibleのplaybookに対してlintをかけたり、Serverspecとかを実行したくなったので、色々調べた結果、会社でCircleCIを使っていることがわかった。
そこでCircleCIで、インフラCIしていきたいなと思ったので、その辺のセットアップメモ。
なお、コンテナ単位で課金されるようで、1コンテナまで無料で利用できる。
個人でお遊びレベルのプロジェクトなら1コンテナで十分だと思う。
リポジトリ数には制限が無いようで、同時にテストを走らせたいような大きめのリポジトリになってきたら追加1コンテナあたり$50/monthで追加できるらしい。
まずは無料範囲で進めてみる。

CircleCIとの連携

まず、CircleCIと連携する必要があるので、CircleCIへログインする。その時にGithubと連携させればすぐにリポジトリが表示される。そのまま対象リポジトリの「set up project」を選択する。

今回やりたいのはansible-lintなので、Linux,pythonを選択して、「Start building」を実行しておく。ただし、ここでは特に実行されない。

Start buildingしないと下記のように、セットアップ待ち状態になる。

そうしたら、リポジトリの直下に下記を追加する。
config.ymlはcircleciの設定ファイル。
.ansible-lintはansible-lintの設定ファイル。
requirements.txtはインストールするpythonパッケージ。

ls -la .circleci
total 24
drwxr-xr-x 5 inamuu staff 160 6 20 20:03 .
drwxr-xr-x 7 inamuu staff 224 6 20 19:57 ..
-rw-r--r-- 1 inamuu staff 317 6 20 14:28 .ansible-lint
-rw-r--r-- 1 inamuu staff 253 6 20 20:03 config.yml
-rw-r--r-- 1 inamuu staff 13 6 20 14:28 requirements.txt

.ansible-lint
とりあえず文末の空白チェックだけまわしてみるために、それ以外のルールは一旦SKIPにした。
この辺は調整しながら追加していくと良さそう。

parseable: true
quiet: false
use_default_rules: true
skip_list:
- ANSIBLE0004
- ANSIBLE0005
- ANSIBLE0006
- ANSIBLE0007
- ANSIBLE0008
- ANSIBLE0009
- ANSIBLE0010
- ANSIBLE0011
- ANSIBLE0012
- ANSIBLE0013
- ANSIBLE0014
- ANSIBLE0015
- ANSIBLE0016
- ANSIBLE0017
- ANSIBLE0018
verbosity: 1

config.yml
working_directoryで指定したディレクトリでstepに指定した内容が実行される。

---
version: 2
jobs:
build:
docker:
- image: python:2.7
working_directory: ~/repo
steps:
- checkout
- run: pip install -r ./.circleci/requirements.txt
- run: ansible-lint ./playbook/*.yml -c .circleci/.ansible-lint

上記ファイルを追加したPRを出してみる。設定が正しければ、下記のようにCIが回りはじめる。

実行したテストに問題がなければ、下記のようにSUCCESSとなる。

試しに、yamlファイルに空白を入れてコミットしたら、下記のようにちゃんと検知してくれた。

以上がCI導入まで。
導入はかなり簡単で、且つ人間の目でチェックしなくてもよくなるので大変便利になった。

CircleCI CLI

circleciにはcliがある。
設定ファイルのバリデーションチェックなど、実際にDockerで動かしてみることができる。
Docker for Macがインストールされている状態でcurlでコマンドを配置する。

curl -o /usr/local/bin/circleci https://circle-downloads.s3.amazonaws.com/releases/build_agent_wrapper/circleci && chmod +x /usr/local/bin/circleci

下記のようにして、バリデーションチェックができる。

$ circleci config validate .circleci/config.yml

.circleci/config.yml is valid

また、Dockerを動かしてconfig.ymlに書いてあることを実行することができる。

$ circleci build

-- snip --

====>> ansible-lint ./playbook/*.yml -c .circleci/.ansible-lint
#!/bin/bash -eo pipefail
ansible-lint ./playbook/*.yml -c .circleci/.ansible-lint
Examining ./playbook/test.yml of type playbook
Examining ./playbook/site.yml of type playbook
Examining /root/repo/playbook/roles/base/tasks/main.yml of type tasks
Examining /root/repo/playbook/roles/nginx/tasks/main.yml of type tasks
Examining /root/repo/playbook/roles/nginx/handlers/main.yml of type handlers
Success!

ブランチ切って試すのもありだけど、手元で事前に確認するには十分。

ansible-lint

ansibleのyamlファイルのlinter.
構文チェックを行ってくれる。
-Lで使えるルールが確認できる。

ansible-lint -L

デフォルトだとそんなにあるわけじゃなく、自分でpythonでルールを作って実行することも可能。

実行するには下記のように対象のyamlを指定する。ワイルドカードももちろんいける。

ansible-lint ./playbook/*.yml -c .circleci/.ansible-lint

まとめ

以前会社でDroneによるCIは触れており、すでに設定されているプロジェクトから設定をコピーしてセットアップしたことはあったが、自分で1からセットアップしたのは初めて。
とは言えとても簡単に導入することができ、しかも個人なら無料で利用できるようなので、是非活用していきたい。