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 endsite.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=restartedintegration.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=0httpdのインストールとportのチェックができました。
今回はコマンドの戻り値と標準出力の文字列マッチの例ですが、他にもFactsを調べたりバージョンを評価する事もできそうです。
Ansibleだけでいろいろできて便利ですね。
次世代システム研究室では、グループ全体のインテグレーションを支援してくれるアーキテクトを募集しています。インフラ設計、構築経験者の方、次世代システム研究室にご興味を持って頂ける方がいらっしゃいましたら、ぜひ 募集職種一覧 からご応募をお願いします。
皆さんのご応募をお待ちしています。