47
Cinnamon simple deploy tool @shiba_yu36 2013/02/23 Kansai.pm

Cinnamon - simple deploy tool

Embed Size (px)

DESCRIPTION

 

Citation preview

Page 1: Cinnamon - simple deploy tool

Cinnamonsimple deploy tool

@shiba_yu362013/02/23 Kansai.pm

Page 2: Cinnamon - simple deploy tool

自己紹介

Page 3: Cinnamon - simple deploy tool

shiba_yu36 shibayu36

or etc...

&

http://blog.hatena.ne.jp/shiba_yu36

Page 4: Cinnamon - simple deploy tool

•株式会社はてな

•アプリケーションエンジニア

•はてなブログ

•外部API、課金などの基盤周り

Work

Page 5: Cinnamon - simple deploy tool

Perl•perlbrew.el•DBIx::DataFactory•Kyoto.pm•Cinnamon •-> 今日のお話

Page 6: Cinnamon - simple deploy tool

アジェンダ•デプロイツールとは?

•自作ツールのCinnamonのご紹介

• Demo

•技術的Tips

Page 7: Cinnamon - simple deploy tool

デプロイツールとは?•デプロイツール知っている人?

•使っている人?

• capistrano使っている人?

Page 8: Cinnamon - simple deploy tool

デプロイツールとは?•サーバへのデプロイを支援

•面倒な手順をまとめる

•複数台への一括デプロイ

•単純化すると、サーバへのコマンド実行

Page 9: Cinnamon - simple deploy tool

デプロイツールとは?• Capistrano (Ruby製)

•よく使われてる

• Archer (Perl製)

• etc...

Page 10: Cinnamon - simple deploy tool

Capistranoへの不満• Railsに紐付きすぎている

•中の実装が多く複雑 -> はまる

Page 11: Cinnamon - simple deploy tool

Capistranoへの不満•複数サーバにコマンド発行するだけ

• DSLで簡単に設定したい

• Perl !!!!!!!!

Page 12: Cinnamon - simple deploy tool

Cinnamon

Page 13: Cinnamon - simple deploy tool

Cinnamonとは?• perl製デプロイツール

• perlでDSLっぽく設定を書ける

•ネーミングは弊社会長犬から

Page 14: Cinnamon - simple deploy tool

Cinnamonの思想•Minimum

•Role x Task

Page 15: Cinnamon - simple deploy tool

Minimum• Cinnamon側ではサーバへのコマンド実行のみ

•デプロイの方法は利用者に

Page 16: Cinnamon - simple deploy tool

Role x Task

環境とタスクの組み合わせ

Page 17: Cinnamon - simple deploy tool

•サーバ群をroleとして定義

•実行したいものをtaskとして定義

• roleとtaskを組み合わせて実行

•例)「本番appサーバ」に「コードの反映」を実行

Role x Task

Page 18: Cinnamon - simple deploy tool

cpanm Cinnamon

Page 19: Cinnamon - simple deploy tool

How to Use

Page 20: Cinnamon - simple deploy tool

Synopsisuse Cinnamon::DSL;

set user => 'johndoe'; # requiredset application => 'My-App'; # custom value

role production => 'production.host'; # declare server

task update => sub { my ($host, @args) = @_; my $deploy_to = get('deploy_to'); remote { run "cd $deploy_to && git pull"; } $host;};

Page 21: Cinnamon - simple deploy tool

use Cinnamon::DSL;

set user => 'johndoe'; # requiredset application => 'My-App'; # custom value

role production => 'production.host'; # declare server

task update => sub { my ($host, @args) = @_; my $deploy_to = get('deploy_to'); remote { run "cd $deploy_to && git pull"; } $host;};

•config/deploy.pl•useしてDSLを書けるように

Page 22: Cinnamon - simple deploy tool

use Cinnamon::DSL;

set user => 'johndoe'; # requiredset application => 'My-App'; # custom value

role production => 'production.host'; # declare server

task update => sub { my ($host, @args) = @_; my $deploy_to = get('deploy_to'); remote { run "cd $deploy_to && git pull"; } $host;};

•ログインユーザ名をset

Page 23: Cinnamon - simple deploy tool

use Cinnamon::DSL;

set user => 'johndoe'; # requiredset application => 'My-App'; # custom value

role production => 'production.host'; # declare server

task update => sub { my ($host, @args) = @_; my $deploy_to = get('deploy_to'); remote { run "cd $deploy_to && git pull"; } $host;};

•roleでサーバ群を定義

•配列で複数サーバ渡せる

Page 24: Cinnamon - simple deploy tool

use Cinnamon::DSL;

set user => 'johndoe'; # requiredset application => 'My-App'; # custom value

role production => 'production.host'; # declare server

task update => sub { my ($host, @args) = @_; my $deploy_to = get('deploy_to'); remote { run "cd $deploy_to && git pull"; } $host;};

•taskで実行コマンドを定義

•remote + runでサーバに実行

•runの代わりにsudo

Page 25: Cinnamon - simple deploy tool

