Glide Note

glidenote's blog

Emacs勉強会でLTしてきた #Agile渋谷

最近坊主にして杉作J太郎クリソツのantipopさんに そそのかされて参加したのが運の尽き…
著者の大竹智也さんをはじめ、参加者全員から「Emacs実践入門」で尻を1万回スパンキングされる勉強会でした。


リチャードストールマンにクリソツのAV男優さんいますよねー」とか「あのAV男優さん出てくるとEmacs使いたくなりますよねー」とかで会場が盛り上がっててEmacs使いの狂気を感じた。
vim使いの私とは相容れない水と油、もしくは水とローションといった感じだった。

今回paperboy.elのlogoも作ったのでステッカーにしようかと思います。

Stowを利用してソースからビルドしたソフトウェアを効率的に管理する

同じチームの@lamanotramaさんと話していて、 これから一部パッケージはRPMを作らず、@hirose31さんの方式 (ソースから自前ビルドしたソフトウエアの効率的な管理方法 - (ひ)メモ) を採用するとのことで、「なるほど!!」と思いながら上記記事のはてブコメント を眺めてたらStowというものを発見。

早速検証してみた。検証環境はCentOS 6.3です。

Stowの概要

  • Perlで書かれている
  • ソースからビルドしたソフトウェアを管理するソフト
  • 任意のディレクトリ/usr/local/stowなどにパッケージ一式をインストール
  • インストールしたパッケージから/usr/lib/{bin,lib,share}にリンクを貼って利用。
  • バージョンの切り替えはリンク張り直しで行う(ファイルの上書きはしない)
  • zsh-4.3.17zsh-5.0.0などバージョンの切り替えが容易になる(同じようなソフトのpacoと違う点)

Stowの導入

epelにあるのでyumで導入。cpanmでも入ります。

1
sudo yum -y install stow

Stow用のディレクトリを用意

パッケージインストール用のディレクトリを作成

1
sudo mkdir -p /user/local/stow/

Stowを利用してzsh-5.0.0を導入

試しにzsh-5.0.0を利用してみる。

configureのときに--prefix=/usr/local/stow/zsh-5.0.0といった感じで、 --prefix=/usr/local/stow/{name}-{version}というような感じでインストール先を指定し、 /usr/local/stow/以下に一式インストールする。これにより/usr/local/{bin,lib,share}以下が汚れずに済むし、管理も楽になる。

1
2
3
4
5
6
7
8
mkdir ~/src
cd ~/src
curl -Lo zsh-5.0.0.tar.gz http://sourceforge.net/projects/zsh/files/zsh/5.0.0/zsh-5.0.0.tar.gz/download
tar zxvf zsh-5.0.0.tar.gz
cd zsh-5.0.0
./configure --prefix=/usr/local/stow/zsh-5.0.0
make
sudo make install

stowコマンドを用いて、/usr/local/{bin,lib,share}にsymlinkを貼る。 -v,--verboseをつけると詳細が見えるので良い感じです。

1
2
cd /usr/local/stow
sudo stow -v zsh-5.0.0

symlinkを貼ろうとした際に既にファイルが存在すると下記のようなエラーが発生する。

1
2
3
4
5
[akira@dev001] $ sudo stow
WARNING! stowing bin would cause conflicts:
  * existing target is neither a link nor a directory: zsh
  * existing target is neither a link nor a directory: zsh-5.0.0
All operations aborted.

既存ファイルの待避。マニュアルは入らないから一式削除

1
2
3
4
5
sudo mv /usr/local/bin/zsh{,.org}
sudo mv /usr/local/bin/zsh-5.0.0{,.org}
sudo mv /usr/local/share/zsh{,.org}
sudo mv /usr/local/lib/zsh{,.org}
sudo rm -rf  /usr/local/share/man/man1/zsh*

再度stowコマンドを実行。

1
2
cd /usr/local/stow
sudo stow -v zsh-5.0.0

