Provisionerが実行される順番

Vagrantにおいて表題の通り。先日のエントリで、複数のVMをひとつのVagrantfileで起動する場合、”define“の外に書いたprovisionerは共通に実行されることは確認した。今回は”define“の中と外、どちらで書いたものが先に実行されるかを確認しておく。

■ 環境

  • Vagrant 1.7.4

■ Vagrantfile

先日と同じものであるが、今回は実験だけなので不要な箇所を削除した。

$ cat Vagrantfile
# -*- mode: ruby -*-
# vi: set ft=ruby :

Vagrant.configure(2) do |config|

  config.vm.box = "chef/centos-6.6"

  config.vm.define "zoo1" do |node|
    node.vm.hostname = "zoo1"
    node.vm.network "private_network", ip: "192.168.33.101"
    node.vm.provision "shell", inline: "echo 1 >> /tmp/provision"
  end

  config.vm.define "zoo2" do |node|
    node.vm.hostname = "zoo2"
    node.vm.network "private_network", ip: "192.168.33.102"
  end

  config.vm.provision "shell", inline: "echo 2 >> /tmp/provision"
end

`/tmp/provision`ファイルに数字を`echo`で出力しているだけである。

■ 実行

前述のVagrantfileを用いてVMを起動する。2台のVMを起動する必要はないので1台だけを起動する。

$ vagrant up zoo1
  :
==> zoo1: Mounting shared folders...
    zoo1: /vagrant => /Users/withsin/work/project/test
==> zoo1: Running provisioner: shell...
    zoo1: Running: inline script
==> zoo1: Running provisioner: shell...
    zoo1: Running: inline script
$

ログインしてファイルを確認する。

$ vagrant ssh zoo1
[vagrant@zoo1 ~]$ cat /tmp/provision
2
1
[vagrant@zoo1 ~]$

上記の結果となっていた。

define“で定義した個別VMの設定よりも先に共通部分が実行されるようである。これは覚えていた方が良さそうだ。

以上。

■ 関連

Vagrantfileでinline provisionerを試す

表題の通り。provisionerにはshellスクリプトを書いて別ファイルにしたり、Ansibleでplaybookを書いたりすることができるが、ほんのちょっとしたスクリプトで可能なことであればinlineでOKだろう、ということで試してみた。

■ 環境

  • Vagrant 1.7.4

■ VM構成

1つのVagrantfileで2台のVMを起動させる。2台共に同じスクリプトを実行させて、とりあえず同じ状態の2台を構築させる。用意したVagrantfileは下記の通り。

$ cat Vagrantfile
# -*- mode: ruby -*-
# vi: set ft=ruby :

script = <<SCRIPT
  curl http://ftp.meisei-u.ac.jp/mirror/apache/dist/zookeeper/zookeeper-3.4.6/zookeeper-3.4.6.tar.gz 2>/dev/null | tar zx -C /opt
  mv /opt/zookeeper-3.4.6/conf/zoo_sample.cfg /opt/zookeeper-3.4.6/conf/zoo.cfg
  chown -R vagrant:vagrant /opt/zookeeper-3.4.6
SCRIPT

Vagrant.configure(2) do |config|

  config.vm.box = "chef/centos-6.6"

  config.vm.define "zoo1" do |node|
    node.vm.hostname = "zoo1"
    node.vm.network "private_network", ip: "192.168.33.101"
  end

  config.vm.define "zoo2" do |node|
    node.vm.hostname = "zoo2"
    node.vm.network "private_network", ip: "192.168.33.102"
  end

  config.vm.provision "shell", inline: script
end
$

実行するスクリプトの内容は見たままである。ZooKeeper-3.4.6のバイナリをダウンロードし展開、設定ファイルのサンプルを名前変更して、ディレクトリのオーナー・グループを変更しているだけである。

ちなみに以前までは固定IPを設定せずにどうにかならないか…と四苦八苦していたのだが、プラグイン等で実現させる事がほとんどのようなので一旦諦めた。”Avahi“等を使えないかと試していたのだが…。わざわざ他の人にも同じプラグインを導入してもらって、というのは面倒なので、固定IPを振ってVirtualBoxのネットワーク設定が一つ増えるかもしれない程度で済むのであれば、そちらを選択したまでである。

上記のVagrantfileを実行したところ、zoo1/zoo2共にZooKeeperがインストールされている事を確認した。”define“の外に書けば、共通して反映してくれるようだ。個別の設定等は”define“の中に書けば良いのであろう。スクリプトの実行順序が気になるが、共通の箇所を先に実行したければ、”define”の中に移して2台共に同じ記述をしなければならないのかもしれない。次回試してみる

以上。

■ 関連

InventoryFileで全Hostに対する変数

Ansibleにおいて表題の通り。変数は書いて欲しいのだが、InventoryFile以外は触ってほしくないので、InventoryFileにどう書けば良いのかを調べた。

■ 環境

  • Ansible 1.9.2

■ Host Variable

http://docs.ansible.com/ansible/intro_inventory.html#host-variables

