今までのサーバ構成をchefで管理していて、それをコンテナ化して運用したいというニッチな人のための記事
一応それを実現させるツールとしてpackerがある
Docker, VirtualBoxをbuildして、その中身をchef, puppet, ansibleとかでprovisioningできる素敵っぽいツール
これでbuilderをDockerに、Provisonerをchefにして、流したいrun_listを記述すれば、動くかもしれない
とはいえ、まだ出たばかりで辛いところもあると聞いたので、chefを流し込みたいだけなら、Dockerfile中でchef-soloコマンドを叩かせるようにすればいいのではないだろうかと思ったので、やってみることにした
Dockerfileに直接書いて動かすメリットとしては、Dockerfile中の書く場所にさえ気をつければ、cacheが使われるので必ずchefが流れるわけじゃないという点がある
環境はcore osでDockerコンテナ内はscientific linuxになっている
参考にさせていただいた
Dockerfile + chef-solo - boku no blog
準備
chefリポジトリは既に用意してある。ただ、knife-soloで流す事が前提だったので、chef-soloコマンドで流せるようにしないといけない
solo.rbを、knife.rbをベースにして作る
knife soloコマンドで流していた設定
cookbook_path ["cookbooks", "site-cookbooks"]
node_path "nodes/local"
role_path "roles"
data_bag_path "data_bags/local"
knife[:berkshelf_path] = "cookbooks"
{
"environment": "local",
"run_list": [
"recipe[usercreate::admin]",
"role[application]"
]
}
knife solo cook root@hoge.example.co.jp nodes/local/application.json
大体こんな風に叩く。これにあわせてsolo.rbを作る
base = File.expand_path('..', __FILE__)
cookbook_path [base << "/cookbooks", base << "/site-cookbooks"]
node_path base << "/nodes/local"
role_path base << "/roles"
data_bag_path base << "/data_bags/local"
environment "local"
environment_path base << "/environments"
solo-rbでレシピを流すとき、どうやらフルパスじゃないと動かないようだ。
また、指定したjsonにあるenvironmentを読まないので、ここで指定した。
ここはいい方法を知っている方にご教授頂きたいところ……
追記
@DQNEO さんから解法を教えていただきました。ありがとうございます!
Dockerfileを作成しbuild
Dockerfileにchefリポジトリの内容をADDして叩く設定を書く
Dockerfileがおいてある階層にchefというディレクトリを掘って、そこにchefリポジトリを入れた
RUN yum install -y openssl-devel wget gcc gcc-c++
### CHEF
# install
RUN curl -L http://www.opscode.com/chef/install.sh | bash
# ready
ENV CHEF_REPO /root/chef-repo
WORKDIR /root/dockerbuild
ENV ENV local
ADD chef/cookbooks/ ${CHEF_REPO}/cookbooks
ADD chef/site-cookbooks/ ${CHEF_REPO}/site-cookbooks
ADD chef/nodes/ ${CHEF_REPO}/nodes
ADD chef/environments/ ${CHEF_REPO}/environments
ADD chef/keys/ ${CHEF_REPO}/keys
ADD chef/solo.rb ${CHEF_REPO}/solo.rb
ADD chef/data_bags/ ${CHEF_REPO}/data_bags
ADD chef/roles/ ${CHEF_REPO}/roles
ADD chef/Gemfile ${CHEF_REPO}/Gemfile
#run
RUN export PATH=/opt/chef/embadded/bin:$PATH && cd ${CHEF_REPO} && bundle exec chef-solo -c ${CHEF_REPO}/solo.rb -j ${CHEF_REPO}/nodes/local/application.json
これで叩けるはず
苦労したこと
network周りは基本的にdocker側に抑えられている。僕があたったのは/etc/hostsの問題など
また、chefのレシピに rubyのインストールも入っていたのだが、chef-soloを実行するために前もってrubyのインストールが必要だった。chefがインストールするところにrubyもインストールするというやり方で影響が出ないように無理やり通している。完全にバッドノウハウなのでアドバイス欲しいです
2014/05/16 追記
chefを先にインストールして、中のrubyを使うという解決方法が提示されましたので、記事の内容を編集しました