SlideShare ist ein Scribd-Unternehmen logo
1 von 47
Downloaden Sie, um offline zu lesen
Cinnamon
simple deploy tool
       @shiba_yu36
   2013/02/23 Kansai.pm
自己紹介
shiba_yu36         &      shibayu36


                                  or etc...
  http://blog.hatena.ne.jp/shiba_yu36
Work
• 株式会社はてな
• アプリケーションエンジニア
 • はてなブログ
 • 外部API、課金などの基盤周り
Perl
• perlbrew.el
• DBIx::DataFactory
• Kyoto.pm
• Cinnamon

 • -> 今日のお話
アジェンダ
• デプロイツールとは?
• 自作ツールのCinnamonのご紹介
• Demo
• 技術的Tips
デプロイツールとは?
• デプロイツール知っている人?
• 使っている人?
• capistrano使っている人?
デプロイツールとは?
• サーバへのデプロイを支援
 • 面倒な手順をまとめる
 • 複数台への一括デプロイ
• 単純化すると、サーバへのコマンド実
 行
デプロイツールとは?
• Capistrano (Ruby製)
 • よく使われてる
• Archer (Perl製)
• etc...
Capistranoへの不満
• Railsに紐付きすぎている
• 中の実装が多く複雑 -> はまる
Capistranoへの不満
• 複数サーバにコマンド発行するだけ
• DSLで簡単に設定したい
• Perl !!!!!!!!
Cinnamon
Cinnamonとは?
• perl製デプロイツール
• perlでDSLっぽく設定を書ける
• ネーミングは弊社会長犬から
Cinnamonの思想
•Minimum

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

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




環境とタスクの組み合わせ
Role x Task
• サーバ群をroleとして定義
• 実行したいものをtaskとして定義
• roleとtaskを組み合わせて実行
 • 例)「本番appサーバ」に「コードの反
 映」を実行
cpanm Cinnamon
How to Use
Synopsis
use Cinnamon::DSL;

set user => 'johndoe'; # required
set 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;
};
use Cinnamon::DSL;


 • config/deploy.pl
set user => 'johndoe'; # required
set application => 'My-App'; # custom value


 • useしてDSLを書けるように
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;
};
use Cinnamon::DSL;

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

•   ログインユーザ名をset
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;
};
use Cinnamon::DSL;

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

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



• roleでサーバ群を定義
task update => sub {
    my ($host, @args) = @_;
    my $deploy_to = get('deploy_to');

• 配列で複数サーバ渡せる
    remote {
        run "cd $deploy_to && git pull";
    } $host;
};
• taskで実行コマンドを定義
use Cinnamon::DSL;

set user => 'johndoe'; # required

• remote + runでサーバに実行
set application => 'My-App'; # custom value

role production
• runの代わりにsudo
    => 'production.host'; # declare server

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

set user => 'johndoe'; # required
set 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";
  set/getを使ってユーザ定義値
    } $host;
};

• 遅延評価することも可能
実行
• cinnamon (role) (task)
• cinnamon production update
Demo
• https://github.com/shibayu36/
  cinnamon-deploy-sample

• 反映、サーバ停止、サーバ起動
• installdeps
Use Case
サーバ群を
別の管理ツールから決めたい

• 別にサーバ管理ツールがある
• HTTPのAPIみたいなのがある
• そこから動的にサーバを決めたい
サーバ群を
     別の管理ツールから決めたい
role production => sub {
    my $res   = LWP::UserAgent->get(
        'http://servers.example.com/api/hosts',
    );
    my $hosts = decode_json $res->content;
    $hosts;
};

       callbackで動的にサーバを決める
               遅延ロードする
開発環境は違うブランチ

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

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

         roleで変数の上書きが出来る
How to Make
How to Make
•   サーバへのコマンド実行部

    • Net::OpenSSH
• DSL部
サーバへのコマンド実行
• Net::OpenSSHが便利
• コマンド実行 + 結果の取得
• system, capture2, open3
サーバへのコマンド実行

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 .");
サーバへのコマンド実行

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

$ssh->system('ls /home');
my ($out, $err) = $ssh->capture2("ls /home");
       ホスト名とユーザ名を入れてnew
