2015/09/14開催のAnsible Meetup in Tokyoで発表された方、また会場を提供頂いた日経新聞様ありがとうございました。
さて、@ks888skさんがLTで紹介されていたAnsible向けコードカバレッジツール「Kirby」とansible_spec
を組み合せて使えるのか試してみました。
slideshare - Serverspecを導入したものの放置気味な人へ
ks888の日記 - Ansible向けのコードカバレッジツールKirbyを作りました
総括
結論から言えば、普通に動きました。簡単です。
- Kirbyはインストールが簡単で導入の敷居が低くて良いです。すぐに使えます。
- playbookの実行後にテストされていないタスクの洗い出しがされて良いです。テスト不要なタスクをskip指定できるようです。
- ansible_specは変更不要でした。
はじめに
いきなりKirbyの話ではありませんが少しだけ本の紹介です。
AnsibleとServerspecを組み合せて使う時に、どこまでテストを書くか、あるいはServerspecに何を期待するかを悩ましく思う方は多いと思います。
そもそもAnsibleでは、宣言的な記述やfail-fastといった思想があるので、きちんと実行できている限りはテストは不要です(と考えています)。
過去のQiita投稿記事 [前提]Ansibleの思想とテスト
では、なぜServerspecを使うのか、開発者である宮下さん(@mizzyさん)は著書O'Reilly Japan - Serverspecにて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の設定
インストールは、リンク先の通りにしました。
kirby.cfgに以下のように設定しました。
サンプルコード(Github - volanja/ansible-sample-tdd)はこちら
$ 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する事ができるようですので、また試してみたいです。