chef-clientが怖くて実行できない

まえがき

chef(server)を使用してサーバーの自動セットアップを設定しました。
主な用途はさくらVPSのセットアップ。
私が設定しているroleは次の設定を行います。

今日新しく契約したサーバーで

# chef-client

を実行したところ、sudo のレシピで落ちるわけです。
どうやらchef 11.4.4だとレシピのコンパイルエラーが発生するみたいで、11.4.0だと動くようです。
今回は新規セットアップだから良いけど、レシピやChefのバージョンの兼ね合いで動いたり動かなかったりするのは困りますよね?

テストすればいいじゃん

はいはい。Cucumber-chefやChefSpecでテストを書いて、Vagrantで検証すればいいんでしょ?
でも、本番サーバーと検証サーバーは違いますよね。いくらChefで管理しているからといって、少なからず検証環境と本番環境の内容は異なってくるはずです。

Chefの導入が簡単なケースについて考えた

先日行われたオープンセミナー2013岡山の懇親会で@twingo_bさんとお話したことを思い返しながら、Chefの導入が簡単なケースについて考えてみました。

・サーバーの役割を細分化する

私が設定したように全ての役割を担うサーバーを一つ立てるのではなく、役割を細分化したサーバーを複数立てたほうがChefの動作検証は容易なのではないかと思います。理由は次の通り。

  • Chefのレシピは直列処理なので数が増えるほど失敗する確立が上がる
  • サーバーを一つの役割に特化させれば、設定変更が及ぼす範囲が狭くなる
  • 影響範囲が狭いとVagrantでの検証も容易
・スナップショットに対して検証する
  • 複数のサーバーを立てることができないのであれば、AWS等のスナップショットを取ることができるIaaSを利用する
  • オンプレミスでサーバーを設置する場合は仮想化して容易にスナップショットを取れる環境を構築しておく
  • テストはスナップショットを復元して行う

この2パターンのどちらかを実施すれば、より自信を持ってchef-clientが実行できると思います。
さて、さくらVPSの場合はどうするのが良いんだろうね?

ScientificLinux6.3でUnixBenchをインストールする

ちょっとめんどくさかったのでメモ。

$ sudo yum -y install perl-devel perl-CPAN perl-Time-HiRes
$ wget http://byte-unixbench.googlecode.com/files/unixbench-5.1.2.tar.gz
$ tar zxvf unixbench-5.1.2.tar.gz 
$ cd unixbench-5.1.2
$ vi Makefile

makefileのグラフィック周りをコメントアウトする。diffは次の通り。

46c46
< GRAPHIC_TESTS = defined
---
> # GRAPHIC_TESTS = defined
106,110c106,110
< ifdef GRAPHIC_TESTS
< GRAPHIC_BINS = $(PROGDIR)/ubgears
< else
< GRAPHIC_BINS =
< endif
---
> #ifdef GRAPHIC_TESTS
> #GRAPHIC_BINS = $(PROGDIR)/ubgears
> #else
> #GRAPHIC_BINS =
> #endif
118c118
<       $(PROGDIR)/fstime $(PROGDIR)/whetstone-double $(GRAPHIC_BINS)
---
>       $(PROGDIR)/fstime $(PROGDIR)/whetstone-double 

修正が完了したらmakeしてみる

$ make

実行はRunスクリプトで。

$ ./Run

うまく動けば成功です。

MacOS X + brewでImageMagickとRMagickをインストール

久々にセットアップしたらハマったのでメモ。

$ brew install -f imagemagick --disable-openmp
$ gem install rmagick
.
.
.
checking for Ruby version >= 1.8.5... yes
checking for /usr/local/bin/gcc-4.2... yes
checking for Magick-config... yes
checking for ImageMagick version >= 6.4.9... yes
checking for HDRI disabled version of ImageMagick... yes
/usr/local/bin/Magick-config: line 41: pkg-config: command not found
/usr/local/bin/Magick-config: line 47: pkg-config: command not found
/usr/local/bin/Magick-config: line 50: pkg-config: command not found
/usr/local/bin/Magick-config: line 53: pkg-config: command not found
checking for stdint.h... yes
checking for sys/types.h... yes
checking for wand/MagickWand.h... no

「pkg-config: command not found」が出たらpkg-configを入れる。

$ brew install pkg-config

もう一度RMagickを入れてみる。

$ gem install rmagick
.
.
.
ld: file not found: /usr/local/lib/libltdl.7.dylib for architecture x86_64
collect2: ld returned 1 exit status
make: *** [RMagick2.bundle] Error 1

「ld: file not found: /usr/local/lib/libltdl.7.dylib for architecture x86_64」とか表示されたらlibtoolをインストール。

