delirious thoughts

A blog about anything that I can feel delirious from

2012-05-13

capistrano + chef-soloで構成管理する

問題

VMをぽこぽこ作りながらあれこれツールを入れて試してみたりしたいという時に、chefを使って構成管理はしたいけど、chef-serverを入れるのは面倒、というか、構成パッケージの記述・インストールだけできればいいという要求からするとオーバスペックなように感じるのだし、また、ホストの管理にはcapistranoを使っているので、cap実行側のみで処理が完結する方がよいという場合もあろうかと思う。

前提

  • デプロイ先ホストには、公開鍵認証でログインできるものとする(capを使うので)
  • デプロイ先ホストでは、既にgit, chef-soloが使える状態であるものとする(そこまではなんらかの方法でがんばる)

解決案

そこで、chef-soloという、chef-serverなし、スタンドアロンにレシピの実行を行うコマンドをcapで実行するようにしてみる方法を試してみた。例として、GrowthForecastを動かすホストの構成管理を取り上げる。ディレクトリ構成は以下の通り。

├── .carton
├── .git
├── .gitignore
├── .gitmodules
├── Capfile
├── Makefile.PL
├── carton.lock
├── config
│   ├── chef.json
│   ├── deploy.rb
│   └── supervisor.ini
├── local
└── modules
    ├── GrowthForecast
    └── chef-repo

chef-repoを作成、submoduleにする

今回はGrowthForecastに必要なパッケージ(Alien::RRDtoolを入れるのに必要なパッケージ)のみですが、それに限らず、共通に使いまわせるレシピをあれこれと書いていきます。とりあえず、以下のようなrole構成にしました(リストの階層が継承関係を示す)。

  • role[base]: 大元のrole
    • role[supervisor]: supervisor使う用
    • role[perlbrew] (opscodeで共有されているものに手を入れたもの): Perlのプロダクトを動かす用
      • role[growthforecast]: GrowthForecastに特化したrole。今回はこれを使う。

chef-soloの実行

chef-soloを実行するタスクは以下の通り。

namespace :chef do
  task :solo do
    sudo <<-"EOS", :pty => true
      chef-solo -c #{deploy_to}/current/modules/chef-repo/config/solo.rb -j #{deploy_to}/current/config/chef.json
    EOS
  end
end

また、上記コード内のconfig/chef.jsonは以下の通り。

{
    "run_list": [ "role[growthforecast]" ]
}

chef-soloの設定ファイルは、chef-soloリポジトリ内にconfig/solo.rbとして置かれている。

require 'pathname'

basedir = Pathname.new(__FILE__).realpath.dirname.parent

file_cache_path "/tmp/chef-repo"
cookbook_path   (basedir + "cookbooks").to_s
role_path       (basedir + "roles").to_s
  • config/chef.jsonにrun_listを、
  • modules/chef-solo/config/solo.rbにchef-soloの設定を書くようにする

というふたつのルールを導入することで、capのタスクを一般的に使えるようにしている。同様のディレクトリ構成を取ることで、他のプロダクトについても

$ cap chef:solo

と実行することで、config/chef.jsonに書かれた、個々のアプリケーションの構成に必要なroleでもって、かつ、chef-reposに蓄積された共通のレシピを利用して、構成管理を行える。

問題点

  • submoduleにしている関係上、全てのホストにchef-repos一式が存在することになって、冗長な感じがする。
  • capを叩かないと構成変更を更新することができない(自動的に更新したりしない)
  • 実行速度が遅かったりする?

冗長であるとはいえ、複雑なchef-serverを介することなくcap + gitrepositoryだけで管理できるのは、気軽でよい感じがする。

その他

chefには直接関係ないが、以下のようなことも行っている

  • GrowthForecastを直接使うのではなく、そのGitリポジトリをsubmoduleにする。
  • Perlモジュールの管理はcartonで行うことにする。モジュールの増減は、システム側というよりはアプリの都合でころころ変わることになるだろうので、chefでやるよりcartonだとか、rubyでいえばbundlerだとかでやる方がいい感じがする。
    • carton:installというタスクを用意した
  • growthforecastの起動にはsupervisorを用いている。
    • supervisor:(start|stop|restart)などといったタスクを用意した
2012-05-11

PHPことはじめ

最小限度にPHPせたっぷしてみるよ。

httpd

とりあえずhttpd入れる。シンプルに。

$ wget http://ftp.kddilabs.jp/infosystems/apache//httpd/httpd-2.2.22.tar.gz
$ tar zxvf httpd-2.2.22.tar.gz
$ cd httpd-2.2.22
$ ./configure --prefix=$HOME/opt/httpd-2.2.22
$ make && make install

PHP with phpbrew

PHP入れる。適当に最小構成(?)で。

$ git clone https://github.com/c9s/phpbrew.git
$ ln -s $HOME/github/phpbrew/phpbrew $HOME/bin/phpbrew # パスの通ったとこにsymlink
$ phpbrew init

.zshrcに:

source $HOME/.phpbrew/bashrc

5.4.3入れてみる。

