概要
Vagrant + Ansibleのお勉強です。
Macをコントロールマシンとして、Vagrantを使ってVirtualBox上にDockerインストール済みのCentOS7をセットアップします。
また、CentOS上のDocker以外の部分のプロビジョニングをAnsibleを使って構築します。
環境
- Vagrant 1.8.1
- box: williamyeh/centos7-docker
- ansible 2.1.0.0
適当なディレクトリを作成し、Vagrantの初期化を行います。
次のコマンドを打つと、Vagrantfileという設定ファイルが作られます。
box名にはwilliamyeh/centos7-docker
を指定しています。
このboxは次のサイトでdocker
と検索した結果の中から選びました。
Discover Vagrant Boxes - Vagrant Cloud
vagrant init williamyeh/centos7-docker
Vagrantfileができていると思います。
Vagrantfileを開いて、次の修正をおこないます。
・・・
config.vm.network "private_network", ip: "192.168.33.10"
・・・
config.vm.provider "virtualbox" do |vb|
vb.memory = "1024"
end
(1)内部ネットワーク(192.168.33.10)を利用してホストからゲストに接続できるようにします。
(2)メモリ数を増やしました。デフォルトだと480MBのようです。
プロビジョニングの設定
作成したCentOSには最低限のものしかインストールされていません。
作業をしていく上で必要な(筆者が個人的に)GitやVim、zshなどをインストールする必要があります。
ただ、これらをゲストマシンを作るたびに手でインストールしていくのは面倒です。
そこで、Vagrantの自動プロビジョニングの機能を使います。
この機能を使用すると、Vagrantは起動後に自動的にソフトウェアをインストールするため、ゲストマシンがすぐ使用できるようになります。
詳しくは以下を参照してください。
Provisioning - Getting Started - Vagrant by HashiCorp
プロビジョニングにはAnsibleを使用します。
Vagrantfileに次の処理を記述してください。
・・・
config.vm.provision "ansible" do |ansible|
ansible.playbook = "provisioning/vagrant.yml"
ansible.inventory_path = "provisioning/hosts"
ansible.limit = 'all'
end
end
(1)プロビジョニングにansibleをつかいます。
(2)ansibleのplaybookの場所を指定しています。
(3)ansibleのiventoryの場所を指定しています。
(4)ansible-playbook を実行するホストやグループを指定しています。
ansible-playbookの準備
先ほど記述した場所に設定ファイルを用意しておきます。
$ tree
.
├── Vagrantfile
└── provisioning
├── config
│ └── .vimrc
├── hosts
└── vagrant.yml
provisioningディレクトリを作成し、その階層にhostsファイルとvagrant.ymlファイルをつくりました。
hosts
[vagrants]
192.168.33.10
(1)Vagrantfileで設定した内部ネットワークIPを記述します。
vagrant.yml
---
- hosts: vagrants
become: yes
user: vagrant
tasks:
- name: install packages
yum: name={{ item }} state=installed
with_items:
- zsh
- vim
- git
- name: copy
copy: src=./config/.vimrc dest=/home/vagrant/ owner=vagrant
(1)タスク名を指定します。
(2)yumでインストールするタスクです。インストールはwith_items
に記載されたものを順に行います。
(3)ここに記載されたツールがインストールされます。
(4)srcのものをdestにコピーするタスクです。vimの設定ファイルをゲストマシンのhomeディレクトリに配置する設定をしています。
vagrantを実行します。
williamyeh/centos7-docker
が初めて使うボックスである場合、ダウンロードに時間がかかります。
$ vagrant up
Bringing machine 'default' up with 'virtualbox' provider...
==> default: Checking if box 'williamyeh/centos7-docker' is up to date...
==> default: A newer version of the box 'williamyeh/centos7-docker' is available! You currently
==> default: have version '1.11.1.20160506'. The latest is version '1.12.1.20160830'. Run
==> default: `vagrant box update` to update.
==> default: Clearing any previously set forwarded ports...
==> default: Fixed port collision for 22 => 2222. Now on port 2200.
==> default: Clearing any previously set network interfaces...
==> default: Preparing network interfaces based on configuration...
default: Adapter 1: nat
default: Adapter 2: hostonly
==> default: Forwarding ports...
default: 22 (guest) => 2200 (host) (adapter 1)
==> default: Running 'pre-boot' VM customizations...
==> default: Booting VM...
・・・省略・・・
==> default: Running provisioner: ansible...
default: Running ansible-playbook...
PLAY [vagrants] ****************************************************************
TASK [setup] *******************************************************************
ok: [192.168.33.10]
TASK [install packages zsh] ****************************************************
changed: [192.168.33.10] => (item=[u'zsh', u'vim', u'git'])
TASK [copy .vimrc] *************************************************************
changed: [192.168.33.10]
PLAY RECAP *********************************************************************
192.168.33.10 : ok=9 changed=8 unreachable=0 failed=0
仮想マシンが立ち上がった後にAnsibleによるプロビジョニングが始まったことが確認できます。
立ち上がった仮想マシンに接続して、zshやvimやgitが使えることを確認します。
$ vagrant ssh
vagrant@localhost ~ $ zsh --version
zsh 5.0.2 (x86_64-redhat-linux-gnu)
vagrant@localhost ~ $ git --version
git version 1.8.3.1
最後に、目的であったDockerがインストールされていることも確認します。
vagrant@localhost ~ $ docker --version
Docker version 1.11.1, build 5604cbe
まとめ
はじめからDockerがインストールされたBoxを使うことで簡単に環境構築をすることができました。
また、今回はライトにしか使っていませんがansibleを使うことで冪等性の持った環境にすることもできました。
次回はこの環境を使って、Dockerコンテナ上にElasticsearch、Kibanaをたててみたいと思います。