下記のような形でlinkが貼られる。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
LINK: bin/zsh-5.0.0 => ../stow/zsh-5.0.0/bin/zsh-5.0.0
LINK: bin/zsh => ../stow/zsh-5.0.0/bin/zsh
LINK: share/man/man1/zshtcpsys.1 => ../../../stow/zsh-5.0.0/share/man/man1/zshtcpsys.1
LINK: share/man/man1/zshparam.1 => ../../../stow/zsh-5.0.0/share/man/man1/zshparam.1
LINK: share/man/man1/zshcontrib.1 => ../../../stow/zsh-5.0.0/share/man/man1/zshcontrib.1
LINK: share/man/man1/zshoptions.1 => ../../../stow/zsh-5.0.0/share/man/man1/zshoptions.1
LINK: share/man/man1/zsh.1 => ../../../stow/zsh-5.0.0/share/man/man1/zsh.1
LINK: share/man/man1/zshroadmap.1 => ../../../stow/zsh-5.0.0/share/man/man1/zshroadmap.1
LINK: share/man/man1/zshexpn.1 => ../../../stow/zsh-5.0.0/share/man/man1/zshexpn.1
LINK: share/man/man1/zshmisc.1 => ../../../stow/zsh-5.0.0/share/man/man1/zshmisc.1
LINK: share/man/man1/zshzle.1 => ../../../stow/zsh-5.0.0/share/man/man1/zshzle.1
LINK: share/man/man1/zshbuiltins.1 => ../../../stow/zsh-5.0.0/share/man/man1/zshbuiltins.1
LINK: share/man/man1/zshcalsys.1 => ../../../stow/zsh-5.0.0/share/man/man1/zshcalsys.1
LINK: share/man/man1/zshmodules.1 => ../../../stow/zsh-5.0.0/share/man/man1/zshmodules.1
LINK: share/man/man1/zshcompctl.1 => ../../../stow/zsh-5.0.0/share/man/man1/zshcompctl.1
LINK: share/man/man1/zshzftpsys.1 => ../../../stow/zsh-5.0.0/share/man/man1/zshzftpsys.1
LINK: share/man/man1/zshcompsys.1 => ../../../stow/zsh-5.0.0/share/man/man1/zshcompsys.1
LINK: share/man/man1/zshall.1 => ../../../stow/zsh-5.0.0/share/man/man1/zshall.1
LINK: share/man/man1/zshcompwid.1 => ../../../stow/zsh-5.0.0/share/man/man1/zshcompwid.1
LINK: share/zsh => ../stow/zsh-5.0.0/share/zsh
LINK: lib/zsh => ../stow/zsh-5.0.0/lib/zsh

ls/usr/local/{bin,lib,share}を確認

1
2
3
4
5
6
7
8
9
10
11
12
13
[akira@dev001] $ ll /usr/local/bin/ | grep zsh
lrwxrwxrwx 1 root root       25 Aug  9 12:42 zsh -> ../stow/zsh-5.0.0/bin/zsh
lrwxrwxrwx 1 root root       31 Aug  9 12:42 zsh-5.0.0 -> ../stow/zsh-5.0.0/bin/zsh-5.0.0
-rwxr-xr-x 1 root root   690064 Jul 23 11:00 zsh-5.0.0.org
-rwxr-xr-x 1 root root   687144 Mar 29 13:06 zsh.old

[akira@dev001] $ ll /usr/local/lib/ | grep zsh
lrwxrwxrwx 1 root root   25 Aug  9 12:42 zsh -> ../stow/zsh-5.0.0/lib/zsh
drwxr-xr-x 4 root root 4096 Jul 23 11:00 zsh.org

[akira@dev001] $ ll /usr/local/share | grep zsh
lrwxrwxrwx   1 root root   27 Aug  9 12:42 zsh -> ../stow/zsh-5.0.0/share/zsh
drwxr-xr-x   5 root root 4096 Jul 23 11:00 zsh.dist

Stowを利用してzshバージョンの切り替え

zsh-4.3.17を導入して、zsh-5.0.0から切り替えをしてみる。

