Tags

By year

  1. 2014 (28)

Chef とか Puppet から Docker をイジれるようなので試してみる

Chef Puppet Docker AWS

Posted on May 4


はじめに

みんな大好き、私も大好き、Docker のドキュメントを見ていたら(読んでたわけではない)ChefPuppet から直接 Docker をイジれるようなので試してみる。



参考

Docker のドキュメントをそのまま参考にする。

以下は各ソースコード。

既に chef-docker については下記にて紹介されている。

また、ChefBerkshelf の使い方については下記が参考になった。

以前に自分でも Berkshelf について書いたが、書いた当時よりも Berkshelf のバージョンが上がっていたりして書式等も変わっており殆ど役に立たなかったので改めて Berkshelf の書き方については自分なりに纏めてみたいと思う。



Chef de Docker

試した環境

  • EC2 インスタンス
  • t1.micro
  • CentOS

準備(1)

Chef が使える環境を用意する。

上の記事で利用した環境をそのまま利用するが Chef そのものに関しては下記のように Omnibus インストーラーでインストールした。

curl -L https://www.opscode.com/chef/install.sh | bash

また、knife-soloberkshelf については以下のようにインストールした。

/opt/chef/embedded/bin/gem install knife-solo --no-ri --no-rdoc -V
/opt/chef/embedded/bin/gem install berkshelf --no-ri --no-rdoc -V

berkshelf のインストール途中にコンパイルのプロセスが kill されてしまう現象が発生した。(t1.micro で十分なメモリと swap 領域が不足していた為かと思われる)


準備(2)

ひと通り役者が揃ったところで Chef の場合はもうひと手間。Chef のリポジトリを作成する。

knife solo init chef-repo-test

次に Berkshelf を利用して dockerCookbook を取得する。

cd chef-repo-test
rm -rf cookbooks
vim Berksfile

Berksfile は以下のように記述する。

source "https://api.berkshelf.com/"

cookbook 'docker'

記述したら以下を実行する。今回は Chef に同梱された Ruby を利用している為、/opt/chef/embedded/bin/berks となっているが環境に応じて読み替えること。

/opt/chef/embedded/bin/berks vendor cookbooks

実行後、cookbooks 以下には docker に関係する cookbook がインストールされている。


あともうひと手間

上記の状態で docker パッケージのインストールを行うことは可能だが、別途 cookbook を作ってみたいので以下のようにして cookbook を作成する。

cd /root/chef-repo-test/site-cookbooks
/opt/chef/embedded/bin/berks cookbook docker-test .

簡単なレシピを以下のように書く。

今回は chef-solo を使って cookbook を適用するので solo.rb を以下のように用意。

file_cache_path "/tmp/chef-solo"
cookbook_path ["/root/chef-repo-test/cookbooks", "/root/chef-repo-test/site-cookbooks"]
role_path "/root/chef-repo-test/roles"
log_level :info

そして適用先は localhost ということで nodes/localhost.json は以下のように用意。

{
  "run_list": [
    "recipe[docker]",
    "recipe[docker-test]"
  ]
}

プロビジョニング、そろそろいきましょか

諸々の準備が整ったところで chef-solo を実行して cookbook を適用する。

cd /root/chef-repo-test
chef-solo -c solo.rb -j nodes/localhost.json

おお、やってますな。一発目はなぜかコケてしまったが改めて chef-solo を実行すると…以下のようなログを出力して正常に終了した。

ちなみに docker ps -a とか docker images すると…

ファンタスティック!


ということで…

Chef の実行環境を用意するのに若干手間取って(Berkshelf の書き方とか使い方とかで)しまったが、簡単にレシピから Dokcer を操作することが出来た(出来そう)。また、CookbookREADME を見ると docker pulldocker run 以外のことも色々と出来そうなので試してみたい。

尚、Chef そのものではないが、以下の点には注意する。

  • Berkshelf のインストール(意外に負荷が高い)
  • Berkshelf の使い方(install ではなくて vendor を使う)


Puppet de Docker

試した環境

  • EC2 インスタンス
  • t1.micro
  • CentOS

準備

Puppet が使える環境を用意する。

上の記事で利用した環境をそのまま利用する。また、合わせてモジュールもインストールする。

puppet module install garethr/docker

インストールされるモジュールは下記のモジュール。


マニフェスト

以下のようなマニフェストを書いて /etc/puppet/manifests/site.pp に保存する。

チョー簡単。

include 'docker'

Docker のパッケージをインストールする。

docker::image { $IMAGES :
  ensure => 'present',
}

上記で docker pull $IMAGE(S) が実行される。

docker::run { $CONTAINER :
  image   => 'centos',
  command => 'echo "a"',
}

上記で docker run -d centos echo "a" が実行される。


プロビジョニング

puppet apply でマニフェストを適用してみる。尚、上記のマニフェスト一発目だとパッケージのインストールだけで終了してしまうので注意。もう一度、マニフェストを適用するか、パッケージの終了後に imagerun を実行すると Warning 等が出ない。

cd /etc/puppet
puppet apply manifests/site.pp

まずはパッケージのインストール。

次に docker pulldocker run を一緒に…。

ついでに docker ps -adocker images で確認してみる。


ということで…

マニフェストの書き方を勉強する必要があるが、Chef と同様に Puppet から簡単に Docker コンテナ操作が出来そう。



さいごに

駆け足で ChefPuppet のレシピやマニフェストを使って Docker の操作を体験した。どちらもコミュニティが提供している CookbookModule を利用することで簡単に操作は出来そうだ。最低限の利用(pull して run)程度であればどっちも同じだと思われるのでどっちを使うかはお好みで。

但し、chef-docker の方が imagecontainer の操作等が充実している印象を受けた。

また、上記にてプライベートリポジトリから pull して run して変更分を commit してという流れが書かれていて実際の利用のシチュエーションをイメージ出来ると思われる。




2014 かっぱのほげふが