Tech Sketch Bucket of Technical Chips by TIS Inc.

Ansible専用のテストツールAnsibleSpecの特徴および使い方

Pocket

Ansible playbookを作成する過程でプロビジョニングが正しく行われていることをテストすることがあります。その際に利用されるテストツールの一つとしてServerSpecというツールがあります。(TestKitchenとDocker・Serverspecで作るAnsibleTDD環境)ServerSpecはサーバ間の通信が正しく行われていることやプロセスが正しく起動していることなどのテストが行えます。そのServerSpecを利用したAnsible専用のテストツールとしてAnsibleSpecというツールが存在します。AnsibleSpecはSeverSpecと同じ構文で記述ができ、テストファイルをAnsibleのプロジェクト内に組み込めるという特徴があります。

 今回はAnsible専用のテストツールとして公開されているAnsibleSpecの特徴および使い方を紹介します。

サムネイル.png

AnsibleSpecについて

特徴

構文はServerSpec

AnsibleSpecはServerSpecを利用して作られているためテストの構文はServerSpecと同じになっています。そのためServerSpecの構文を知っていれば新しく学習する必要がありません。

テストをプロジェクト内で管理

ServerSpecでテストを行う場合はAnsibleにおけるroleとServerSpecにおけるspecファイルが別々になってしまい、管理が煩雑でした。AnsibleSpecを使うことによってroleのディレクトリにspecファイルを置くことができるようになりました。そのため、roleに対応しているテストが分かりやすくなりました。

設定ファイルの統一

ServerSpecの設定としてどのサーバに対してテストを行うかを指定する必要があります。加えてAnsible側でもどのサーバに対してプロビジョニングを行うかを指定する必要があります。よって同じような設定をServerSpec側とAnsible側で行う必要がありました。AnsibleSpecを使うことでAnsible側の設定ファイル(Inventory)をもとにテストが行われるようになります。

問題点

テスト成功時の情報が少ない

ServerSpecでテストを行って成功した場合は以下のような出力になります。

それに対してAnsibleSpecでテストを行って成功した場合は以下のような出力になります。

このようにテスト成功時の情報がAnsibleSpecでは表示されません。そのため現在どのテストを行っているのか、どのようなテストが記述されていたかが一見わかりにくいです。このようなテスト本体にかかわる仕様はできるだけServerSpecに準拠してほしいと感じます。

AnsibleSpec利用方法

テスト概要

テスト対象となるplaybook

今回、テスト対象とするAnsible playbookを以下に示します。playbookの内容としてはjenkinsのプロビジョニングを行います。
jenkins-ansibleのリポジトリ

ディレクトリ構造は以下の通りです。

今回はこのAnsible playbookを用いてAnsibleSpecの使い方を紹介します。

全体のシステム構成

今回作成する全体のシステム構成を以下に示します。
構成図.png
今回、必要とするサーバはAnsible実行用のサーバとJenkins構築用のサーバの2台となります。Ansible実行用のサーバにはAnsible及びAnsibleSpecの実行環境を導入します。今回はVMWare環境なのでJenkins構築用サーバの方は特に導入するものはありません。(以降の手順でrootユーザのログインが必要ですが、VMWareの仮想マシンは特に設定をしなくてもrootユーザでのログインができるため)手順としてはplaybookを実行してjenkinsのプロビジョニングを行った後、AnsibleSpecによってテストを実行します。

実行環境

Ansible実行用

名前 詳細
VMWare(vSphere) 6.0.0
OS CentOS 7.1
ruby 2.0.0p598
Ansible 2.0.0.1
ansible_spec 0.2.7

jenkins構築用(構築前)

名前 詳細
VMWare(vSphere) 6.0.0
OS CentOS 7.0

準備

Ansible本体の導入についての説明は割愛します。

今回の手順で使用するplaybookをgithubからクローンしてきます。

jenkins-ansibleディレクトリに移動します。

hostsファイルに構築対象のIPアドレスを記述します。

AnsibleSpecのインストールを行います。

jenkins-ansibleディレクトリで初期化コマンドを実行します。

AnsibleSpecに必要なファイルがjenkins-ansibleディレクトリ上に作成されます。

実行ファイルの設定

vi等で /jenkins-ansible/.ansiblespec を開きます。

.ansiblespecの中身はテストで対象とするplaybookおよびinventoryが指定されています。今回はplaybookをjenkins.ymlに書き換えます。(デフォルトではsite.yml)

テスト名を設定

/jenkins-ansible/jenkins.yml を開きます。

name要素にテスト名を記述します。今回はAnsible-Jenkins-Testと名付けます。

テストを記述

テスト用のファイルを置くためのディレクトリを作成します。

テスト用のファイルを開いて作成します。ファイル名の命名規則としては「~_spec.rb」とします。

テストを書いていきます。構文としてはserverspecと同じです。

テスト項目としては以下の3点です。

  • jenkinsのサービスがenabledになっているか
  • jenkinsのサービスがrunningになっているか
  • 8080番ポートがlisten状態になっているか

テスト実行

Ansibleによってプロビジョニングを行います

まずテストの前にテスト対象となるプロビジョニングを行います。

実行可能なテストを確認します。
出力された結果がテスト用の実行コマンドとなります。

エラーが出た場合

このエラーは名前付けに関して指摘されています。注意点としてはsite.ymlで複数のファイルをincludeしているような場合があります。その際はincludeしているすべてのファイルににテスト名(name要素)が指定されていることを確認してください。一つのファイルでも指定されていなかった場合はエラーが発生します。

先ほど確認したコマンドを使ってテストを実行します。

無事にテストが実行されました。

失敗した場合は以下のような出力となります。(jenkinsを停止させた場合)

[おまけ] 実行ファイルを指定して実行する。

今回は.ansiblespecに対象のplaybookおよびinventoryを指定しましたが、実行時に指定することも可能です。

テスト対象のplaybookを指定して実行します。PLAYBOOKという環境変数に渡すことで指定できます。

テスト対象のinventoryを指定して実行します。INVENTORYという環境変数に渡すことで指定できます。

両方を同時に指定することも可能です。

エンジニア採用中!私たちと一緒に働いてみませんか?