SHOYAN BLOG

I am a pragmatic programmer.

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

よく読まれている記事

Comments