ホスト毎に設定を入れるのはさすがに問題である。どこか特定のホストだけ設定を変えたいのなら便利に思えるだろうが、今回やりたいことには合わない。

全台で同じ変数を扱いたいとなると、下記のようになってしまう。

$ cat hosts
192.168.33.10 key=test1
192.168.33.11 key=test1
192.168.33.12 key=test1

■ Group Variable

http://docs.ansible.com/ansible/intro_inventory.html#group-variables

これが利用できるのでは?と思い試してみた。下記のように書けば、全てのホストで同じ値の変数が使用してくれる。

$ cat hosts
192.168.33.10
192.168.33.11
192.168.33.12

[all:vars]
key=test1

今回はこれでやりたいことが実現できた。

もっと良い方法があるのかもしれない。が、今はこれで十分なので良しとする。

以上。

■ 関連

AnsibleのTaskでログインユーザを知りたい

CentOSにAnsibleをインストール

InventoryFileでグループ変数

/var/run/docker.socketのパーミッション

CentOS7において表題の件について少々ハマったのでメモ。

■ 環境

  • CentOS 7.0
  • Docker 1.7.1
  • Vagrant 1.7.4

■ CentOS 7

DockerがサポートしているCentOSのversionが以前は6.6でもkernelのversionさえ合えば良かったと記憶しているのだが、現在はCentOS-7.Xでなければダメと記載されている。kernelのversionも上がっている気がする。

http://docs.docker.com/installation/centos/

よって、CentOS 7の環境を準備することにした。

■ Vagrant

検証環境はVagrantで準備する。Boxは”chef/centos-7.0“を使用する。

$ vagrant box add chef/centos-7.0
$ vagrant init chef/centos-7.0
$ vagrant up

■ Docker

CentOS 7系では、デフォルトのレポジトリに”docker“が存在するようであるので、これをインストールする。

$ sudo yum install docker

またサービスとしても起動。

$ sudo systemctl start docker.service

一般ユーザからも`sudo`を使用せずに`docker`コマンドを利用したいので、いつものように”dockerroot“グループに”vagrant“ユーザを追加する。

$ sudo usermod -G dockerroot vagrant

これで”vagrant“ユーザも`docker`コマンドを利用できるようになるはず…と思ったのだが下記のエラーで使用できず。

$ docker version
Get http:///var/run/docker.sock/v1.19/containers/json?all=1: dial unix /var/run/docker.sock: permission denied. Are you trying to connect to a TLS-enabled daemon without TLS?
$

`/var/run/docker.sock`を確認してみると、下記のようになっている。

$ ls -l /var/run/docker.sock
srw-rw----. 1 root root 0  8月 19 19:09 /var/run/docker.sock
$

今までの環境においては、`root:root`ではなく、`root:dockerroot`であったと記憶している。よって変更してしまう。

$ sudo chown root:dockerroot /var/run/docker.sock

これで再度`docker`コマンドで確認したところ、問題なく結果が得られた。

$ docker version
Client version: 1.7.1
Client API version: 1.19
Package Version (client): docker-1.7.1-108.el7.centos.x86_64
Go version (client): go1.4.2
Git commit (client): 3043001/1.7.1
OS/Arch (client): linux/amd64
Server version: 1.7.1
Server API version: 1.19
Package Version (server): docker-1.7.1-108.el7.centos.x86_64
Go version (server): go1.4.2
Git commit (server): 3043001/1.7.1
OS/Arch (server): linux/amd64
$

permissionを変更してしまって良いのか…とも思ったが、”docker-engine“や他の環境においては`root:dockerroot`であるから、問題はないだろう。あくまで自己責任である。

以上。

■ 関連

SSHのクライアント設定を少し変更

表題の通り。先日のエントリでSSHのクライアント設定を少し入れたのだが問題点があったので変更した。

■ 環境

  • Mac OSX (10.10.5)
  • Vagrant 1.7.4

■ SSHクライアント設定

先日設定したのは下記の通り。

$ cat ~/.ssh/config
Host 192.168.33.*
    IdentityFile    ~/.ssh/nonpass
    User    vagrant

しかし、これでは`vagrant destroy`をする度に対象のVMにログインし`authorized_keys`に追加しなければならないことに後から気がついた…。よって設定を少し変更することにした。

Vagrantでログインされる時の鍵は下記が使用されているようであり、またVMを作り直した際には毎回作成し直されているようである。

$ ls .vagrant/machines/default/virtualbox/private_key
.vagrant/machines/default/virtualbox/private_key
$

上記を利用するように変更する。ただし、`~/.ssh/nonpass`も使用可能であればそちらを利用するようにしておく。

$ cat ~/.ssh/config
Host 192.168.33.*
  IdentityFile  ~/.ssh/nonpass
  IdentityFile  ./.vagrant/machines/default/virtualbox/private_key
  User  vagrant

これが有効なのは、Vagrantで起動しているVMのディレクトリまで移動してからであるのが少々残念である…。が自身の使用範囲では問題ないので今回はこれで手を打つことにする。また必要になったら別途手段を模索する。

以上。

■ 関連