2014.12.24
Ansibleのassertモジュールでインテグレーションテスト

こんにちは N.Oです。Ansibleにはassertモジュールというものがあり、Factsやregisterを利用する事でテストに活用する事ができます。
今回はvagrantを利用して使い方を試してみます。
事前準備
Vagrantfile、site.yml、integration.ymlの3ファイルを用意します。
Vagrantfile
# -*- mode: ruby -*-
# vi: set ft=ruby :
VAGRANTFILE_API_VERSION = "2"
Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
config.vm.box = "chef/centos-6.5"
config.vm.provision "ansible" do |ansible|
ansible.sudo = true
ansible.playbook = "site.yml"
#ansible.playbook = "integration.yml"
end
end
site.yml
httpdがインストールされ、Listenが8080に変更されるだけのplaybookです。
- hosts: default
vars:
http_port: 8080
remote_user: vagrant
tasks:
- name: libselinux-python latest version
yum: pkg=libselinux-python state=latest
- name: ensure apache is at the latest version
yum: pkg=httpd state=latest
- name: write the apache config file
lineinfile: dest=/etc/httpd/conf/httpd.conf regexp="^Listen "
insertafter="^#Listen " line="Listen {{ http_port }}"
notify:
- restart apache
- name: ensure apache is running
service: name=httpd state=started
handlers:
- name: restart apache
service: name=httpd state=restarted
integration.yml
httpdパッケージが存在する事とportをチェックするテスト用のplaybookです
- hosts: default
vars:
http_port: 8080
remote_user: vagrant
tasks:
- name: Check install httpd
command: rpm -q httpd
register: rpm_result
changed_when: False
- name: Verify install httpd
assert: { that: [ rpm_result.rc == 0 ] }
- name: Check http port
command: ss -ln sport = :{{ http_port }}
register: port_result
changed_when: False
- name: Verify http port
assert: { that: [ '"LISTEN" in port_result.stdout_lines[1]' ] }
使ってみる
vagrant upしてみます。まずはsite.xmlでhttpdがインストールされ、Listenが8080に変更された状態でhttpdが起動します。
$vagrant up Bringing machine 'default' up with 'virtualbox' provider... (中略) PLAY RECAP ******************************************************************** default : ok=6 changed=5 unreachable=0 failed=0
インテグレーションテスト
Vagrantfileの10行目をコメントし、11行目のコメントを外します。
#ansible.playbook = "site.yml" ansible.playbook = "integration.yml"
vagrant provisionすると今度はintegration.ymlが実行されます。
$vagrant provision ==> default: Running provisioner: ansible... PLAY [default] **************************************************************** GATHERING FACTS *************************************************************** ok: [default] TASK: [Check install httpd] *************************************************** ok: [default] TASK: [Verify install httpd] ************************************************** ok: [default] TASK: [Check http port] ******************************************************* ok: [default] TASK: [Verify http port] ****************************************************** ok: [default] PLAY RECAP ******************************************************************** default : ok=5 changed=0 unreachable=0 failed=0
httpdのインストールとportのチェックができました。
今回はコマンドの戻り値と標準出力の文字列マッチの例ですが、他にもFactsを調べたりバージョンを評価する事もできそうです。
Ansibleだけでいろいろできて便利ですね。
次世代システム研究室では、グループ全体のインテグレーションを支援してくれるアーキテクトを募集しています。インフラ設計、構築経験者の方、次世代システム研究室にご興味を持って頂ける方がいらっしゃいましたら、ぜひ 募集職種一覧 からご応募をお願いします。
皆さんのご応募をお待ちしています。
グループ研究開発本部の最新情報をTwitterで配信中です。ぜひフォローください。
Follow @GMO_RD

