capistrano/逆引きリファレンス

capistranoを使ってやりたいことがあるけどやり方が微妙によく分からない場合にご覧下さい。
というか、本当のところは自分で使ってみてなんとなく役に立ったことを書いているだけです。

大体はsshkitの所に書いてあるので、困った際にはそちらをご覧下さい。


erbテンプレートを使いたい

テンプレート使うならchefでいいじゃんと思い、自分は使ってません。
一応こんな感じでいけるみたいです。

要約するとテンプレートはこんな感じ?
My name is <%= fetch( :my_name ) %>

タスクはこんな感じ?
set :my_name, 'NEET'

def template( from, to )
  template_path = "templates/#{from}"
  template = ERB.new( File.new( template_path ).read ).result( binding )
  upload! StringIO.new( template ), to
end

task :upload_template do
  on roles( :all ) do
    template "template.txt.erb", "/tmp/template.txt"
  end
end

実行?
# cap manage upload_template

templateメソッドの宣言はどっか他の場所でやった方が良さそうですが。

サーバー上で特定のコマンドを実行したい

executeメソッドを使います。
task :example_task do
  on roles( :all ) do
    execute "command -o option"
  end
end

サーバー上で実行したコマンドの出力を取りたい

captureメソッドを使います。
task :example_task do
  on roles( :all ) do
    output = capture(:ls, '-l /home')
    p output
  end
end
なぜかコマンド自体がシンボルになっているのでご注意下さい。
上記は ls コマンドなので、grep コマンドだったら :grep になります。

サーバーにファイルをアップロードしたい

upload!メソッドを使います。
task :example_task do
  on roles( :all ) do
    upload! '/tmp/srcfile.txt', '/tmp/dstfile.txt'
  end
end

サーバーに手動でコマンド実行したい

consoleを使います。
# cap production console

タスクを実行するサーバー、ロールを指定したい

capコマンドで--hostsオプションや--rolesオプションを指定します。
# cap --hosts web1,app1,db1 production deploy
# cap --roles web,app,db production deploy

タスクを実行するロールを指定したい

onメソッドでrolesを指定します。
task :example_task do
  on roles( :web ) do
    execute "command"
  end
end
ただし基本的にはタスク自体はroles(:all)で作成し、capコマンド実行時に--hostsや--rolesで指定する方がオススメです。

パスフレーズ付きのSSH鍵を使いたい

SSHKit::Backend::Netssh.configureを使います。
SSHKit::Backend::Netssh.configure do |ssh|
  ssh.ssh_options = {
    :user => 'root',
    :keys => [ '/path/to/id_rsa1', '/path/to/id_rsa2' ],
    :passphrase => 'passphrase',
  }
end

server 'example.jp', :roles => [ :web ]
task :example_task do
  on roles( :all ) do
    execute "command"
  end
end

またはserverメソッドの:ssh_optionsオプションで個別指定もできるみたいです。(うろ覚え)
server(
  'example.jp',
  :roles => [ :web ],
  :user => 'root',
  :ssh_options => {
    :keys => [ '/path/to/id_rsa1', '/path/to/id_rsa2' ],
    :passphrase => 'passphrase',
  }
)

task :example_task do
  on roles( :all ) do
    execute "command"
  end
end

パスワードなどの値を実行時に入力するようにしたい

askメソッドとfetchメソッドを利用します。
set :account, ask( 'Account?: ', 'root' )
set :pass, ask( 'Password?: ', nil, :echo => false )
server 'example.jp', :roles => [ :web ], :user => fetch( :account ), :password => fetch( :pass )
task :example_task do
  on roles( :all ) do
    execute "command"
  end
end
:echoの値がfalseだと入力した値が画面に表示されなくなります。

ちなみに間違えやすいのは、実際にプロンプトが出るのはfetchメソッドが呼び出された時です。
askメソッドが呼び出された時ではないことに注意しましょう。

タスクで関数使う

普通に使える
task :aaa do
  dir = "/home"
  test( dir )
end

def test( dir )
  on roles( :all ) do
    execute "ls #{dir}"
  end
end

  • 最終更新:2016-07-21 17:06:07

このWIKIを編集するにはパスワード入力が必要です

認証パスワード