2014/03/04

VagrantでAnsibleを使ってOracle JDKインストールを自動化する

VagrantのプロビジョニングツールとしてAnsibleが利用できるようなので、試してみました。

なお、VagrantとAnsibleのバージョンは次の通りです。

$ vagrant --version
Vagrant 1.4.3

$ ansible --version
ansible 1.5

Vagrant

まずはVagrantを公式サイトからダウンロードしてインストールします。

次に、Vagrantはカレントに.vagrantを作成するので、ディレクトリを作り、そこで次のようなファイルVagrantfileを作成します。

$ mkdir vagrant_sample && cd vagrant_sample
$ cat Vagrantfile
# Vagrantfile API/syntax version. Don't touch unless you know what you're doing!
VAGRANTFILE_API_VERSION = "2"

Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|

  config.vm.define :node1 do |m|
    m.vm.box = "precise32"
    m.vm.box_url = "http://files.vagrantup.com/precise32.box"
    m.vm.network :private_network, ip: "192.168.1.11"
    m.vm.network :forwarded_port, guest: 22, host: 22211, id: "ssh"
  end

end

ここでは、後でAnsibleでいじりやすいようにVMのIPを指定しています。

そして、vagrant upするとUbuntuのboxがダウンロードされ実行します。

$ vagrant up
Bringing machine 'node1' up with 'virtualbox' provider...
[node1] Importing base box 'precise32'...
[node1] Matching MAC address for NAT networking...
[node1] Setting the name of the VM...
[node1] Clearing any previously set forwarded ports...
[node1] Clearing any previously set network interfaces...
[node1] Preparing network interfaces based on configuration...
[node1] Forwarding ports...
[node1] -- 22 => 22211 (adapter 1)
[node1] Booting VM...
[node1] Waiting for machine to boot. This may take a few minutes...
[node1] Machine booted and ready!
[node1] The guest additions on this VM do not match the installed version of
VirtualBox! In most cases this is fine, but in rare cases it can
prevent things such as shared folders from working properly. If you see
shared folder errors, please make sure the guest additions within the
virtual machine match the version of VirtualBox you have installed on
your host and reload your VM.

Guest Additions Version: 4.2.0
VirtualBox Version: 4.3
[node1] Configuring and enabling network interfaces...
[node1] Mounting shared folders...
[node1] -- /vagrant

vagrant statusで起動していることを確認します。

$ vagrant status
Current machine states:

node1                     running (virtualbox)

The VM is running. To stop this VM, you can run `vagrant halt` to
shut it down forcefully, or you can run `vagrant suspend` to simply
suspend the virtual machine. In either case, to restart it again,
simply run `vagrant up`.

Ansibleの導入

Ansibleをbrewからインストールします。

$ brew install ansible

続いて、Ansibleの実行を許可するホストを指定します。デフォルトでは/etc/ansible/hostsを読みにいくのでそこに書いてもよいですが、今回はカレントディレクトリにansible_hostsというファイルを作成します。

$ echo 192.168.1.11 > ansible_hosts  

そして、次のようにansibleを実行すると、応答が返されて成功していることがわかります。

$ ansible -i ansible_hosts -u vagrant --private-key=$HOME/.vagrant.d/insecure_private_key -m ping 192.168.1.11
The authenticity of host '192.168.1.11 (192.168.1.11)' can't be established.
RSA key fingerprint is xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx.
Are you sure you want to continue connecting (yes/no)? yes
192.168.1.11 | success >> {
    "changed": false, 
    "ping": "pong"
}

-mはansibleのコマンド実行で、通常のコマンド実行は-aで行います。試しにapt-get mooしてみた結果を次に示します。

$ ansible -i ansible_hosts -u vagrant --private-key=$HOME/.vagrant.d/insecure_private_key -a 'apt-get moo' 192.168.1.11
192.168.1.11 | success | rc=0 >>
         (__) 
         (oo) 
   /------\/ 
  / |    ||   
 *  /\---/\ 
    ~~   ~~   
...."Have you mooed today?"...

insecure_private_key

insecure_private_keyという名前が気になったので、セキュリティ的に大丈夫か調べたら次のような解凍が見つかりました。

まとめると、次のようなかんじっぽいです。

  • Vagrant 1.2.3より、外部からのSSH接続はできなくなったので基本的に安全。
  • Vagrant自体はベースボックスの仕様で、ユーザrootとvagrantのパスワードは共にvagrantと決まっている。
  • ユーザvagrantのためのセキュアではないキーペアが用意されている。