$ brew install libtool

もう一度インストールしてみる

$ gem install rmagick
Building native extensions.  This could take a while...
Successfully installed rmagick-2.13.2
1 gem installed
Installing ri documentation for rmagick-2.13.2...
Installing RDoc documentation for rmagick-2.13.2...

うまくいきました。

私がRubyをインストールしたとき確認すること

rbenvやrvmでRubyをインストールしたときはirbを起動して次のチェックを行います。

↑キーを押してみる

readlineが正しく組み込まれていないとキーヒストリーが効きません。

require 'openssl'

opensslが正しく組み込まれていないとhttpsで通信する時にハマります。

require 'zlib'

zlibが正しく組み込まれていないと、いたるところでハマります。それはもう困ります。

require 'psych'

psychがrequireできないときはYAMLを扱うことができません。きっとRailsで困るでしょう。


うまく動作していないときはOSに必要なライブラリをインストールしてRubyの再コンパイルを行います。
他にも私はこんなチェックをしてるって人がいれば教えて下さい。

東京Ruby会議10に参加してきた

2013年1月13日〜14日に開催された東京Ruby会議10に参加してきました。
場所は千葉市美浜文化ホール。中国地方に住んでると、東京、埼玉、千葉、神奈川への出張はまとめて「東京に行ってくる」って言うしあんまり細かいことは気にしません!

以下は気になったセッションのメモです。

Rubyと過ごした半年間(井原正博氏)

クックパッド株式会社で新しいサービスを立ち上げた時のお話でした。初めてのRailsプロジェクトに挑むにあたりCode SchoolRailsCastsで学習をしたそうです。
一人でCIやPull Requestを送ったり「Rubyの世界で良き住人になりたい」という気持ちでコードを書いているそうです。

やさしいRails勉強会@東京のつづけ方(takkanm氏)

Rails勉強会@東京という勉強会を継続してきた経験を聞かせて頂きました。私も岡山Ruby/Ruby on Rails勉強会を運営していますが「続けること自体が目的になっている」と感じる時が時々あります。もっと緩い集まりがしたいのですが、車社会の田舎では都市部のようにビール片手に平日の夜モクモク会の開催は難しいです。他の地方都市の人達はどうやって勉強会を開くモチベーションを維持してるのかな?
takkanmさんはテーマはその日に決めて、そのテーマについてみんなで話し合っているそうです。準備する側も手間がかからないし、情報が欲しくてやってきている参加者も的確に欲しい情報が得られて非常に良い方法だと思いました。

プログラミング未経験なんて怖くない!(田垣亜季氏)

永和システムマネジメントに入社したプログラミング未経験者がどうやって日々を乗り越えていっているかというお話。「コピペできそうな箇所を探す」っていうのはあまり公に言うことはないけど、まぁ、みんなやってますよね。参考にしたソースをしっかり理解出来ればいいのではないでしょうか。他のプロジェクトのソースコードも読むようにしているのは素晴らしいと思いました。

The Everything Machine(中村 涼氏)

プログラミング初心者は何をやればいいのか分からない。そんな人は日々の雑多な仕事をRubyにさせてみてはどうかというお話。赤外線コントロールを利用して起床時間に部屋中の電気を付けたり、夜帰宅したら寒いので位置情報を取得してエアコンを操作したり、新作アニメのチェックをするためにしょぼいカレンダーからTV番組表を取得したり様々なRubyの使い方を提示していました。Webサービス以外にもちょっとしたことで使うことができるのがRubyのいいところですよね。

Distributed Build with Jenkins(西川茂伸氏)

札幌Ruby会議でもお会いした西川さんのJenkinsのお話。私も仕事ではJenkinsを使って分散テストを行なっています。Jenkinsは比較的簡単に分散処理ができるので便利ですね。Jobにラベルをつけることで環境ごとに分けてビルドできるのは参考になりました。

Padrino in Production(塩谷 啓氏)

Padrino(ぱっどりーの)について実際のサービスの事例をあげて説明してくださいました。「SinatraでDBを使うならRailsでいいじゃん」と個人的には思っていたのですがサブアプリを作ることができるのが便利そうですね。用途が合えば使ってみたいと思いました。

Ruby会議

†練馬で開催されたThe Ruby会議の闇が再び...†

軽量Rubyで実現する柔軟なルータ -SEILへの軽量Rubyの組み込み-(曽我部 崇氏)

IIJではルータも製作しているらしいです。そのルータの中にmRubyを入れてみたお話でした。
アプリケーションエンジニアは「組込は自分とは関係ない」と思いがちだけどapacheのmod_mrubyやiOSのアプリが開発できるMobiRubyは使ってみて欲しいとのことでした。

