Vagrantを使って簡単に開発版Ansibleのモジュールに触ってみる
目的・概要
先日、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
概要説明
フロー
- Ansible-DevがインストールされたVagrant Boxを作成
- 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.install
はfalse
にしています。
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