VagrantからAnsibleプロビジョニングしてみる

ではAnsibleのプレイブックを作成してVagrantから利用してみましょう。

まず、VagrantfileのVagrant.configureに次のようなコードを追加します。

  config.vm.provision "ansible" do |ansible|
    ansible.playbook = "playbook.yml"
    ansible.raw_arguments = '-i ansible_hosts -u vagrant --private-key=~/.vagrant.d/insecure_private_key' --private-key=~/.vagrant.d/insecure_private_key'
  end

(全ソース)。 raw_argumentsでは上のほうで実行したansibleと同様のオプションを指定して上書きしています。

続いて、playbook.ymlに次のように記述します。

- hosts: node1
  user: vagrant
  sudo: yes
  tasks:
  - name: echo test
    debug: msg='hello!'

これで、vagrant provisionすると、playbook.xmlが実行されるようになります。

$ vagrant provision
[node1] Running provisioner: ansible...

PLAY [node1] ****************************************************************** 

GATHERING FACTS *************************************************************** 
ok: [node1]

TASK: [echo test] ************************************************************* 
ok: [node1] => {
    "msg": "hello!"
}

PLAY RECAP ******************************************************************** 
node1                      : ok=2    changed=0    unreachable=0    failed=0   

ちなみに、プレイブックに書けるコマンドはansible-docで参照できます。

$ ansible-doc debug
> DEBUG

  This module prints statements during execution and can be useful for
  debugging variables or expressions without necessarily halting the
  playbook. Useful for debugging together with the 'when:' directive.

Options (= is mandatory):

- msg
        The customized message that is printed. If omitted, prints a
        generic message.
             :

利用できる全コマンド一覧はansible-doc -lです。

$ ansible-doc -l

なお、vagrant provisionするとvagrant_ansible_inventory_node1というファイルが作成されます。

$ cat vagrant_ansible_inventory_node1
# Generated by Vagrant   
node1 ansible_ssh_host=127.0.0.1 ansible_ssh_port=22211

これは、Using Vagrant and Ansibleに次のように使えると書いているのですが、手元環境ではno hosts matchedになって使えませんでした。

$ ansible-playbook -i vagrant_ansible_inventory_machinename --private-key=~/.vagrant.d/insecure_private_key -u vagrant playbook.yml

全体を通して実行してみる

次のプレイブックを参考にして、Oracle Java 7 SE SDKとMavenをインストールするようにしてみました。

実行結果は次の通りです。VMがない状態からでもvagrant upでAnsibleのプロビジョニングまで行ってくれます。

$ vagrant up
Bringing machine 'node1' up with 'virtualbox' provider...
[node1] Importing base box 'precise32'...
[node1] Matching MAC address for NAT networking...
[node1] Setting the name of the VM...
[node1] Clearing any previously set forwarded ports...
[node1] Clearing any previously set network interfaces...
[node1] Preparing network interfaces based on configuration...
[node1] Forwarding ports...
[node1] -- 22 => 22211 (adapter 1)
[node1] Booting VM...
[node1] Waiting for machine to boot. This may take a few minutes...
[node1] Machine booted and ready!
[node1] The guest additions on this VM do not match the installed version of
VirtualBox! In most cases this is fine, but in rare cases it can
prevent things such as shared folders from working properly. If you see
shared folder errors, please make sure the guest additions within the
virtual machine match the version of VirtualBox you have installed on
your host and reload your VM.

Guest Additions Version: 4.2.0
VirtualBox Version: 4.3
[node1] Configuring and enabling network interfaces...
[node1] Mounting shared folders...
[node1] -- /vagrant
[node1] Running provisioner: ansible...

PLAY [node1] ****************************************************************** 

GATHERING FACTS *************************************************************** 
ok: [node1]

TASK: [install python-pycurl] ************************************************* 
changed: [node1]

TASK: [Add the webupd8 APT repository] **************************************** 
changed: [node1]

TASK: [Automatically accept the Oracle License] ******************************* 
changed: [node1]

TASK: [Install Oracle Java 7 SE SDK] ****************************************** 
changed: [node1]

TASK: [install Maven2] ******************************************************** 
changed: [node1]

PLAY RECAP ******************************************************************** 
node1                      : ok=6    changed=5    unreachable=0    failed=0   

おわりに

VagrantのプロビジョニングツールとしてAnsibleが利用してみました。

関連リンク

0 件のコメント:

コメントを投稿

注: コメントを投稿できるのは、このブログのメンバーだけです。