Linux
CentOS
Vagrant
VirtualBox
Ansible

[Ansible] Vagrantで構築した仮想マシンに対してAnsibleを試した時のメモ

More than 3 years have passed since last update.

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をインストールする手順を示します。


  1. 最新版のrpmのURLを確認

    Vagrant公式ページから最新版のVagrantパッケージのURLを確認します。 私がVagrantをインストールした時のパッケージの最新版は https://dl.bintray.com/mitchellh/vagrant/vagrant_1.7.2_x86_64.rpm にありました。


  2. インストール

    yumで先程確認したVagrantの最新版をインストールします。

    $ yum install https://dl.bintray.com/mitchellh/vagrant/vagrant_1.7.2_x86_64.rpm
    



  3. Vagrantがインストールされたことの確認

    Vagrantがインストールされたことを確認します。

    ここでは、Vagrantのバージョンを確認するコマンドを実行しています。

    $ vagrant version
    
    Installed Version: 1.7.2




VM環境の設定

Ansibleの管理対象とするVM環境を以下の手順で設定します。


  1. 作業用ディレクトリの作成

    Ansibleを実行するための作業用ディレクトリを作成します。

    $ cd ~/
    
    $ mkdir ansible
    $ cd ansible



  2. 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
    



  3. 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管理対象のノードを設定

 


  1. 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接続エラーが出た場合の対処



  2. sshコマンドで直接ログインできるように設定

    前述したように、現状では vagrant ssh コマンドでしかVagrantで構築したVMへログインできません。

    これは非常に面倒なので ssh コマンドで直接ログインできるようにします。

    $ cp ~/.ssh/config ~/.ssh/config.orig
    
    $ vagrant ssh-config > ~/.ssh/config




Ansibleの動作確認

 


  1. 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"
    }



  2. インストール対象がインストールされていないことの確認

    せっかくなので、Ansibleを使って何かインストールしてみましょう。

    私が構築したVMには gccgdb がインストールされていなかったので、これらをインストールすることにします。

    最初にそれぞれの各VMで gccgdb がインストールされていないことを確認します。

    $ 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)



  3. Playbookの作成

    Ansibleには Playbook と呼ばれる、Chefのレシピと似たようなものがあります。

    Playbookには、対象マシンに対してどういった操作を行うのかを記述していきます。

    今回は gccgdb をインストールするため、 playbook.yml を以下のように作成しました。

    ---
    
    - hosts: ansible-nodes
    sudo: yes
    tasks:
    - name: install gcc
    yum: name=gcc state=installed
    - name: install gdb
    yum: name=gdb state=installed



  4. Ansibleを使ってインストール

    作成したPlaybookを用いて、gccgdb のインストールを行ってみます。

    $ 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



  5. インストールされたことの確認

    gccgdb が正常にインストールされたことを確認します。

    $ 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で指定した gccgdb がインストールされていることを確認できました。




後始末

最後に今回使った環境を破棄します。

Vagrantを用いれば一瞬です。


  1. 仮想マシンの停止

    $ vagrant halt
    



  2. 仮想マシンの削除

    $ vagrant destroy
    




最後に

Vagrantで構築したVMに対して、構成管理ツールAnsibleを用いてソフトをインストールしてみました。

Ansibleの設定はこの例を見ていただければわかるように、非常にわかりやすいです。

Ansibleがどこまでできるのかわかっていませんが、環境構築を手軽に済ませたい人は使うことを検討する価値は十分にありそうです。

今後はAnsibleでどこまでできるのか調査することに加えて、ChefやPuppetも利用して使い心地を確かめてみたいですね。


参考情報