Fluentd: The ruby-based middleware across the world(田籠聡氏)

様々なログを集約、管理することができるFluentdというソフトウェアのお話でした。Pluginが豊富で保存と分析が同時に出来るのがメリットだそうです。nginxやrailsRDBMSから出てくる大量のログをうまく活用できず困ってたのでFluentdは段階的にでも導入してみようと思いました。

Sole Rubyist's Fight(yaotti)

Qiita Kobitoの開発者のお話。一人ぼっちだと技術情報が入ってこない、ディスカッションができない、コードレビューできない。ではやる気で解決できるかというとムラがあるのでやる気は信用できない。では、勝手に意識が高まっていく仕組みがあるとどうか。

Codetriage.com

http://www.codetriage.com
登録してるGithubプロジェクトのissueが飛んでくる。私も登録してみました。

Starseeker.so

http://starseeker.so
フォローしてるプログラマがつけたスターの情報が飛んでくる。

こういったサービスを使ってモチベーションを維持しているそうです。

ブログのススメ(前島真一氏)

おもしろwebサービス開発日記」のwillnetさんの発表でした。
日本語の技術系ブログが少ない。ニッチなキーワードをぐぐってもひっかからない。日本語でググりたい。
ひょっとしてBlogを更新するエネルギーがTwitterにそそがれているのではという興味深い内容。
Blogを書くと知識的にもう一歩を踏み出せるし、あやふやなところをはっきりさせる事ができる。また、わからなかったことをBlogに書くとアドバイスが貰え知り合いも増え、知識的&社会的にメリットが大きい。
モチベーションを保つには、書きかけの内容でもうpすることが大切。それが嫌であればメモ用blogを作るのも良いとのこと。
StatsWidgetというiPhoneアプリを使ってアクセス数をチェックする楽しみもあるとのことでした。

大雪で中止

2日目は関東では記録的な雪が降ったため14時過ぎで中断となってしまいました。残念でしたが参加者の安全を第一に考えた主催者の判断は正しいと思います。

次はThe Ruby会議でお会いしましょう!

Bluetoothスピーカーでプチノイズを無くす方法

自宅でmacbookを使うときはBluetoothスピーカーで音楽を聞いています。

Creative T12 Wireless デスクトップ ステレオワイヤレス スピーカーシステム Bluetooth SP-T12W

Creative T12 Wireless デスクトップ ステレオワイヤレス スピーカーシステム Bluetooth SP-T12W

概ね満足していたのですが時々聞こえるプチノイズが気になっていました。
このノイズはBluetoothAudioAgentの設定を変更すると軽減できるようです。

Pref Setterを入手

次のページでPref Setterというplistファイルを調整することができるソフトを入手しインストールします。
http://www.nightproductions.net/prefsetter.html

Bluetoothをoffにする

画面右上のメニューから「Bluetoothを切にする」を選択します。

Pref SetterでBluetoothAudioAgentを設定

検索窓にBluetoothAudioAgentと入力して設定を開きます。
Apple Bitpool Min とApple Initial Bitpool を40に設定します。

設定が完了したら⌘+qで設定を保存して終了しましょう。

再接続

Bluetoothスピーカーを再接続してみましょう。プチノイズが消えたらラッキーです。

acts_as_paranoid + ユニークインデックス

Railsで論理削除を行うときはacts_as_paranoidを使用するのが一般的です。
Model側でvalidates_uniqueness_of_without_deletedを使用するとユニーク制限をかけることができますが、DB側でユニーク制限をかけようとすると問題が発生します。

  # schema.rb
  create_table "customers", :force => true do |t|
    t.string   "code", :null => false
    t.datetime "deleted_at"
    t.datetime "created_at"
    t.datetime "updated_at"
  end
  add_index "customers", ["code", "deleted_at"], :name => "customers_idx01", :unique => true

一見正しそうですがnullはユニーク制限の対象外となり次のようなレコードが入ってしまいます。

|code|deleted_at|
|001| NULL|
|001| NULL|

こういう時はindexにwhere条件を指定して直接DBに設定しましょう。

class AddIndexCodeToCustomers < ActiveRecord::Migration
  def self.up
    sql = 'create unique index customers_idx01 on customers (code) where deleted_at is null;'
    ActiveRecord::Base.connection.execute(sql)
  end

  def self.down
    remove_index :customers, :name => :customers_idx01
  end
end

procedureを使用してDBの操作を行うとRailsのModelを経由しないのでバリデーションが行われません。そういった場合はDB側でもチェックを行いたいですね。