1
2
3
4
5
6
7
cd ~/src
curl -Lo zsh-4.3.17.tar.gz http://sourceforge.net/projects/zsh/files/zsh-dev/4.3.17/zsh-4.3.17.tar.gz/download
tar zxvf zsh-4.3.17.tar.gz
cd zsh-4.3.17
./configure --prefix=/usr/local/stow/zsh-4.3.17
make
sudo make install

この状態で/usr/local/stow配下に2つのバージョンがある。

1
2
3
4
[akira@dev001] $ ll /usr/local/stow
total 8
drwxr-xr-x 5 root root 4096 Aug  9 12:12 zsh-4.3.17
drwxr-xr-x 5 root root 4096 Aug  9 11:27 zsh-5.0.0

zsh-5.0.0へのリンクを削除(stow -D)して、zsh-4.3.17にリンクを貼る。

1
2
3
cd /usr/local/stow/
sudo stow -Dv zsh-5.0.0
sudo stow -v zsh-4.3.17
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
[akira@dev001] $ sudo stow -v zsh-4.3.17
LINK: bin/zsh-4.3.17 => ../stow/zsh-4.3.17/bin/zsh-4.3.17
LINK: bin/zsh => ../stow/zsh-4.3.17/bin/zsh
LINK: share/man/man1/zshtcpsys.1 => ../../../stow/zsh-4.3.17/share/man/man1/zshtcpsys.1
LINK: share/man/man1/zshparam.1 => ../../../stow/zsh-4.3.17/share/man/man1/zshparam.1
LINK: share/man/man1/zshcontrib.1 => ../../../stow/zsh-4.3.17/share/man/man1/zshcontrib.1
LINK: share/man/man1/zshoptions.1 => ../../../stow/zsh-4.3.17/share/man/man1/zshoptions.1
LINK: share/man/man1/zsh.1 => ../../../stow/zsh-4.3.17/share/man/man1/zsh.1
LINK: share/man/man1/zshroadmap.1 => ../../../stow/zsh-4.3.17/share/man/man1/zshroadmap.1
LINK: share/man/man1/zshexpn.1 => ../../../stow/zsh-4.3.17/share/man/man1/zshexpn.1
LINK: share/man/man1/zshmisc.1 => ../../../stow/zsh-4.3.17/share/man/man1/zshmisc.1
LINK: share/man/man1/zshzle.1 => ../../../stow/zsh-4.3.17/share/man/man1/zshzle.1
LINK: share/man/man1/zshbuiltins.1 => ../../../stow/zsh-4.3.17/share/man/man1/zshbuiltins.1
LINK: share/man/man1/zshcalsys.1 => ../../../stow/zsh-4.3.17/share/man/man1/zshcalsys.1
LINK: share/man/man1/zshmodules.1 => ../../../stow/zsh-4.3.17/share/man/man1/zshmodules.1
LINK: share/man/man1/zshcompctl.1 => ../../../stow/zsh-4.3.17/share/man/man1/zshcompctl.1
LINK: share/man/man1/zshzftpsys.1 => ../../../stow/zsh-4.3.17/share/man/man1/zshzftpsys.1
LINK: share/man/man1/zshcompsys.1 => ../../../stow/zsh-4.3.17/share/man/man1/zshcompsys.1
LINK: share/man/man1/zshall.1 => ../../../stow/zsh-4.3.17/share/man/man1/zshall.1
LINK: share/man/man1/zshcompwid.1 => ../../../stow/zsh-4.3.17/share/man/man1/zshcompwid.1
LINK: share/zsh => ../stow/zsh-4.3.17/share/zsh
LINK: lib/zsh => ../stow/zsh-4.3.17/lib/zsh

下記でバージョンが切り替わっているか確認。バージョン切り替えが楽。

1
2
3
4
exec zsh
zsh --version

zsh 4.3.17 (x86_64-unknown-linux-gnu)

Stow関連の情報は全体的に古いものが多くて、ググっているとオワコン的な雰囲気が漂ってるんですが 2012年現在もちゃんとメンテされているので、ソースからビルドするならStowを利用するのが良いかもしれない。

