• Chef-Soloから卒業、chefのlocalmodeをつかってみた

    こんにちは。小宮です。 事の経緯 お急ぎの場合は飛ばして大丈夫です。 Chef-Soloがdeprecated(非推奨)とかで開発元からchef-zero(localmode)をつかうよう周知されたのが半年くらい前でしょうか。 当時はどうしたらええんやと色々比較してみたりしたあげく時が経ってとうとう検証することに。 数年で入れ替わるのではなく長く続くことが前提だとコストをかけても技術的負債を残したくない事情があるケースもあるようで。 個人的には正直コストをかけて移行するかどうかは微妙なところで、soloがすぐ無くなるみたいな話ではない気がしてます。 世の中的にはcookpadさんからitamaeとか出てたりAnsibleが流行ったりなど。 Ansibleはnot_ifに相当する機能を持たせようとするとドライランできなくなるみたいなのが致命的らしいと聞いたけど、 そもそもYAMLに書きなおすコストがあり得ないので試してないです。 itamaeも気になってたんですがroleとenvironmentをattributeになおす手間がありそうでした。 roleもenvironment数もそれなりの規模で配列attributeを優先順位で意図的にdeepmergeしたり初期化するようなことをしてるし その修正はだいぶヘビーな気が。あとdata_bags機能がないのも超困る。他に移行するにはchefの沼にだいぶつかりこんでいたようです。。 あとChef-Serverはコミュニティ版はHA機能がNGだときいたりしました。 現実的にはlocalmodeだろうということでそんな感じでいつもどおり右往左往で検証してみましたので備忘録です。 chefって情報は結構あるんだけどモヒカンの人(技術レベルの高すぎる人)ばっかりなため初心者がどこで惑うか想像つかないのか肝心なところが分かりづらくて 結局念入りにヘルプを眺めたりググりまくって試しまくるなどというのが多いような。。 使い方も多くてそれぞれの環境が違って色々まざると発狂ちょっとこんがらがりやすいかもしれません。 後日、分かりやすい素敵なチャートをみかけたので追記しておきます。 あなたに合ったChefはどれ? 〜 おすすめ構成確認チャート #getchef - クリエーションライン株式会社 普及と発展には分かりやすさというのはとても重要かなと思います。こんな感じのやってみた記事が多少それに寄与するといいなーと思います。 参考情報 まあ色々みてみたんで参考情報からご紹介いたしましょう。パターン分けておきます。 Chef-Zeroの仕組みとか機能とかの話は別途ググっていただくと分かりやすいと思うんですが、、 インメモリChef-Serverとローカルモードの違いがありまして、私がやりたいのはローカルモードのほうです。 インメモリChef-Serverとして使う場合は Chef-Zeroを起動してcookbookとroleとenvironmentとdata_bagsのデータなんかをknifeコマンドで登録しておく必要があるようです。 インメモリなので、Chef-Zeroを停止すると登録したデータは消えます。 なので手間を考えるとChef-Serverへの移行を見据えて1次的にとかchef-shellでとれる情報をみたい時に使うという用途になるのかなーと思いました。 ブラウザからアクセスすると登録したjson情報などが見えるのはまあ便利と言えば便利かもしれないけどgitでみればいいやんというレベルだったかなあ。 ローカルモードとして使う場合は、コマンド実行時だけChef-Zeroが内部的に起動してレシピ適用終わったら落ちるようで、 knife.rbに書いといたChef-Repoのパスを勝手に見てくれて余計な手間はなさそうでした。 ・Chef-ZeroをインメモリChef-Serverとして動かしたいタイプ Amazon Linuxで簡易Chef Server(chef-zero)を動かしてみた | Developers.IO CentOSにchef-zeroのインストール - clavierの日記 chef-zero を構築して knife-xenserver と連携してみた一部始終 - ようへいの日々精進 XP Ruby - knife zero bootstrap で リモートに chef がインストールできない - Qiita 軽量簡易Chef Server「chef-zero」を使ってみよう #opschef_ja « CREATIONLINE, INC.
    ...
  • chefのruby_blockを用いて環境変数を再読み込み

    こんにちは。小宮です。 chefでいろいろ自動化していくうちに、途中で変更された値というか変数を使いたい場合が出てくるのかなと思います。 1回目は上手くいかないけど2回目は上手くいくというような冪等にならない怪現象を解決したいと思う時がそのうちきます。 そんなとき、、 ohaiで値がとれる場合はそれを使いなければohaiのプラグインを自作するか、 ruby_blockを書いたり、notifiesで:immediatelyとかつけて呼び出すって感じの対応が必要になったりします。。 何言ってっかわかんねえ!と思うかたは以下のリンク先にchefの実行順序に関して書かれているので見てみるといい気がします。 Chefのレシピは上から下に実行されるという誤解 | Engine Yard Blog JP これだけだと不親切かもしれないので以下ご参考まで。 template "/etc/profile.d/rbenv.sh" do not_if "grep rbenv /etc/profile.d/rbenv.sh" source "rbenv.sh.erb" action :create notifies :create, "ruby_block[initialize_rbenv]", :immediately end ruby_block "initialize_rbenv" do block do ENV['RBENV_ROOT'] = node[:rbenv][:root] ENV['PATH'] = "#{node[:rbenv][:root]}/bin:#{node[:rbenv][:root]}/shims:#{node[:ruby_build][:bin_path]}:#{ENV['PATH']}" end action :nothing end 少し解説しますと、 chefではレシピ中での改変を前提とした処理はくふうがひつようで、 rubyで書かれた処理はconvergeの手前で行われてしまってその時点では途中の改変を認識できないようです。(だから2回目に成功する) ruby_blockリソースはconvergeのタイミングと同じ時に動くようです。 特定のリソースの処理が行われるときだけ実行したい場合にはそのリソースのnotifiesにはタイミングを指定できます。(:immediatelyとか:delayedとかあるらしい) この場合、ruby_blockリソースのactionにはnothingを指定しておき、templateリソースでprofileの設定を置いて:immediatelyをnotifiesに指定することで ただちに変数の再読み込みが実行される、という話になります。(レシピを分けてる場合にnotifiesつかうと-oで個別実行しにくくはなりそう。)
    ...
  • chef-soloのレシピのカスタマイズの記録

    こんにちは。小宮です。 おかげ様でカスタマイズする機会があったため、その一部を引用してご紹介いたします。 基本的なことなどは、 以下のリンクや「入門chef-solo」とその落ち穂拾いもご覧になるとよいと思います。 Chef Soloと Knife Soloでの ニコニコサーバー構築 (2) 〜導入編〜:dwango エンジニア ブロマガ chef-solo - Chefを読んで実行するための全知識 - Qiita DevOpsを実現するChef活用テクニック // Speaker Deck あとGW前後にchef実践入門的な書籍をエンジンヤード(chefが出る前から8年くらい使ってる会社)の御方が出されるそうで大変期待してるところです。 chefのnode、role、enviroment、attribute、data_bagsの解説になります。 この記事は基本の説明とカスタマイズの為の簡単な情報提供になるかと思います。 以下に記載しているレシピを実際ためした環境はCentOS6.4のみで、申し訳ありませんが異なる環境での動作保障はできないです。 異なるOS間の動作保障するような汎用的(複雑)なレシピはopscodeコミュニティの☆がいっぱいついてるクックブックを使えばいいらしいです。 (余計なものを極力入れないとか既存の環境または手順をレシピ化するという需要には不向きかとは思います。) chefリポジトリ直下のディレクトリの解説を以下に記します。 cookbooks :サードパーティのクックブック置き場 data_bags :data_bagsのデータ置き場 environments :環境設定ファイル置き場 nodes :ノード(ホスト・各サーバ)設定ファイル置き場 roles :役割設定ファイル置き場 site-cookbooks :自作クックブック置き場(クックブックはレシピ、配布ファイル等を含む) 各用語を以下に軽く解説します。 ・ohai chefに同梱されているレシピを適用するホストの情報を取得するコマンドです。 ohaiで取得した値に基づいてattributeを定義することが可能です。 たとえばOS搭載メモリやCPUコア数に応じて設定値を変えたい場合やホスト名や IPアドレスなど固有の情報を設定ファイルに載せたい場合などに利用すると便利です。 ・node nodesディレクトリ直下にhostname.jsonまたはipaddress.jsonというファイルを置き、 そこにそのサーバ固有の設定値(attribure)や割り当てる役割(role)を定義します。
    ...
  • redisのソースインストール(chef-solo)

    こんにちは。opsのほうの小宮です。 redisのソースインストールをご依頼いただきCHEF-SOLOったのでその記録をのこしておきます。 ★要件 バージョンについては2.8.4でお願いします。(2014/1時点で最新のソース) ★以下作業 ・rpmで入るバージョンの確認(※同環境のサーバでyumで確認) redis.x86_64 0:2.4.10-1.el6 ※要件に合わないためソースインストールする必要がある ・chef-soloの下準備 [shell]$ ssh-copy-id -i ~/.ssh/id_dsa.pub server2 $ ssh-copy-id -i ~/.ssh/id_dsa.pub server1 $ knife solo prepare server1 $ knife solo prepare server2[/shell] ・role作成 [shell]$ vi roles/rankingAPI.json { “name”:“rankingAPI”, “chef_type”: “role”, “json_class”:“Chef::Role”, “default_attributes”:{ “base_setting”: { “swappiness”: “0”, “tcp_tw_reuse”: “0”, “tcp_tw_recycle”: “0”, “tcp_fin_timeout”: “10”, “tcp_max_syn_backlog”: “8192”, “somaxconn”: “8192”, “ntpserver1”: “ntp.
    ...
  • Chefで既存手順のレシピを書く1(初期設定)

    こんにちは。プラットフォームの小宮です。 前回はChefでレシピを書く前のroleやdata_bagsなどの環境定義について書きました。 今回は既存手順のレシピ化ということで淡々と地味に書いていきたいと思います。 注意: scriptリソースを使うときはnot_ifまたはonly_ifを必ず書くこと(複数回実行されないように) bash内でcdを書き忘れるとtarの解凍先パスがその後のコマンドの指定と一致しなくなるので注意 scriptリソースを使うとエラーがまともに出ないので自分でコマンドをたたいて状況を確認する必要がある リソースのマニュアルを熟読推奨。 クックブック名とその内容は以下の通り。 base_setting 初期設定など ★今回ご紹介するレシピはこちらのみです。 login-users ログインユーザ作成 httpd web関連設定 mysqld db関連設定 munin 統計グラフ設定 zabbix 監視設定 レシピを書く ・base_settingのレシピを書く 使いまわしやすさを意識した結果細かく分割して書くことにしました。 ☆バックアップディレクトリ作成レシピ [shell]# cd site-cookbooks/base_setting/recipes/ # for i in bkup_dir hosts sysctl disable ntpd ntpdate mail logrotate ;do touch $i.rb ;done # vi bkup_dir.rb directory ‘/etc/.backup/’ do owner ‘root’ group ‘root’ mode ‘0755’ action :create end[/shell]
    ...