$ phpbrew install php-5.4.3 +apxs2=$HOME/opt/httpd-2.2.22/bin/apxs +debug +mysql

使う。

$ phpbrew switch php-5.4.3
$ php -v
PHP 5.4.3 (cli) (built: May 11 2012 18:11:11) (DEBUG)
Copyright (c) 1997-2012 The PHP Group
Zend Engine v2.4.0, Copyright (c) 1998-2012 Zend Technologies

とりあえず最低限度のhttpd.conf

wordpressを適当に落としてきて、その中に適当にconfディレクトリを作って設定ファイルを置きます。

$HOME/tmp/wordpress/conf/php-5.4.3.conf

Listen       8543
DocumentRoot /Users/antipop/tmp/wordpress

LoadModule php5_module modules/libphp5.4.3.so
AddType application/x-httpd-php .php

httpd起動・停止

$ $HOME/opt/httpd-2.2.22/bin/apachectl -f $HOME/tmp/wordpress/conf/php-5.4.3.conf -k start
$ open http://localhost:8543/index.php
$ $HOME/opt/httpd-2.2.22/bin/apachectl -f $HOME/tmp/wordpress/conf/php-5.4.3.conf -k stop

f:id:antipop:20120511192837p:plain

Yay!

PHP5.4以降

今回入れたのは5.4.3なので、実際にはapache2 + mod_phpを使わなくても、-Sオプションで組み込みのhttpdで起動できたりします。

$ php -S localhost:8543
PHP 5.4.3 Development Server started at Fri May 11 19:33:34 2012
Listening on localhost:8543
Document root is /Users/antipop/tmp/wordpress
Press Ctrl-C to quit.

TODO

  • 設定ファイルとか起動まわりとかイケてないので、いい感じにラップしたい
  • 実際のアプリ動かすのにはもうちょっといろいろ必要だったりするだろうので、その辺はおいおい
2012-05-06

Replacing Affiliate ID

Added the tiny JavaScript snippet below to replace Hatena's Amazon affiliate id to my own one:

$(document.body).delegate('a', 'click', function () {
    this.href.match('hatena-hamazou-22') &&
    (this.href = this.href.replace(/hatena\-hamazou\-22/, 'antipop-22'))
});

Does it violate Hatena's reguration?

2012-05-05

Changed IRC Bouncer from Tiarra to ZNC

I changed IRC bouncer from Tiarra to ZNC for the first time since I started using Tiarra about 7 or 8 years ago.

The company I joined the other day heavily utilizes IRC to communicate each other and ircd is provided via SSL connection. So, I made up my mind to do with my IRC environment well.

  • znc runs under daemontools with -f (runs as forward process not daemon) option
  • Failed to resolve domain name; so I put IP address directly instead...
2012-05-01

株式会社paperboy&co.に入社しました

本日5/1付けで株式会社paperboy&co.に入社しました。「技術基盤整備エンジニア」として、paperboy&co.全サービスに関わる技術基盤の整備に携わることになります。

株式会社paperboy&co.は、そのミッション

「便利でリーズナブルなサービスを運営し、より多くの人に情報発信する喜びを提供してまいります。また、ユーザーの自己表現を支援するために、表現者のクリエイティビティを最大に引き出せる、最高の環境を創造してまいります。

とあるように、これまで一貫して、ネットを用いて何事か世の中にもたらしていきたいというひとりひとりの人々に向けて、事業を展開してきました。僕も、同じようにネットを用いていろいろなことをやってきた者として、今後もそのような人々とともに、ネットサービスによって世の中をよりよくしたいと考えます。

というわけでみなさま、今後ともどうぞよろしくお願いいたします。

2012-04-27

Workaround for tmux + pb(copy|paste) to Use pry-clipboard

I tried to use secondlife's pry-clipboard and found it didn't work well for me.

It was due to tmux + pb(paste|copy) problem described at typester's blog post. I just added some more codes into $HOME/.pryrc like below:

begin
  require 'pry-clipboard'

  # aliases
  Pry.config.commands.alias_command 'ch', 'copy-history'
  Pry.config.commands.alias_command 'cr', 'copy-result'

  # workaround for tmux + pb(copy|paste)
  # http://unknownplace.org/memo/2012/03/27/1/
  module Clipboard::Mac
    require 'open3'

    def paste(_ = nil)
      `ssh 127.0.0.1 pbpaste`
    end

    def copy(data)
      Open3.popen3( 'ssh 127.0.0.1 pbcopy' ){ |input,_,_| input << data }
      paste
    end
  end
rescue LoadError => e
  warn "can't load pry-clipboard"
end

It now works, but a bit slow because of executing pb(paste|copy) via SSH. I'll do with the problem more correctly if I feel trouble indeed against it.

2012-04-26

Hair Cut

I had my hair cut today. I went to a hair salon for the first time in recent 6 or 7 years because I had been doing myself with an electric hair clippers. The new hair style looks neat if I do say so myself. The haircutter said to me I should buy a hair wax and arrange my hair every morning, so I bought one for a trial. I don't want to do such a laborious thing at morning.