capistrano/逆引きリファレンス
capistranoを使ってやりたいことがあるけどやり方が微妙によく分からない場合にご覧下さい。
というか、本当のところは自分で使ってみてなんとなく役に立ったことを書いているだけです。
大体はsshkitの所に書いてあるので、困った際にはそちらをご覧下さい。
- erbテンプレートを使いたい
- サーバー上で特定のコマンドを実行したい
- サーバー上で実行したコマンドの出力を取りたい
- サーバーにファイルをアップロードしたい
- サーバーに手動でコマンド実行したい
- タスクを実行するサーバー、ロールを指定したい
- タスクを実行するロールを指定したい
- パスフレーズ付きのSSH鍵を使いたい
- パスワードなどの値を実行時に入力するようにしたい
- タスクで関数使う
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