use Cinnamon::DSL;

set user => 'johndoe'; # requiredset application => 'My-App'; # custom value

role production => 'production.host'; # declare server

task update => sub { my ($host, @args) = @_; my $deploy_to = get('deploy_to'); remote { run "cd $deploy_to && git pull"; } $host;};•set/getを使ってユーザ定義値

•遅延評価することも可能

Page 26: Cinnamon - simple deploy tool

実行• cinnamon (role) (task)

• cinnamon production update

Page 28: Cinnamon - simple deploy tool

Use Case

Page 29: Cinnamon - simple deploy tool

サーバ群を別の管理ツールから決めたい

•別にサーバ管理ツールがある

• HTTPのAPIみたいなのがある

•そこから動的にサーバを決めたい

Page 30: Cinnamon - simple deploy tool

サーバ群を別の管理ツールから決めたい

role production => sub { my $res = LWP::UserAgent->get( 'http://servers.example.com/api/hosts', ); my $hosts = decode_json $res->content; $hosts;};

callbackで動的にサーバを決める遅延ロードする

Page 31: Cinnamon - simple deploy tool

開発環境は違うブランチ

•本番はmasterを反映

•開発環境はdevelopment

• etc...

Page 32: Cinnamon - simple deploy tool

開発環境は違うブランチrole production => ['production.host'], { branch => "master",};role development => ['development.host'], { branch => "development",};

task update => sub { my $branch = get('branch'); # ...};

roleで変数の上書きが出来る

Page 33: Cinnamon - simple deploy tool

How to Make

Page 34: Cinnamon - simple deploy tool

How to Make• サーバへのコマンド実行部

• Net::OpenSSH• DSL部

Page 35: Cinnamon - simple deploy tool

サーバへのコマンド実行• Net::OpenSSHが便利

•コマンド実行 + 結果の取得

• system, capture2, open3

Page 36: Cinnamon - simple deploy tool

サーバへのコマンド実行

my $ssh = Net::OpenSSH->new( 'shiba.host', user => 'shibayu36',);

$ssh->system('ls /home');my ($out, $err) = $ssh->capture2("ls /home");my ($in, $out, $err, $pid) = $ssh->open3("cpanm --installdeps .");

Page 37: Cinnamon - simple deploy tool

サーバへのコマンド実行

my $ssh = Net::OpenSSH->new( 'shiba.host', user => 'shibayu36',);

$ssh->system('ls /home');my ($out, $err) = $ssh->capture2("ls /home");my ($in, $out, $err, $pid) = $ssh->open3("cpanm --installdeps .");

ホスト名とユーザ名を入れてnew

Page 38: Cinnamon - simple deploy tool

サーバへのコマンド実行

my $ssh = Net::OpenSSH->new( 'shiba.host', user => 'shibayu36',);

$ssh->system('ls /home');my ($out, $err) = $ssh->capture2("ls /home");my ($in, $out, $err, $pid) = $ssh->open3("cpanm --installdeps .");

systemでコマンドの実行のみ

Page 39: Cinnamon - simple deploy tool

サーバへのコマンド実行

my $ssh = Net::OpenSSH->new( 'shiba.host', user => 'shibayu36',);

$ssh->system('ls /home');my ($out, $err) = $ssh->capture2("ls /home");my ($in, $out, $err, $pid) = $ssh->open3("cpanm --installdeps .");

capture2で標準出力などを変数に

Page 40: Cinnamon - simple deploy tool

サーバへのコマンド実行

my $ssh = Net::OpenSSH->new( 'shiba.host', user => 'shibayu36',);

$ssh->system('ls /home');my ($out, $err) = $ssh->capture2("ls /home");my ($in, $out, $err, $pid) = $ssh->open3("cpanm --installdeps .");

open3使うとファイルハンドラがもらえる

Page 41: Cinnamon - simple deploy tool

使いどころ•サーバと連携するツールの開発に便利

• CinnamonではAnyEvent::Handlerと一緒に使って、出力をしている

Page 42: Cinnamon - simple deploy tool

DSL•単なる関数export

• Exporter::Lite

Page 43: Cinnamon - simple deploy tool

DSLの簡単な例package Cinnamon::DSL;use Exporter::Lite;our @EXPORT = qw(role);

sub role ($$;$) { my ($name, $hosts, $params) = @_; # ...}

Page 44: Cinnamon - simple deploy tool

DSLの応用的な実装• Plack::Builderが参考になる

• builderブロックの中でしかenableが使えない

Page 45: Cinnamon - simple deploy tool

DSLの応用的な実装sub enable { $_add->(@_) }sub builder(&) { my $block = shift; my $self = __PACKAGE__->new;

# ... local $_add = sub { $self->add_middleware(@_); }; # ...}

Page 46: Cinnamon - simple deploy tool

まとめ•デプロイツールのお話

•シンプルなツールのCinnamonの紹介

• pull requestお待ちしております!!!

Page 47: Cinnamon - simple deploy tool

ご清聴ありがとうございました