Kirbyとansible_specを組み合せて使ってみた。


2015/09/14開催の[Ansible Meetup in Tokyo](http://ansible-users.connpass.com/event/18015/)で発表された方、また会場を提供頂いた日経新聞様ありがとうございました。

さて、@ks888skさんがLTで紹介されていたAnsible向けコードカバレッジツール「Kirby」と`ansible_spec`を組み合せて使えるのか試してみました。

[slideshare - Serverspecを導入したものの放置気味な人へ](http://www.slideshare.net/ks888sk/serverspec-52756117)
[ks888の日記 - Ansible向けのコードカバレッジツールKirbyを作りました](http://ks888.hatenablog.com/entry/2015/09/06/223538)


# 総括
結論から言えば、普通に動きました。簡単です。

+ Kirbyはインストールが簡単で導入の敷居が低くて良いです。すぐに使えます。
+ playbookの実行後にテストされていないタスクの洗い出しがされて良いです。テスト不要なタスクをskip指定できるようです。
+ ansible_specは変更不要でした。

# はじめに
いきなりKirbyの話ではありませんが少しだけ本の紹介です。

AnsibleとServerspecを組み合せて使う時に、どこまでテストを書くか、あるいはServerspecに何を期待するかを悩ましく思う方は多いと思います。
そもそもAnsibleでは、宣言的な記述やfail-fastといった思想があるので、きちんと実行できている限りはテストは不要です(と考えています)。
[過去のQiita投稿記事 [前提]Ansibleの思想とテスト](http://qiita.com/volanja/items/78c9554d62108707927d#%E5%89%8D%E6%8F%90ansible%E3%81%AE%E6%80%9D%E6%83%B3%E3%81%A8%E3%83%86%E3%82%B9%E3%83%88)

では、なぜServerspecを使うのか、開発者である宮下さん(@mizzyさん)は著書[O'Reilly Japan - Serverspec](http://www.oreilly.co.jp/books/9784873117096/)にてServerspecの開発思想や目標、テストの指針などを述べられています。
Serverspecの技術的な面はWebでも読むことも出来ますが、思想/テストの指針面の説明はあまり多くないので是非読んでみることをお勧めします。
個人的には「3.12 テストコードの指針」以降が参考になると思いますので、節と段落のタイトルだけ引用します。

> 3.12 テストコードの指針
> 3.12.1 テストコードを書き始めるタイミング
> 新規システム
> 既存システム
> インフラコードのモジュール化
> 3.12.2 どのような観点でテストコードを書くべきか
> サーバ構成管理ツールを信頼する
> サーバとしての役目を果たすのに必須な部分をテストする
> 設定内容に詳細まではテストしない
> セキュリティ上重要な部分をテストする
> サーバのあるべき状態を抽象化する
> テストの目的を明確にする

# Kirby
## 検証環境
では、Kirbyの話に戻ります。
環境が全体的に古いので、最新版だと違うかもしれません

```
$ ansible --version
ansible 1.8.4 (v1.8.4 ebc8d48d34) last updated 2015/02/25 00:00:16 (GMT +900)
  lib/ansible/modules/core: (detached HEAD f22df78345) last updated 2015/02/25 00:01:41 (GMT +900)
  lib/ansible/modules/extras: (detached HEAD 23190986fd) last updated 2015/02/25 00:01:53 (GMT +900)
  v2/ansible/modules/core:  not found - use git submodule update --init v2/ansible/modules/core
  v2/ansible/modules/extras:  not found - use git submodule update --init v2/ansible/modules/extras
  configured module search path = None

```

```
serverspec (2.23.1)
ansible_spec (0.2.1)
```

## Kirbyの設定


インストールは、[リンク](http://ks888.hatenablog.com/entry/2015/09/06/223538)先の通りにしました。
kirby.cfgに以下のように設定しました。
[サンプルコード(Github - volanja/ansible-sample-tdd)はこちら](https://github.com/volanja/ansible-sample-tdd/tree/kirby)


```
$ cat kirby.cfg 
[defaults]
enable = yes

serverspec_dir = ./
serverspec_cmd = rake serverspec:Ansible-Sample-TDD

```

## Kirbyの実行
いつもどおり、playbookを実行してみたところです。
個人的なポイントは最後に`Not tested:`が表示されているところで、このテストが不足しているとか、分かりやすいです。

```
$ ansible-playbook site.yml -i hosts 

PLAY [Ansible-Sample-TDD] ***************************************************** 

GATHERING FACTS *************************************************************** 
ok: [192.168.0.113]

TASK: [nginx | Template nginx.repo] ******************************************* 
changed: [192.168.0.113]
tested by: 

TASK: [nginx | install Nginx] ************************************************* 
changed: [192.168.0.113] => (item=nginx)
tested by: 
- rspec ./roles/nginx/spec/nginx_spec.rb:4 # Package "nginx" should be installed
- rspec ./roles/nginx/spec/nginx_spec.rb:17 # File "/etc/nginx/nginx.conf" should be file
- rspec ./roles/nginx/spec/nginx_spec.rb:18 # File "/etc/nginx/nginx.conf" should contain "worker_connections  1024;"
- rspec ./roles/nginx/spec/nginx_spec.rb:8 # Service "nginx" should be enabled

TASK: [nginx | ensure nginx is running automatically at boot time] ************ 
changed: [192.168.0.113]
tested by: 
- rspec ./roles/nginx/spec/nginx_spec.rb:9 # Service "nginx" should be running
- rspec ./roles/nginx/spec/nginx_spec.rb:13 # Port "80" should be listening

TASK: [nginx | insert iptables rule] ****************************************** 
changed: [192.168.0.113]
tested by: 

TASK: [nginx | Restart iptables] ********************************************** 
changed: [192.168.0.113]
tested by: 

TASK: [mariadb | Template mariadb.repo] *************************************** 
changed: [192.168.0.113]
tested by: 

TASK: [mariadb | Install MariaDB] ********************************************* 
changed: [192.168.0.113] => (item=MariaDB-server,MariaDB-client,MariaDB-common,MariaDB-compat,MariaDB-devel,MySQL-python)
tested by: 
- rspec ./roles/mariadb/spec/mariadb_spec.rb:8 # Service "mysql" should be enabled
- rspec ./roles/mariadb/spec/mariadb_spec.rb:4 # Package "MariaDB-server" should be installed

TASK: [mariadb | chkconfig on MariaDB] **************************************** 
changed: [192.168.0.113]
tested by: 
- rspec ./roles/mariadb/spec/mariadb_spec.rb:13 # Port "3306" should be listening
- rspec ./roles/mariadb/spec/mariadb_spec.rb:9 # Service "mysql" should be running

NOTIFIED: [nginx | restart iptables] ****************************************** 
changed: [192.168.0.113]
tested by: 

PLAY RECAP ******************************************************************** 
*** Kirby Results ***
Coverage  : 44% (4 of 9 tasks are tested)
Not tested:
 - nginx | Template nginx.repo
 - nginx | insert iptables rule
 - nginx | Restart iptables
 - mariadb | Template mariadb.repo
 - nginx | restart iptables
*** Kirby End *******
192.168.0.113              : ok=10   changed=9    unreachable=0    failed=0  
```

# おわりに
Kirbyとansible_specを組み合せて、簡単に使えることを確認しました。
ちなみにテストしない項目は`coverage_skip`をタスクのnameに指定するとskipする事ができるようですので、また試してみたいです。