構成管理ツール比較 chef zero vs ansible

もともとchef serverのよる構成管理を行っていたが、よりシンプルな仕組みにしたかったのでansibleに移行した。ansibleは処理も軽く、コードも構成もシンプルで気に入っていたのだが、難しい処理を扱い始めてくると表現力に物足りなさを感じてしまった。具体的には、素のpythonを書けないことのストレスと、pythonでの構造体操作がperlやrubyに比べるとやりづらいという点。その手間も相まって、Jinja2でのtemplate定義に悩むことが多かった。

構成管理ツールでは、ohaiで取得するような複雑な構造体からデータを取り出して、レシピの中で扱うことになる。pythonの場合、複雑な構造体からデータを取り出しづらいため、Jinja2の中でもif文やloop文を駆使して取り出すことになる。それに加えて変数スコープが厳密なため、更に手間がかかってしまう。こういうことを繰り返していると徐々にansibleの魅力が薄れていき、rubyでさくさく書けるchefに気持ちが戻ってきてしまった。chefは、rubyによる構造体の操作もやりやすいし、業務で使うことも多いし。

ansibleのシンプルな構成に慣れた今となっては、chef server構成をもう1度使う気はしない。そうなると選択肢はchef soloか、chef zeroか。今後のことも考えると新しいものの方がよいだろうから、chef zeroから試してみることにした。chef zeroはchefdkさえ入れれば、すぐに使い出すことが出来る。さすがにchefは散々使ってきたのでインストールさえ出来れば、あとは慣れたもの。test1というサーバで動作確認をしてみる。testというrecipeには適当な処理を作ってみて下さい。

yum install https://packages.chef.io/stable/el/7/chefdk-0.18.26-1.el7.x86_64.rpm
chef generate repo /var/chef
knife cookbook create test
knife role run_list add tests test -z
knife node run_list set test1 role[tests] -z
knife node environment set test1 testing -z
vi /var/chef/cookbooks/test/recipes/default.rb
chef-client -z

これでさくっとレシピを当てることができた。cookbookのuploadとかもないし、こっちの方が楽。ちなみにlocalmodeを意味する-zオプションは~/.chef/knife.rbファイルに『localmode true』と設定しておけば省略可能。以降はこの設定があるものとする。続いて作成したこのレシピを他のサーバに適用する方法を探る。もちろん、このリポジトリを別サーバでcloneしてchef-clientで適用することもできるが、できればansibleのようにリポジトリのあるサーバから、他のサーバへレシピを適用するという方法を取りたい。調べてみるとknife-zeroを使えば、考えているような処理が実現出来そう。早速インストールしてtest2サーバにレシピを当ててみる。

chef gem install knife-zero --no-document
knife zero bootstrap test2
knife node list
knife node run_list set test2 'role[tests]'
knife node environment set test2 testing
knife zero converge host:test2

これでtest2サーバにもさくっとレシピを当てられた。chef serverのノード追加に比べれば、bootstrapするだけなので本当に楽。ただ、再構築時に自動でbootstrapする場合、既に存在する場合はbootstrap処理をスキップしたいので、–no-overwriteというオプションを使いたかったのだが、何故か思うように動作してくれなかった。対象をtest*のようにすれば、test1/2を並列で処理してくれるので、まさにansible相当。これで何の違和感もなく、ansibleからchefへ切り戻すことが出来そうだ。あえて言うならansibleがステップごとに全サーバの適用状態を見せてくれるの対し、chef zeroは単に全てのサーバへの適用を同時に行うだけなので、進捗の把握はansibleの方が遥かにわかりやすい。

ansible感覚でchefを使えるchef zeroは非常に使い易い。リポジトリから全サーバへの適用を可能としているのはknife zeroだから、chef zeroがよかったというよりはknife zeroが素晴らしいということなんだけど。ただ、レシピの適用処理そのものは、chef相当のスピードなのでansibleの方が早いように思う。条件分岐や構造体の操作、templateの書き易さも含めてpythonで全然問題ない人はansibleでよいかもしれない。私は結局書き慣れたchefの方が生産性高いようなので、頑張ってplaybookをrecipeに書き戻します!何日かかるやら。。。

コメントを残す

メールアドレスが公開されることはありません。

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)