運用としてはwebistranoなどを利用して、

  • ビルドサーバでビルドしたものをデプロイ
  • 各サーバでstowコマンドを実行してバージョン切り替え

という感じになるかなーと考え中。

もう少し突っ込んで検証してみよう。

参考URL

ファイル/ディレクトリの変更を検知してコマンドを実行するincron

webistranoでファイルをデプロイして、設定の再読み込みやサービス再起動などが必要な際に、 デプロイユーザがsudoreloadやらrestartなどを実行しているのが、 権限的に何となく気になって、ファイルの更新を検知して 自動的にreloadrestartする方法を模索していたら incronという良い物があったので検証。

検証環境はScientific Linux 6.2です。

実現したいこと

  • デプロイユーザとサービス再起動ユーザの分離(sudo権限の剥奪)
  • Nagiosの設定ファイルをデプロイしたら、Nagiosのreloadが自動でかかる
  • Passengerのrestart.txt的な感じでreload.txtがトリガーでNagiosのreload的な

incronの導入

incronをyumで導入

1
sudo yum -y install incron

incronの起動

1
2
sudo service incrond start
sudo chkconfig incrond on

incrontabの設定

crontabと同じような感じで設定。今回はrootのincrontabを設定します。

1
sudo incrontab -e

下記のように監視対象,トリガー,実行コマンドという形で記載

1
/var/webistrano/nagios/reload.txt IN_ACCESS,IN_MODIFY,IN_ATTRIB service nagios reload

reload.txtへのアクセス、修正などのイベントを検知し、nagiosreloadが走るようにする。 実際にはデプロイの際に、reload.txttouchなどでタイムスタンプを更新して、reloadを走らせます。 (実運用ではconfigtestをかけ成功した場合にreloadするようなスクリプトを用意した方が良いです)

incrontab -dで設定の反映

1
sudo incrontab -d

トリガーとなるイベント一覧

incrontab -tでイベントとなるトリガー一覧が確認出来ます。

  • IN_ACCESS : 当該ファイルがアクセスされた
  • IN_MODIFY : 当該ファイルが変更された
  • IN_ATTRIB : メタデータが変更された(パーミッション、拡張属性、タイムスタンプなど)
  • IN_CLOSE_WRITE : 書き込み可能ファイルの1つが閉じられた
  • IN_CLOSE_NOWRITE : 書き込み不可能ファイルの1つが閉じられた
  • IN_OPEN : ファイルの1つが開かれた
  • IN_MOVED_FROM : 当該ディレクトリの外にファイルが出された
  • IN_MOVED_TO : 当該ディレクトリの中にファイルが入れられた
  • IN_CREATE : 当該ディレクトリ中にファイル/ディレクトリが新規作成された
  • IN_DELETE : 当該ディレクトリ中からファイル/ディレクトリが削除された
  • IN_DELETE_SELF : 当該ファイル/ディレクトリ本体が削除された
  • IN_CLOSE : IN_CLOSE_WRITEとIN_CLOSE_NOWRITEの双方を対象とする
  • IN_MOVE : IN_MOVED_FROMとIN_MOVED_TOの双方を対象とする
  • IN_ALL_EVENTS : ここに一覧した全イベントを対象とする
  • IN_DONT_FOLLOW : シンボリックリンクは参照させない
  • IN_ONLYDIR : 当該パスがディレクトリの場合のみ監視させる
  • IN_MOVE_SELF : 当該ファイル/ディレクトリ本体が移動された

デプロイユーザが下記のようにデプロイ後にreload.txtのタイムスタンプを 更新するとnagiosreloadがかかるようになり、sudoの必要がなくなった。

1
touch /var/webistrano/nagios/reload.txt

同じようなことはwatchrでも出来ますかね。

ファイルの変更を動的に検知して、反映させる場合とかで便利そう。使いどころも結構ありそう。

参考URL

THE DARK KNIGHT RISES

ジャパンプレミアに行ってきて、いち早く観てきたという自慢エントリー。

とにかく素晴らしかった!!