LoginSignup
18
19

More than 5 years have passed since last update.

Dockerfileでchef-soloコマンドを叩いてコンテナにchefを流す

Last updated at Posted at 2014-05-16

今までのサーバ構成を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コマンドで流していた設定

.chef/knife.rb
cookbook_path             ["cookbooks", "site-cookbooks"]
node_path                 "nodes/local"
role_path                 "roles"
data_bag_path             "data_bags/local"

knife[:berkshelf_path] =  "cookbooks"
nodes/local/application.json
{
    "environment": "local",
    "run_list": [
        "recipe[usercreate::admin]",
        "role[application]"
    ]
}
knife solo cook root@hoge.example.co.jp nodes/local/application.json

大体こんな風に叩く。これにあわせてsolo.rbを作る

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を使うという解決方法が提示されましたので、記事の内容を編集しました

18
19
7

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
18
19