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 件のコメント:
コメントを投稿
注: コメントを投稿できるのは、このブログのメンバーだけです。