この記事は公開されてから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
概要説明
フロー
- 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