Ansible + TestKitchen for Docker 社内ハンズオン
ターゲット:Ansibleを始めて利用する方向け
今回、社内でAnsible + TestKitchenを使った、インフラのテスト駆動開発handsonを実施しました。
その内容を公開いたします。
Ansibleとは
一言で**「エージェントレスで手軽に利用出来る構成管理ツール」**で
Chef/Puppet/Itamaeなど様々あるプロビジョナーと並ぶツールです。
TestKitchenとは
こちらは主にテスト環境への構成のプロビジョニングと構成管理が正しく実装されているかをチェックするためのツールです。
様々なプロビジョナーと連携しつつ、構成管理対象のターゲットをvagrant / dockerなど適用できるため、今回採用しました。
今回のハンズオンでやったこと
AnsibleとTestkitchenを用いてインフラのコード化及びTDDを実践する
テスト実行環境はDocker / 本番環境はあらかじめOpenStack上に作成したUbuntu 14.04のサーバーにて実行をする
Ansible + TestKitche (infraTDDゴール)
事前準備(Mac 環境構築)
$ bundler -v
Bundler version 1.12.5
$ ruby -v
ruby 2.1.5
$ docker -v
Docker version 1.12.0-rc2
または
Docker version 1.11.2
前提として ruby 2.1.1<で話を進めていくため、以下を事前にインストールすることを推奨とする(Mac)
※gemの関係上provisionerにansible_playbookが認識できない事象あり
$ brew update
$ brew install rbenv ruby-build
$ brew update
$ brew install rbenv ruby-build (もしくは、brew update rbenv ruby-build)
$ rbenv install 2.1.5
$ rbenv global 2.1.5
$ rbenv rehash
# PATH に追加
$ echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bash_profile
# .bash_profile に追加
$ echo 'eval "$(rbenv init -)"' >> ~/.bash_profile
# 上記設定の再読み込み
$ exec $SHELL -l
$ ruby -v
ruby 2.1.5p273 (2014-11-13 revision 48405) [x86_64-darwin14.0]
$ rbenv exec gem install bundler
Bundler version 1.12.5
Dockerインストール
$ brew cask install virtualbox
$ brew install docker
$ brew install docker-machine
$ docker -v
Docker version 1.11.2, build b9f10c9
# 初期設定
$ docker-machine create -d virtualbox ansible-hands-on
$ eval $(docker-machine env ansible-hands-on)
# VPNソフトを起動しているとエラーが出る場合があるよ!FAQ参照
ansibleインストール!
$ brew install ansible
$ git clone https://github.com/vSakumoto/ansible_hands_on.git ~/ansible
$ cd ~/ansible
$ bundle install
ハンズオン実施流れ
うちの会社では以下の流れで実施しました
1. 概要資料の説明
2. gitからcloneしていただいたplaybookを実行して、DockerでのTDD及びstaging環境へのプロビジョニング実施
3. git clone ファイルを編集し、実際にtasksを書き換え パッケージの追加・テスト及びstaging環境へのプロビジョニングを実施する
虎の巻として以下を展開
ansible tasks/main.yml
--- #<- マジックメソッド!! 記述の際には必ず記述する
- name: HOGEHOGE INSTALL #<-- 1タスクを記述するディレクティブ設定
apt: pkg=nginx state=present update_cache=yes #<-- apt-get install -y nginx を実施
sudo: yes # sudoをつけて実行するかを選択記載なければssh接続設定となっているユーザーで実行
tags: nginx # ansbile-playbook -i hoge -t nginxとすることで対象のタグのみを実行させることが可能 別用途としてはprd | stgなど切って本番|stgのプロビジョニングを変更するなど
when: ansible_os_family == 'Ubuntu' # Ubuntu のみの場合に実施
- name: HOGEHOGE INSTALL
yum: pkg=nginx state=present update_cache=yes
sudo: yes
when: ansible_os_family == 'RedHat' # RedHat系(CentOS)
tags: nginx
# リポジトリ追加
- name: add php repo
apt_repository: repo="ppa:ondrej/php5-5.6"
tags: repo
when: ansible_os_family == 'Ubuntu'
sudo: yes
- name: Add repository
yum_repository:
name: epel
description: EPEL YUM repo
baseurl: http://download.fedoraproject.org/pub/epel/$releasever/$basearch/
when: ansible_os_family == 'RedHat'
# ファイルコピー
- name: Upload Test File
copy: src="bash_profile" dest="/home/vSakumoto/.bash_profile" owner=vSakumoto group=vSakumoto mode=0644
tags: home_set
sudo: yes
# ディレクトリ作成
- name: private directory
file: path="/home/vSakumoto/foo" state=directory owner=vSakumoto group=vSakumoto mode=0700
tags: home_set
sudo: yes
serverspec記法
require 'spec_helper'
describe package('nginx'), :if => os[:family] == 'ubuntu' do # os[:family]の環境変数からubuntu判定をし実行
it { should be_installed } # package nginxがインストールされているか
end
describe service('nginx'), :if => os[:family] == 'ubuntu' do
it { should be_enabled } # 自動起動がONになっているか
it { should be_running } # nginxが動作しているか
end
describe port(80) do
it { should be_listening } # 指定ポートが空いているかどうか
end
# kitchen groupがあるか
describe group('kitchen') do
it { should exist }
end
# kitchen userがいるか
describe user('kitchen') do
it { should belong_to_group 'kitchen' }
end
# 配列でチェック
%w{vSakumoto xshsaku kitchen}.each do |users|
describe user(users) do
it { should belong_to_group users }
end
end
# ファイル有無
describe file('/home/vSakumoto/.bash_profile') do
it { should be_file }
end
# ディレクトリ有無
describe file("/home/vSakumoto/public_html") do
it { should be_directory }
end
ハンズオン時間は約2hぐらいを目安にし、無事完了しました。
ハンズオンを通して・・・
インフラ屋さんももちろんだけども、プログラマの方にコードでインフラを「管理できる・構築できる」メリットを伝えられるいいチャンスかもしれない
参考サイト:
Serverspecでよく使うテストの書き方まとめ
[Ansibleのテストをtest-kitchenとServerspec、dockerで行う]
(http://qiita.com/minamijoyo/items/467ddd13c0cab15330bf)