Aug 26, 2014

vagrant + puppet を使っての開発環境を作る場合に、いままでは、

  • プロジェクト直下に vagrant.pp をおいてそこにすべてを詰め込む
  • file resource を定義するとき、source で指定するファイルはプロジェクトで使う他の設定ファイル用のディレクトリに混ぜ込んでおいておいてフルパスハードコードで参照
source => '/vagrant/conf/my.cnf'

としていた。これはこれで機能していたし、手作業で構築する部分はゼロだった。ただ、この manifest を使いまわして puppet apply してAWS 上やら社内サーバーやらに QA 用の環境用意しようとなったとたん使い回しが効かなくて manifest 都度手直しとかするはめになってしまうことに気づいた。(まぁ、その環境でも /vagrant に git clone してもらえればそれはそれでいいんだけど...)

結局 manifest にフルパスをハードコードしないためには、モジュール化して、

source => 'puppet:///modules/mysql/my.cnf'

などとして参照できるようにすれば puppet apply --modulepath でどこに clone しても動く manifest になる。ということで、いまは以下の様な感じで作るのが自分の中のベストプラクティスとなった。

puppet
├── mysql
│   ├── files
│   │   └── my.cnf
│   └── manifests
│       └── init.pp
├── pound
│   ├── files
│   │   ├── example.com.pound.crt
│   │   └── pound.cfg
│   └── manifests
│       └── init.pp
└── site.pp

という感じで file resource 必要な奴はモジュール化。Vagrantfile は、

config.vm.provision :puppet do |puppet|
  puppet.module_path    = "puppet"
  puppet.manifests_path = "puppet"
  puppet.manifest_file  = "site.pp"
  puppet.options        = "--verbose"
end

とする。

これで、vagrant 使ってれば vagrant provision でもちろん行けるし、そうでない環境をどうにかしたいときには git clone してきて、

puppet apply --modulepath=$PWD/puppet puppet/site.pp

とすればよいだけ。

一手間あるといえばあるけど、アプリケーションが直接使うわけでもない my.cnf みたいなものを自然と別ディレクトリに分離できるし、心理的にもスッキリした感。しばらくこれでよさげ。

Aug 04, 2014

Vagrant で NFS 使っての開発環境で、ローカルでファイル変更してるんだけど VM 上の plack -R が変更検知してくれないなぁ、とおもってしばらく使ってたけど、やっぱり不便なので調べたらどうやらこれは NFS と Inofity の問題でどうしようもなさそうだった。

http://stackoverflow.com/questions/4231243/inotify-with-nfs

-R の実装である Plack::Loader::Restarter が使う Filesys::Notify::Simple では Linxu::Inofity2 なければ、File::Find 使ってフルスキャンしつつの変更検知ができるようにはなってる。それでええやん、というのもあるがバッテリー作業時の電池節約もしたいので別の方法を模索。

今回はもともと Grunt 使ってたのもありどうせならということで Grunt で完結するようにしてみた。

HTTP::Server::PSGI 使ってたこんなような Procfile のところを、

admin: plackup -p 9001 -R lib -a conf/admin.psgi

(どうせ本番で使う)Server::Starter + Starlet の構成にして pid をファイルに記録しつつの起動に変更。

admin: start_server --port=9001 --pid-file=var/run/admin.pid -- plackup -a conf/admin.psgi -s Starlet --max-workers=1

Grunt では watch で .pm ファイル達を監視しつつの exec するタスクを追加。

watch:
  apps:
    files: ['lib/**/*.pm']
    tasks: ['exec:reload']
exec:
  reload:
    command: 'vagrant ssh -c "kill -HUP `cat /vagrant/var/run/admin.pid`" -- -t'

これでローカルで Grunt 走らせておけば変更検知しての再起動がいい感じに。

ただし、grunt-contrib-watch は非常に負荷が高いようなので grunt-este-watch に移行したほうが良さそう(ファイル数にもよるだろうけど実際ロードが 20% ぐらい上がった)。

http://tech.nitoyon.com/ja/blog/2013/10/10/grunt-watch-slow/

とりあえずまともに動く plack -R の代替ができて普通の状態に戻った。

May 30, 2014

zaw がよいそうなので使い始めてみた。

基本的なところ設定したあと、とりあえずこれがないと始まらないということで、tmux の現在の pane 内に表示されてる文字列を補完対象にするやつだけ追加で書いた。

function zaw-src-tmux-pane-strings() {
    candidates=($(tmux capture-pane\; show-buffer \; delete-buffer | sed '/^$/d' | sed '$ d'))
    actions=("zaw-callback-append-to-buffer")
    act_descriptions=("append to edit buffer")
    return 0
}
zaw-register-src -n tmux-pane-strings zaw-src-tmux-pane-strings
bindkey '^x^o' zaw-tmux-pane-strings

zsh + tmux で同じことやってはいてこれはこれで便利だったけど、先頭一致しないと絞りこまれないのが不便だった(zsh レベルが低いだけでうまいことやる方法知らないだけか?)。それがzaw により部分一致できるようになったのでだいぶ具合がよくなった。

Feb 09, 2014
Jun 24, 2013

前の記事をつぶやいたら、@kazeburo さんから、

というのを教えてもらった!

前の記事でははしょったけど、redis、nginx なんかもうごいててまぁ再起動しても一瞬なんだけど、もったいない感があったので、

の通り、gearman worker は App::watcher で変更検知、plackup は -r とか -R で、というふうにしてみた。

#!/usr/bin/env perl
use strict;
use warnings;
use utf8;

use Proclet;
use FindBin ();
use Cwd ();

my $lib = Cwd::abs_path("$FindBin::Bin/../lib");

my $proclet = Proclet->new(color => 1);
$proclet->service(
    tag  => 'gearmand',
    code => 'gearmand -p 7003 --debug 1',
);

$proclet->service(
    tag  => 'gearman-worker',
    code => 'watcher --dir lib --signal HUP -- perl -Ilib script/gearman-worker --jobs Foo',
);

$proclet->service(
    tag  => 'api',
    code => 'plackup -Ilib -p 3000 -R $lib  -s Starlet --workers 2 etc/api.psgi',
);

$proclet->run;

すっきり。cpanfile には以下を入れておくと多分エコ。

on 'develop' => sub {
    requires 'App::watcher';
    if ($^O eq 'linux') {
        requires 'Linux::Inotify2';
    }
    elsif ($^O eq 'darwin') {
        requires 'Mac::FSEvents';
    }
};

同じディレクトリ以下を複数のプロセスで watch してるんだけど、そのへんエコじゃないかもしれないけど。