my ($in, $out, $err, $pid) = $ssh->open3("cpanm
--installdeps .");
サーバへのコマンド実行

my $ssh = Net::OpenSSH->new(
    'shiba.host', user => 'shibayu36',
);       systemでコマンドの実行のみ
$ssh->system('ls /home');
my ($out, $err) = $ssh->capture2("ls /home");
my ($in, $out, $err, $pid) = $ssh->open3("cpanm
--installdeps .");
サーバへのコマンド実行

my $ssh = Net::OpenSSH->new(
    'shiba.host', user => 'shibayu36',
);
      capture2で標準出力などを変数に
$ssh->system('ls /home');
my ($out, $err) = $ssh->capture2("ls /home");
my ($in, $out, $err, $pid) = $ssh->open3("cpanm
--installdeps .");
サーバへのコマンド実行

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

   open3使うとファイルハンドラがもらえる
$ssh->system('ls /home');
my ($out, $err) = $ssh->capture2("ls /home");
my ($in, $out, $err, $pid) = $ssh->open3("cpanm
--installdeps .");
使いどころ
• サーバと連携するツールの開発に便利
• CinnamonではAnyEvent::Handlerと
 一緒に使って、出力をしている
DSL
• 単なる関数export
• Exporter::Lite
DSLの簡単な例
package Cinnamon::DSL;
use Exporter::Lite;
our @EXPORT = qw(role);

sub role ($$;$) {
    my ($name, $hosts, $params) = @_;
    # ...
}
DSLの応用的な実装
• Plack::Builderが参考になる
• builderブロックの中でしかenableが使
 えない
DSLの応用的な実装
sub enable { $_add->(@_) }
sub builder(&) {
    my $block = shift;
    my $self = __PACKAGE__->new;

    # ...
    local $_add = sub {
        $self->add_middleware(@_);
    };
    # ...
}
まとめ
• デプロイツールのお話
• シンプルなツールのCinnamonの紹介
• pull requestお待ちしております!!!
ご清聴
ありがとうございました

Weitere ähnliche Inhalte

Was ist angesagt?

Ansible 入門 #01 (初心者向け)
Ansible 入門 #01 (初心者向け)Ansible 入門 #01 (初心者向け)
Ansible 入門 #01 (初心者向け)Taro Hirose
 
ChefとPuppetの比較
ChefとPuppetの比較ChefとPuppetの比較
ChefとPuppetの比較Sugawara Genki
 
ぼくのかんがえた Itamae/Serverspec 構成フレームワーク 〜 Kondate 〜
ぼくのかんがえた Itamae/Serverspec 構成フレームワーク 〜 Kondate 〜ぼくのかんがえた Itamae/Serverspec 構成フレームワーク 〜 Kondate 〜
ぼくのかんがえた Itamae/Serverspec 構成フレームワーク 〜 Kondate 〜Naotoshi Seo
 
Rails3.1rc4を試してみた
Rails3.1rc4を試してみたRails3.1rc4を試してみた
Rails3.1rc4を試してみたTakahiro Hidaka
 
SmartPhone development guide with CoffeeScript + Node + HTML5 Technology, for...
SmartPhone development guide with CoffeeScript + Node + HTML5 Technology, for...SmartPhone development guide with CoffeeScript + Node + HTML5 Technology, for...
SmartPhone development guide with CoffeeScript + Node + HTML5 Technology, for...Naoya Ito
 
Ansibleで始めるサーバ管理勉強会(2014年10月1日)
Ansibleで始めるサーバ管理勉強会(2014年10月1日)Ansibleで始めるサーバ管理勉強会(2014年10月1日)
Ansibleで始めるサーバ管理勉強会(2014年10月1日)CLARA ONLINE, Inc.
 
WordPress のキャッシュ機構
WordPress のキャッシュ機構WordPress のキャッシュ機構
WordPress のキャッシュ機構katanyan
 
PHPコードではなく PHPコードの「書き方」を知る
PHPコードではなく PHPコードの「書き方」を知るPHPコードではなく PHPコードの「書き方」を知る
PHPコードではなく PHPコードの「書き方」を知るMasashi Shinbara
 
081108huge_data.ppt
081108huge_data.ppt081108huge_data.ppt
081108huge_data.pptNaoya Ito
 
Ansible 2.0を使って組む kubernetesクラスタ vol.1
Ansible 2.0を使って組む kubernetesクラスタ vol.1Ansible 2.0を使って組む kubernetesクラスタ vol.1
Ansible 2.0を使って組む kubernetesクラスタ vol.1Hidetoshi Hirokawa
 
Scripting Layer for Android + Perl
Scripting Layer for Android + PerlScripting Layer for Android + Perl
Scripting Layer for Android + PerlNaoya Ito
 
Itamae-Serverspec入門
Itamae-Serverspec入門Itamae-Serverspec入門
Itamae-Serverspec入門辰徳 斎藤
 
Introduction of aws-cli
Introduction of aws-cliIntroduction of aws-cli
Introduction of aws-cliMasaaki HIROSE
 

Was ist angesagt? (20)

Puppet on AWS
Puppet on AWSPuppet on AWS
Puppet on AWS
 
Ansible 入門 #01 (初心者向け)
Ansible 入門 #01 (初心者向け)Ansible 入門 #01 (初心者向け)
Ansible 入門 #01 (初心者向け)
 
Ansible入門
Ansible入門Ansible入門
Ansible入門
 
ChefとPuppetの比較
ChefとPuppetの比較ChefとPuppetの比較
ChefとPuppetの比較
 
ぼくのかんがえた Itamae/Serverspec 構成フレームワーク 〜 Kondate 〜
ぼくのかんがえた Itamae/Serverspec 構成フレームワーク 〜 Kondate 〜ぼくのかんがえた Itamae/Serverspec 構成フレームワーク 〜 Kondate 〜
ぼくのかんがえた Itamae/Serverspec 構成フレームワーク 〜 Kondate 〜
 
Rails3.1rc4を試してみた
Rails3.1rc4を試してみたRails3.1rc4を試してみた
Rails3.1rc4を試してみた
 
Ansible入門
Ansible入門Ansible入門
Ansible入門
 
SmartPhone development guide with CoffeeScript + Node + HTML5 Technology, for...
SmartPhone development guide with CoffeeScript + Node + HTML5 Technology, for...SmartPhone development guide with CoffeeScript + Node + HTML5 Technology, for...
SmartPhone development guide with CoffeeScript + Node + HTML5 Technology, for...
 
Ansibleで始めるサーバ管理勉強会(2014年10月1日)
Ansibleで始めるサーバ管理勉強会(2014年10月1日)Ansibleで始めるサーバ管理勉強会(2014年10月1日)
Ansibleで始めるサーバ管理勉強会(2014年10月1日)
 
Apache Module
Apache ModuleApache Module
Apache Module
 
Scala on Hadoop
Scala on HadoopScala on Hadoop
Scala on Hadoop
 
WordPress のキャッシュ機構
WordPress のキャッシュ機構WordPress のキャッシュ機構
WordPress のキャッシュ機構
 
Ansible handson
Ansible handsonAnsible handson
Ansible handson
 
PHPコードではなく PHPコードの「書き方」を知る
PHPコードではなく PHPコードの「書き方」を知るPHPコードではなく PHPコードの「書き方」を知る
PHPコードではなく PHPコードの「書き方」を知る
 
081108huge_data.ppt
081108huge_data.ppt081108huge_data.ppt
081108huge_data.ppt
 
Ansible 2.0を使って組む kubernetesクラスタ vol.1
Ansible 2.0を使って組む kubernetesクラスタ vol.1Ansible 2.0を使って組む kubernetesクラスタ vol.1
Ansible 2.0を使って組む kubernetesクラスタ vol.1
 
Scripting Layer for Android + Perl
Scripting Layer for Android + PerlScripting Layer for Android + Perl
Scripting Layer for Android + Perl
 
Fabric Essentials
Fabric EssentialsFabric Essentials
Fabric Essentials
 
Itamae-Serverspec入門
Itamae-Serverspec入門Itamae-Serverspec入門
Itamae-Serverspec入門
 
Introduction of aws-cli
Introduction of aws-cliIntroduction of aws-cli
Introduction of aws-cli
 

Ähnlich wie Cinnamon - simple deploy tool

恋に落ちるデプロイツール
恋に落ちるデプロイツール恋に落ちるデプロイツール
恋に落ちるデプロイツールtotty jp
 
Dockerイメージ構築 実践テクニック
Dockerイメージ構築 実践テクニックDockerイメージ構築 実践テクニック
Dockerイメージ構築 実践テクニックEmma Haruka Iwao
 
Fabricでサーバー管理をDRYにしよう
Fabricでサーバー管理をDRYにしようFabricでサーバー管理をDRYにしよう
Fabricでサーバー管理をDRYにしようmax747
 
今日から使い始めるChef
今日から使い始めるChef今日から使い始めるChef
今日から使い始めるChefMasahiro NAKAYAMA
 
10分で作る Node.js Auto Scale 環境 with CloudFormation
10分で作る Node.js Auto Scale 環境 with CloudFormation10分で作る Node.js Auto Scale 環境 with CloudFormation
10分で作る Node.js Auto Scale 環境 with CloudFormationKazuyuki Honda
 
成長を加速する minne の技術基盤戦略
成長を加速する minne の技術基盤戦略成長を加速する minne の技術基盤戦略
成長を加速する minne の技術基盤戦略Hiroshi SHIBATA
 
Itcamp長崎2012 capistrano
Itcamp長崎2012 capistranoItcamp長崎2012 capistrano
Itcamp長崎2012 capistranokumachang_LL
 
20140612_Docker上でCloudStackを動かしてみる!!
20140612_Docker上でCloudStackを動かしてみる!!20140612_Docker上でCloudStackを動かしてみる!!
20140612_Docker上でCloudStackを動かしてみる!!Midori Oge
 
Openstack SPICE console (icehouse) verification
Openstack SPICE console (icehouse) verificationOpenstack SPICE console (icehouse) verification
Openstack SPICE console (icehouse) verificationyukihiro kawada
 
Perl 非同期プログラミング
Perl 非同期プログラミングPerl 非同期プログラミング
Perl 非同期プログラミングlestrrat
 
Kyoto.pm 20120818-hogem
Kyoto.pm 20120818-hogemKyoto.pm 20120818-hogem
Kyoto.pm 20120818-hogemhogem
 
~Dockerfileの開発を劇的に楽にする~ Dockerfile開発環境 EDGE
~Dockerfileの開発を劇的に楽にする~ Dockerfile開発環境 EDGE~Dockerfileの開発を劇的に楽にする~ Dockerfile開発環境 EDGE
~Dockerfileの開発を劇的に楽にする~ Dockerfile開発環境 EDGE辰徳 斎藤
 
Inside mobage platform
Inside mobage platformInside mobage platform
Inside mobage platformToru Yamaguchi
 

Ähnlich wie Cinnamon - simple deploy tool (20)

恋に落ちるデプロイツール
恋に落ちるデプロイツール恋に落ちるデプロイツール
恋に落ちるデプロイツール
 
swooleを試してみた
swooleを試してみたswooleを試してみた
swooleを試してみた
 
Dockerイメージ構築 実践テクニック
Dockerイメージ構築 実践テクニックDockerイメージ構築 実践テクニック
Dockerイメージ構築 実践テクニック
 
Fabricでサーバー管理をDRYにしよう
Fabricでサーバー管理をDRYにしようFabricでサーバー管理をDRYにしよう
Fabricでサーバー管理をDRYにしよう
 
今日から使い始めるChef
今日から使い始めるChef今日から使い始めるChef
今日から使い始めるChef
 
Capistrano
CapistranoCapistrano
Capistrano
 
10分で作る Node.js Auto Scale 環境 with CloudFormation
10分で作る Node.js Auto Scale 環境 with CloudFormation10分で作る Node.js Auto Scale 環境 with CloudFormation
10分で作る Node.js Auto Scale 環境 with CloudFormation
 
成長を加速する minne の技術基盤戦略
成長を加速する minne の技術基盤戦略成長を加速する minne の技術基盤戦略
成長を加速する minne の技術基盤戦略
 
Silex入門
Silex入門Silex入門
Silex入門
 
Itcamp長崎2012 capistrano
Itcamp長崎2012 capistranoItcamp長崎2012 capistrano
Itcamp長崎2012 capistrano
 
実は怖くないDevOps
実は怖くないDevOps実は怖くないDevOps
実は怖くないDevOps
 
20140612_Docker上でCloudStackを動かしてみる!!
20140612_Docker上でCloudStackを動かしてみる!!20140612_Docker上でCloudStackを動かしてみる!!
20140612_Docker上でCloudStackを動かしてみる!!
 
Openstack SPICE console (icehouse) verification
Openstack SPICE console (icehouse) verificationOpenstack SPICE console (icehouse) verification
Openstack SPICE console (icehouse) verification
 
Perl 非同期プログラミング
Perl 非同期プログラミングPerl 非同期プログラミング
Perl 非同期プログラミング
 
Kyoto.pm 20120818-hogem
Kyoto.pm 20120818-hogemKyoto.pm 20120818-hogem
Kyoto.pm 20120818-hogem
 
WDD2012_SC-004
WDD2012_SC-004WDD2012_SC-004
WDD2012_SC-004
 
~Dockerfileの開発を劇的に楽にする~ Dockerfile開発環境 EDGE
~Dockerfileの開発を劇的に楽にする~ Dockerfile開発環境 EDGE~Dockerfileの開発を劇的に楽にする~ Dockerfile開発環境 EDGE
~Dockerfileの開発を劇的に楽にする~ Dockerfile開発環境 EDGE
 
Inside mobage platform
Inside mobage platformInside mobage platform
Inside mobage platform
 
No SSH (@nojima; KMC関東例会)
No SSH (@nojima; KMC関東例会)No SSH (@nojima; KMC関東例会)
No SSH (@nojima; KMC関東例会)
 
test
testtest
test
 

Mehr von Yuki Shibazaki

130427 kansai-emacs-github
130427 kansai-emacs-github130427 kansai-emacs-github
130427 kansai-emacs-githubYuki Shibazaki
 
120225perl入学式02自己紹介
120225perl入学式02自己紹介120225perl入学式02自己紹介
120225perl入学式02自己紹介Yuki Shibazaki
 
没入コミュニケーションに利用する3次元仮想キャラクタの半自動生成
没入コミュニケーションに利用する3次元仮想キャラクタの半自動生成没入コミュニケーションに利用する3次元仮想キャラクタの半自動生成
没入コミュニケーションに利用する3次元仮想キャラクタの半自動生成Yuki Shibazaki
 
テストデータどうしてますか?
テストデータどうしてますか?テストデータどうしてますか?
テストデータどうしてますか?Yuki Shibazaki
 

Mehr von Yuki Shibazaki (9)

131026 kansai-emacs
131026 kansai-emacs131026 kansai-emacs
131026 kansai-emacs
 
130713 kyotopm-lt
130713 kyotopm-lt130713 kyotopm-lt
130713 kyotopm-lt
 
130427 kansai-emacs-github
130427 kansai-emacs-github130427 kansai-emacs-github
130427 kansai-emacs-github
 
130207 kyotorb
130207 kyotorb130207 kyotorb
130207 kyotorb
 
121221社内lt
121221社内lt121221社内lt
121221社内lt
 
120225perl入学式02自己紹介
120225perl入学式02自己紹介120225perl入学式02自己紹介
120225perl入学式02自己紹介
 
120225perl入学式02
120225perl入学式02120225perl入学式02
120225perl入学式02
 
没入コミュニケーションに利用する3次元仮想キャラクタの半自動生成
没入コミュニケーションに利用する3次元仮想キャラクタの半自動生成没入コミュニケーションに利用する3次元仮想キャラクタの半自動生成
没入コミュニケーションに利用する3次元仮想キャラクタの半自動生成
 
テストデータどうしてますか?
テストデータどうしてますか?テストデータどうしてますか?
テストデータどうしてますか?
 

Cinnamon - simple deploy tool