ChefやPuppetに比べて使い方が簡単であると評判なAnsibleを試してみましたので、忘れないうちに構築までの手順のメモとして残しておくことにします。
環境構築について私の理解が不十分であるところもあるので、間違い等がありましたらご指摘お願いします。
環境
- OS(ホスト):CentOS 6.5
- OS(VM):CentOS 6.5
VM環境の構築
Ansibleを試す環境を簡単に構築&破棄できるよう、利用するノードはVMとしました。
そしてVirtual Boxを直接使うのは面倒そうなので、Virtual Boxを簡単に扱うためによく使われてるVagrantを用いてVMを構築します。
Vagrantを利用することで、Virtual Boxを直接使う時に比べて簡単な操作でVMを構築することができます。
Vagrantのインストール
Vagrantをインストールする手順を示します。
- 最新版のrpmのURLを確認 [Vagrant公式ページ](https://www.vagrantup.com/)から最新版のVagrantパッケージのURLを確認します。 私がVagrantをインストールした時のパッケージの最新版は `https://dl.bintray.com/mitchellh/vagrant/vagrant_1.7.2_x86_64.rpm` にありました。
- インストール
yumで先程確認したVagrantの最新版をインストールします。
$ yum install https://dl.bintray.com/mitchellh/vagrant/vagrant_1.7.2_x86_64.rpm
- Vagrantがインストールされたことの確認
Vagrantがインストールされたことを確認します。
ここでは、Vagrantのバージョンを確認するコマンドを実行しています。
$ vagrant version Installed Version: 1.7.2
VM環境の設定
Ansibleの管理対象とするVM環境を以下の手順で設定します。
- 作業用ディレクトリの作成
Ansibleを実行するための作業用ディレクトリを作成します。
$ cd ~/ $ mkdir ansible $ cd ansible
- Vagrantの初期化
Vagrantを初期化し、環境構成ファイルVagrantfileを作成します。
`名称` には指定した `box` に対する固有の名前(任意に設定可能)をつけ、 `box` には、Vagrantに必要な仮想マシンのテンプレート(boxファイル)を指定します。
$ vagrant init [名称] [box]
今回VM環境に使うCentOS 6.5なら以下のようになります。
名称
は適当で良いですが、今回は centos6.5_ansible としました。$ vagrant init centos6.5_ansible http://opscode-vm-bento.s3.amazonaws.com/vagrant/virtualbox/opscode_centos-6.5_chef-provisionerless.box
- Vagrantfileの編集
特に何も考えず、 **3台のVMを起動** するようにVagrantfileを編集しました。
$ cp Vagrantfile Vagrantfile.orig $ diff Vagrantfile
15c15,29 < config.vm.box = "centos6.5_ansible" --- > config.vm.define :node1 do |node| > node.vm.box = "centos6.5_ansible" > node.vm.network :private_network, ip: "192.168.100.10" > end > > config.vm.define :node2 do |node| > node.vm.box = "centos6.5_ansible" > node.vm.network :private_network, ip: "192.168.100.11" > end > > config.vm.define :node3 do |node| > node.vm.box = "centos6.5_ansible" > node.vm.network :private_network, ip: "192.168.100.12" > end >
VMの起動
VMを起動します。
$ vagrant up
VMが起動できたことを確認してみましょう。
$ vagrant status
Current machine states:
node1 running (virtualbox)
node2 running (virtualbox)
node3 running (virtualbox)
これでVMが起動できていることは確認できましたので、VMにログインしてみましょう。
今のままではVagrantで構築したVMへ直接 ssh
コマンドでログインできないので、 vagrantコマンドのssh を使ってログインする必要があります。
$ vagrant ssh node1
(vagrantで作成した仮想マシン)
Ansibleを使ってみる
Ansibleを利用するVM環境が用意できましたので、Ansibleを使ってみましょう。
Ansibleのインストール
Ansibleのインストールはyumで行います。
$ yum install ansible
Ansible管理対象のノードを設定
- hostsファイルの作成
Ansibleには **インベントリファイル** というものがあり、Ansibleの管理対象のノードを列挙します。
ここでは、 `hosts` というファイル名でインベントリファイルを作成します。
$ cd ~/ansible $ touch hosts
今回作成したhostsファイルの内容を以下に示します。
[ansible-nodes] 192.168.100.10 ansible_ssh_user=vagrant ansible_ssh_private_key_file=.vagrant/machines/node1/virtualbox/private_key 192.168.100.11 ansible_ssh_user=vagrant ansible_ssh_private_key_file=.vagrant/machines/node2/virtualbox/private_key 192.168.100.12 ansible_ssh_user=vagrant ansible_ssh_private_key_file=.vagrant/machines/node3/virtualbox/private_key
今回は、先程作成した3台のVMを
ansible-nodes
グループとして指定しています。
秘密鍵を指定するansible_ssh_private_key_file
に~/.vagrant.d/insecure_private_key
を指定する記事が多くありますが、次に続くAnsibleによるpingの動作確認において、 Vagrantのバージョンが比較的新しいとPermission Denied なってしまいますので注意が必要です。
また、理由は分からないのですが、第1フィールドにはホスト名ではなく IPアドレス を直接書く必要があるそうです。
ホスト名を書いてしまうとPermission Denied となってしまいます。
(参考:Vagrant 1.7+でSSH接続エラーが出た場合の対処) - sshコマンドで直接ログインできるように設定
前述したように、現状では `vagrant ssh` コマンドでしかVagrantで構築したVMへログインできません。
これは非常に面倒なので `ssh` コマンドで直接ログインできるようにします。
$ cp ~/.ssh/config ~/.ssh/config.orig $ vagrant ssh-config > ~/.ssh/config
Ansibleの動作確認
- pingの実行
Ansibleの動作確認を行うため、pingを実行してみます。
$ ansible -i hosts ansible-nodes -m ping 192.168.100.10 | success >> { "changed": false, "ping": "pong" } 192.168.100.11 | success >> { "changed": false, "ping": "pong" } 192.168.100.12 | success >> { "changed": false, "ping": "pong" }
- インストール対象がインストールされていないことの確認
せっかくなので、Ansibleを使って何かインストールしてみましょう。
私が構築したVMには `gcc` と `gdb` がインストールされていなかったので、これらをインストールすることにします。
最初にそれぞれの各VMで `gcc` と `gdb` がインストールされていないことを確認します。
$ ssh node1 $ which gcc /usr/bin/which: no gcc in (/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/sbin:/home/vagrant/bin) $ which gdb /usr/bin/which: no gdb in (/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/sbin:/home/vagrant/bin) $ ssh node2 $ which gcc /usr/bin/which: no gcc in (/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/sbin:/home/vagrant/bin) $ which gdb /usr/bin/which: no gdb in (/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/sbin:/home/vagrant/bin) $ ssh node3 $ which gcc /usr/bin/which: no gcc in (/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/sbin:/home/vagrant/bin) $ which gdb /usr/bin/which: no gdb in (/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/sbin:/home/vagrant/bin)
- Playbookの作成
Ansibleには **Playbook** と呼ばれる、Chefのレシピと似たようなものがあります。
Playbookには、対象マシンに対してどういった操作を行うのかを記述していきます。
今回は `gcc` と `gdb` をインストールするため、 `playbook.yml` を以下のように作成しました。
--- - hosts: ansible-nodes sudo: yes tasks: - name: install gcc yum: name=gcc state=installed - name: install gdb yum: name=gdb state=installed
- Ansibleを使ってインストール
作成したPlaybookを用いて、`gcc` と `gdb` のインストールを行ってみます。
$ ansible-playbook -i hosts playbook.yml PLAY [ansible-nodes] ********************************************************** GATHERING FACTS *************************************************************** ok: [192.168.100.12] ok: [192.168.100.11] ok: [192.168.100.10] TASK: [install gcc] *********************************************************** changed: [192.168.100.11] changed: [192.168.100.10] changed: [192.168.100.12] TASK: [install gdb] *********************************************************** changed: [192.168.100.10] changed: [192.168.100.11] changed: [192.168.100.12] PLAY RECAP ******************************************************************** 192.168.100.10 : ok=3 changed=2 unreachable=0 failed=0 192.168.100.11 : ok=3 changed=2 unreachable=0 failed=0 192.168.100.12 : ok=3 changed=2 unreachable=0 failed=0
- インストールされたことの確認
`gcc` と `gdb` が正常にインストールされたことを確認します。
$ ssh node1 $ which gcc /usr/bin/gcc $ which gdb /usr/bin/gdb $ ssh node2 $ which gcc /usr/bin/gcc $ which gdb /usr/bin/gdb $ ssh node3 $ which gcc /usr/bin/gcc $ which gdb /usr/bin/gdb
Playbookで指定した
gcc
とgdb
がインストールされていることを確認できました。
後始末
最後に今回使った環境を破棄します。
Vagrantを用いれば一瞬です。
- 仮想マシンの停止
$ vagrant halt
- 仮想マシンの削除
$ vagrant destroy
最後に
Vagrantで構築したVMに対して、構成管理ツールAnsibleを用いてソフトをインストールしてみました。
Ansibleの設定はこの例を見ていただければわかるように、非常にわかりやすいです。
Ansibleがどこまでできるのかわかっていませんが、環境構築を手軽に済ませたい人は使うことを検討する価値は十分にありそうです。
今後はAnsibleでどこまでできるのか調査することに加えて、ChefやPuppetも利用して使い心地を確かめてみたいですね。