Undefined Title

Undefined Title

minaでログファイルをtailするまで

deploy用のツールのひとつとしてcapistranoが有名。 github:helpにも載ってて標準ツールと言ってもいい。

僕も使ってるし。

で、今日minaというcapistranoの対抗馬があることを知った。 インストールとか使用感とかcapistranoとの比較などは先人がいるので そちらを見てもらうとして、ここでは「remoteのログファイルをtail -fする」 というピンポイントなユースケースについて書く。

今回の状況は以下のとおり。

  • 秘密/公開鍵は新しく作る。ファイル名はminademo
  • サーバ名はmina.example.com
  • minauserがすでにmina.example.comにある
  • minauserはsudo可能(例が/var/log/messagesをtailするので)
  • MacOSでやったけど、ubuntuとかCentOSとかでもたぶん大丈夫。

minaをインストール

gemですんなり入る。

foobar@~$ gem install mina --no-ri --no-rdoc

秘密/公開鍵を作ってサーバへ登録

ssh-keygenでファイル名指定しつつ鍵を作成。 おもむろに公開鍵をサーバへコピーし、authorized_keysへ登録。

minademo生成。

foobar@~$ ssh-keygen -t rsa -f ~/.ssh/minademo
Generating public/private rsa key pair.
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in /Users/foobar/.ssh/minademo.
Your public key has been saved in /Users/foobar/.ssh/minademo.pub.
The key fingerprint is:
(snip)

サーバへ公開鍵をコピー。

$ scp ~/.ssh/minademo.pub [email protected]:./
[email protected]'s password: 

authorized_keysへ公開鍵を追加。

$ ssh [email protected] "cat ~/minademo.pub >> ~/.ssh/authorized_keys; chmod 600 ~/.ssh/authorized_keys; chmod 700 ~/.ssh"
[email protected]'s password: 

公開鍵の登録ができたら、登録できているかの確認も含めてコピーしたminademo.pubを消しておく。

$ ssh -i ~/.ssh/minademo [email protected] "rm ~/minademo.pub"

config/deploy.rbの作成する

minaはデフォルトでconfig/deploy.rbを参照します。-fオプションで変更可能。

$ mkdir config
$ vi config/deploy.rb

内容は次のようにする。

set :domain, 'mina.example.com'
set :user, 'minauser'
set :identity_file, (ENV[:identity_file.to_s] or "~/.ssh/minademo")
set :port, 22

task :logs do
  queue 'echo "tail -f /var/log/messages"'
  queue 'sudo tail -f /var/log/messages'
end
  • :domain 対象ホスト名
  • :user ユーザ名
  • :identity_file 秘密鍵へのpath
  • :port sshのポート番号
  • タスク名はlogs
  • 処理はechoとtail

この辺はcapistranoと似てる。

logsタスクを実行する

minaを実行する。 タスク名はlogs。 sudoをしているのでpasswordの入力を求められる。

$ mina logs
tail -f /var/log/messages
[sudo] password for minauser: 
...

identity_fileはコマンドライン引数として与えることができる。 minaはコマンドライン引数をENVから受け取るみたい。 capistranoはローカル変数として受け取ったはずなので、ここはちょっと違う。

$ mina logs identity_file=~/.ssh/minademo
...

この例ではデフォルト値と同じなので、sudoのpassword入力を求められる。

~/.ssh/minademoではなく、適当なファイルや存在しないpathを指定すると、 公開鍵認証が効かないので、minauserとしての認証を求められるはず。

他の機能は公式ドキュメントを見て欲しい。

しかし、読み直すとminaの導入というよりは、大半が鍵作成と公開鍵の登録についてだな。