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だけでいろいろできて便利ですね。


次世代システム研究室では、グループ全体のインテグレーションを支援してくれるアーキテクトを募集しています。インフラ設計、構築経験者の方、次世代システム研究室にご興味を持って頂ける方がいらっしゃいましたら、ぜひ 募集職種一覧 からご応募をお願いします。

皆さんのご応募をお待ちしています。