Vagrantを使って簡単に開発版Ansibleのモジュールに触ってみる

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

目的・概要

先日、Ansibleの2.5 alpha版がリリースされました。 モジュールの追加や新たなループの仕組みが登場するようですね。 新機能をいち早く試すために、検証環境を作ってみました。

環境

アプリケーション バージョン
MacOS 10.13.3(17D47)
VirtualBox 5.2.6 r120293
Vagrant 2.0.2
vagrant-vbguest 0.15.1

セットアップ

VirtualBoxのAgentをインストールするために、プラグイン vagrant-vbguest をインストールしておきましょう。

brew cask install virtualbox
brew cask install virtualbox-extension-pack
brew cask install vagrant
vagrant plugin install vagrant-vbguest

概要説明

フロー

  1. Ansible-DevがインストールされたVagrant Boxを作成
  2. Vagrant Provisioner の ansible_local を使ってVagrantで作成したVMを構成管理

イメージ図

イメージ図

ディレクトリ構成

.
├── Vagrantfile
├── ansible-box
│   ├── Vagrantfile
│   └── my-ansible-dev.box
├── ansible.cfg
├── inventory
└── playbook.yml

手順

Vagrant Box 作成

Vagrantfileを作成して、Boxに出力します。
このVagrantfileでは、作成時点で最新のバージョンをクローンしますがgit checkoutを追加して任意のバージョンを指定することも可能です。(未検証)
Boxを作成した後、VMは容量の無駄なので削除しておきましょう。 他の人に展開する予定がないならrm my-ansibled-dev.boxで取り込み済みのBoxも削除して問題ありません。

mkdir ansible-box
cd ansible-box
vi Vagrantfile
vagrant up
vagrant halt
vagrant package --output my-ansible-dev.box
vagrant box add my-ansible-dev my-ansible-dev.box
vagrant destroy -f
cd ../

ansible-box/Vagrantfile

Ansible実行に必要なパッケージをインストールし、リポジトリからクローンします。
hacking/env-setupに必要なPATHが記述されているので、.bash_profileに設定して自動で読み込むようにします。

# -*- mode: ruby -*-
# vi: set ft=ruby :

Vagrant.configure("2") do |config|

  config.vm.box = "centos/7"
  config.vm.box_check_update = true

  config.vm.provision "shell", inline: <<-SHELL
      timedatectl set-timezone Asia/Tokyo
      localectl set-locale LANG=en_US.UTF-8
      yum -y update
      yum -y install git gcc epel-release
      yum -y install python-pip python-devel
      pip install --upgrade pip
      pip install paramiko jinja2 PyYAML setuptools pycrypto
      sudo -u vagrant git clone https://github.com/ansible/ansible.git
      echo 'source ~/ansible/hacking/env-setup' >> /home/vagrant/.bash_profile
  SHELL
end

検証用環境作成

各テキストを作成します。

vi Vagrantfile
vi ansible.cfg
vi inventory
vi playbook.yml

/Vagrantfile

VirtualBox以外でも利用しやすい様に、Provider指定の箇所を変数にしておきました。
ansible.*の値を編集することで、Ansibleの動作を変更できます。
今回は事前にAnsibleがインストール済みのBoxを使用するのでansible.installfalseにしています。
controllerは一番最後に記述する必要があります。ホスト増やす場合は注意してください。

# file: Vagrantfile
VAGRANTFILE_API_VERSION = "2"
VAGRANT_PROVIDER = "virtualbox"

Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
  config.vm.box = "centos/7"

  config.vm.define "target" do |target|
    target.vm.box = "centos/7"
    target.vm.hostname = "target"
    target.vm.network "private_network", ip: "192.168.56.10"
  end

  config.vm.define 'controller' do |controller|
    controller.vm.box = "my-ansible-dev"
    controller.vm.synced_folder ".", "/vagrant"
    controller.vm.network "private_network", ip: "192.168.56.5"

    controller.vm.provision "file", source: ".vagrant/machines/target/#{VAGRANT_PROVIDER}/private_key", destination: "/home/vagrant/.ssh/target.private_key"

    controller.vm.provision "shell", inline: <<-SHELL
      chmod 600 -R /home/vagrant/.ssh/*.private_key
      chown vagrant:vagrant -R /home/vagrant/.ssh/*.private_key
    SHELL

    controller.vm.provision :ansible_local do |ansible|
      ansible.playbook       = "playbook.yml"
      ansible.verbose        = true
      ansible.install        = false
      ansible.limit          = "all"
      ansible.inventory_path = "inventory"
    end
  end
end

/ansible.cfg

AnsibleはSSHで対象に対して接続します。
Ansibleを使う場合は、一度SSHで接続してホストキーの確認を完了しておくのですが、今回は無視して接続するように設定します。
通常Ansibleを利用する場合は、この設定を使うと誤ったホストに対して設定してしまう危険があるので、自動化しているなど理由がない場合はおすすめしません。

[defaults]
host_key_checking = no

[ssh_connection]
ssh_args = -o ControlMaster=auto -o ControlPersist=60s -o UserKnownHostsFile=/dev/null -o IdentitiesOnly=yes

/inventory

管理対象のIPアドレスとSSHキーを設定します。
Vagrantfileと一致するように設定します。

controller ansible_connection=local

target ansible_host=192.168.56.10 ansible_ssh_private_key_file=/home/vagrant/.ssh/target.private_key

/playbook.yml

とりあえず、pingと2.5の新機能のpackage_factsを設定しました。

---
- hosts: target
  tasks:
    - name: ping
      ping:
    - name: package_facts
      package_facts:
        manager: auto

VM作成、Ansible実行

target,controllerが作成され、Ansibleが実行されます。

vagrant up

無事にVMが作成され、Ansibleが実行されていれば成功です! Ansible 2.5 の新モジュールpackage_factsが実行されているはずです。 整形されていないので見にくいですが、インストール済みパッケージの情報を確認できます。 playbook.ymlを書き換えて、様々な新機能を試してみましょう。 2回目以降の実行(VMが起動済みの場合)はvagrant upではprovisionがスキップされます。以下のコマンドで実行してください。

vagrant provision controller

補足

鍵ファイルの受け渡し

鍵ファイルを synced_folder でなく provision file を使っているのは、Windowsへのケアです。 Windowsのsynced_folderはSMBでパーミッションの設定がでません。その為AnsibleがSSH接続する際に、bad permissionで処理が止まってしまいます。

controller.vm.provision "file", source: ".vagrant/machines/target/#{VAGRANT_PROVIDER}/private_key", destination: "/home/vagrant/.ssh/target.private_key"

controller.vm.provision "shell", inline: <<-SHELL
  chmod 600 -R /home/vagrant/.ssh/*.private_key
  chown vagrant:vagrant -R /home/vagrant/.ssh/*.private_key
SHELL

参考