[Vagrant & VirtualBox] Chef: 用意したテンプレートを設定ファイルとして利用する

knife solo からと Vagrant から扱う場合とで細かい部分が違うようで悩みました。

テンプレートを用意する

仮想マシン(node)にログインし、設定ファイルを共有フォルダへコピーします。

[vagrant@localhost html]$ cp /etc/httpd/conf/httpd.conf /vagrant/

Mac(Workstation)にテンプレートとして登録します。

% mv ../vagrant/httpd.conf site-cookbooks/zend/templates/default/httpd.conf.erb

site-cookbooks/zend/templates/default/httpd.conf.erb を編集します。
ポートを変数とし、設定ファイルから変更できるようにしてみます。

#Listen 12.34.56.78:80
Listen <%= node['httpd']['port'] %>

site-cookbooks/zend/recipes/default.rb を編集します。

service "iptables" do
  action [:stop, :disable]
end
%w{php mysql-server httpd}.each do |p|
  package p do
    action :install
  end
end
service "httpd" do
  action [:start, :enable]
end
template "httpd.conf" do
  path   "/etc/httpd/conf/httpd.conf"
  source "httpd.conf.erb"
  mode   0644
end

httpd をたててみます。

knife solo の場合

nodes/zend.json を作成します。

port 番号をこんな形で指定します。

{
  "httpd": {
    "port": 8080
  },
  "run_list": [
    "recipe[zend]"
  ]
}

以下で実行します。

% knife solo cook zend

Vagrant の場合

vagrant up を実行した限りでは nodes/zend.json を見ていませんでした。(削除しても動作します)。

公式サイトを確認すると、Vagrantfile 内から渡すようです。

Vagrantfile
VAGRANTFILE_API_VERSION = "2"
Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
  config.vm.box = "chef/centos-6.5"
  config.vm.network "private_network", ip: "192.168.33.10"
  config.omnibus.chef_version = "11.6.0"
  config.vm.provision "chef_solo" do |chef|
    chef.cookbooks_path = "./site-cookbooks"
    chef.add_recipe "zend"
    chef.json = {
      "httpd" => {
        "port" => "8080”
      }
    }
  end
end

vagrant upvagrant provision で実行します。