SSHKitを実際に使ってみて理解する

Capistrano/sshkitを紹介します。
https://github.com/capistrano/sshkit

SSHKitはリモートサーバーに対してコマンドを実行するためのツールキットです。
CapistranoやCapistranoプラグインではSSHKitが使われています。

インストール

1
gem install sshkit

コマンドのサンプル

実際に使ってみて理解していきます。
使うには、sshkitをロードする必要があります。

1
2
require 'sshkit'
include SSHKit::DSL

ホスト名を取得する

まずはログインしてホスト名を取得してみましょう。

1
2
3
4
on ['deploy@example.com’] do |host|
puts capture(:hostname)
end
=> example.com

on メソッドに対象のサーバーとブロックを渡します。
対象のサーバーは複数設定することも可能です。
ブロックにはサーバー上で実行するコマンドを設定します。
captureメソッドは渡された引数をコマンドとして実行し、結果をログに出力します。

特定のユーザーでコマンドを実行する

特定のユーザーでコマンドを実行する場合は、asメソッドで指定します。

1
2
3
4
5
on ['example.com'] do |host|
as 'deploy' do
 puts capture(:whoami)
end
end

特定のディレクトリを指定する

特定のディレクトリを指定する場合は、withinメソッドを指定します。

1
2
3
4
5
on ['deploy@example.com'] do |host|
within '/var/log' do
puts capture(:head, '-n5', 'messages')
end
end

/var/loghead -n5 messages を実行します。

環境変数を指定する

withメソッドで環境変数を指定することができます。

1
2
3
4
5
on hosts do |host|
with rack_env: :test do
puts capture("env")
end
end

rack_envに:test を設定しています。

ファイルをチェックして存在すればメッセージを表示、なければファイルを作成する

1
2
3
4
5
6
7
8
9
10
on ['deploy@example.com'] do |host|
f = '/tmp/file'
if test("[ -f #{f} ]")
info "#{f} already exist on #{host}!"
else
execute :touch, f
end
end
INFO [790b6aaa] Running /usr/bin/env touch /tmp/file as deploy@example.com
INFO [790b6aaa] Finished in 0.052 seconds with exit status 0 (successful).

testメソッドでファイルをチェックし、executeメソッドでtouchコマンドを実行しています。

ファイルをアップロードする

ファイルをアップロードすることもできます。

1
2
3
on ['deploy@example.com'] do |host|
upload! 'README.md', '/tmp/README.md'
end

第1引数がローカルのファイルのパス、第2引数がサーバーに配置するファイルのパスです。

また、recursiveオプションをtrueに設定することでディレクトリをアップロードすることもできます。

1
2
3
on hosts do |host|
upload! '.', '/tmp/mypwd', recursive: true
end

ローカルで実行する

ローカルで実行することもできます。

1
2
3
4
5
6
7
8
9
10
11
12
13
run_locally do
within '/tmp' do
execute :whoami
end
end

# もしくは

on(:local) do
within '/tmp' do
execute :whoami
end
end

Rakeタスクで利用する

RakeタスクでSSHKitのDSLを使うこともできます。
この仕組みを利用してCapistranoのプラグインは作成されています。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
require 'sshkit'

SSHKit.config.command_map[:rake] = "./bin/rake"

desc "Deploy the site, pulls from Git, migrate the db and precompile assets, then restart Passenger."
task :deploy do
include SSHKit::DSL

on "example.com" do |host|
within "/opt/sites/example.com" do
execute :git, :pull
execute :bundle, :install, '--deployment'
execute :rake, 'db:migrate'
execute :rake, 'assets:precompile'
execute :touch, 'tmp/restart.txt'
end
end
end

サンプルがこちらにたくさんあるので、参考になると思います。

https://github.com/capistrano/sshkit/blob/master/EXAMPLES.md