AnsibleのplaybookをVagrantでテストする

AnsibleのplaybookをテストをするのにVagrantで構築した仮想マシンを使っている。VagrantではProvisionerとしてAnsibleが利用可能であり以下のようにすればvagrant upでAnsibleのplaybookを実行することができる。

$ tree .
.
├── Vagrantfile
└── playbook.yml
Vagrant.configure(2) do |config|
  config.vm.box = "centos/7"
  config.vm.provision "ansible" do |ansible|
    ansible.verbose  = true
    ansible.playbook = "playbook.yml"
  end
end

テストするときに様々なグループやロールごとに実行したい時もあり、その場合はVagrantfileの中で指定するのでなく、ansibleコマンドでplaybookのテストをするようにしている。

Vagrant環境で手動によるplaybookの実行

provisionでansibleを指定すると以下のパスにVagrant環境のinventoryファイルが生成される。このファイルにsshアクセスするのに必要な情報が鍵情報含めて定義されている。

$ cat .vagrant/provisioners/ansible/inventory/vagrant_ansible_inventory 
# Generated by Vagrant

default ansible_ssh_host=127.0.0.1 ansible_ssh_port=2200 ansible_ssh_user='vagrant' ansible_ssh_private_key_file='.vagrant/machines/default/virtualbox/private_key'

あとは、上の定義をコマンドラインオプションで渡してあげれば、Vagrant上での容易にplaybookの実行が可能となる。

ansible default -i .vagrant/provisioners/ansible/inventory/vagrant_ansible_inventory -m ping

ホスト名やinventoryは毎回同じ値を指定することになるので、簡単なスクリプトを用意して実行している。

以下サンプル。

$ tree .
.
├── Vagrantfile
├── db.yml
├── vagrant-inventory
├── vagrant.yml
├── vansible.sh
└── web.yml

vansible.sh

#!/usr/bin/env bash

set -u

usage() {
  cat <<EOF
Usage: $0 [playbook <playbook>|update-inventory] [ANSIBLE OPTIONS]
EOF
}

test $# -eq 0 && usage && exit

INVENTORY_FILE=".vagrant/provisioners/ansible/inventory/vagrant_ansible_inventory"
SUB_COMMAND="$1"

# Merge vagrant-inventory
test "$SUB_COMMAND" = "update-inventory" && shift && {
  sed -i -e '/Generated by vansible/,$d' $INVENTORY_FILE
  cat vagrant-inventory >> $INVENTORY_FILE
  cat $INVENTORY_FILE
  exit
}

# Run playbook
test "$SUB_COMMAND" = "playbook" && shift && {
  if [ $# -eq 0 ]; then
    echo "<playbook> is not specified."
    usage && exit 1
  fi
  playbook="$1"
  shift
  ansible-${SUB_COMMAND} $playbook \
          -i $INVENTORY_FILE \
          $@
  exit $?
}

# Run ansible
ansible default -i $INVENTORY_FILE $@

vagrant.yml

- hosts: all
  tasks:
    - shell: date

web

- hosts: web
  become: yes
  tasks:
    - yum: name=httpd state=present

db

- hosts: db
  become: yes
  tasks:
    - yum: name=http://dev.mysql.com/get/mysql-community-release-el7-5.noarch.rpm
    - yum: name=mysql-community-server state=present

Vagrantfile

Vagrant.configure(2) do |config|
  config.vm.box = "centos/7"
  config.vm.provision "ansible" do |ansible|
    ansible.verbose  = true
    ansible.playbook = "vagrant.yml"
  end
end

vagrant-inventory。ここにグループを加えておく。

# Generated by vansible

[web]
default

[db]
default

inventoryのマージ。

$ ./vansible.sh update-inventory
# Generated by Vagrant

default ansible_ssh_host=127.0.0.1 ansible_ssh_port=2222 ansible_ssh_user='vagrant' ansible_ssh_private_key_file='.vagrant/machines/default/virtualbox/private_key'
# Generated by vansible

[web]
default

[db]
default

ansibleの実行。

$ ./vansible.sh -m ping
default | SUCCESS => {
    "changed": false, 
    "ping": "pong"
}

$ ./vansible.sh playbook db.yml

PLAY [db] **********************************************************************

TASK [setup] *******************************************************************
ok: [default]

TASK [yum] *********************************************************************
changed: [default]

TASK [yum] *********************************************************************
changed: [default]

PLAY RECAP *********************************************************************
default                    : ok=3    changed=2    unreachable=0    failed=0

$ ./vansible.sh playbook web.yml

PLAY [web] *********************************************************************

TASK [setup] *******************************************************************
ok: [default]

TASK [yum] *********************************************************************
changed: [default]

PLAY RECAP *********************************************************************
default                    : ok=2    changed=1    unreachable=0    failed=0

参考リンク

  • http://docs.ansible.com/ansible/guide_vagrant.html
  • https://www.vagrantup.com/docs/provisioning/ansible.html
入門Ansible

入門Ansible

posted with amazlet at 16.06.23
(2014-07-30)
売り上げランキング: 3,212
初めてのAnsible

初めてのAnsible

posted with amazlet at 16.06.23
Lorin Hochstein
オライリージャパン
売り上げランキング: 25,752

byebyehaikikyou

日記やIT系関連のネタ、WordPressに関することなど様々な事柄を書き付けた雑記です。ITエンジニア経験があるのでプログラミングに関することなどが多いです。

シェアする

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

コメントする

Translate »