Capistranoでダウンロード

Capistranoにはターゲットホストにファイルを送信するメソッドと、ターゲットホストからファイルを受信するメソッドがある。具体的にはputuploadgetdownloadの四種類。putuploadはファイルの内容を送信するのと手元にあるファイルを送信するのとで違う。putは引数にファイルの内容をとり、uploadはパス名をとる。

put "nameserver 10.0.0.1\n", 
  "/etc/resolv.conf"
upload "/path/to/resolv.conf", 
  "/etc/resolv.conf"

ではgetdownloadの違いは何かというと、getがターゲットホスト群のうちの一つだけからファイルを受信するのに対し、downloadはすべてからファイルを受信する。

get "/etc/debian_version", 
  "/tmp/debian_version"
download "/etc/debian_version", 
  "/tmp/debian_version"

だが、しかし、受信したものを置く場所は同じになってしまうではないか。そう思っていた。

実はCapistranoによるコマンド実行やファイル転送の指定ではホスト名を置換する特別な記述が使えるようになっている。コマンドラインやパス名の中で$CAPISTRANO:HOST$と書いた部分が、今まさに対象となっているホスト名で置換される。したがってdownloadは以下のように使えばおかしなことにならなくて済む。

download "/etc/debian_version", 
  "/tmp/debian_version.$CAPISTRANO:HOST$"

コマンド実行でも同じように使えるのだが、たいていの場合は$(hostname)などで対応できると思う。コマンド実行が少し減ってうれしいということはあるかもしれない。ただ、ここでいうホスト名とはレシピ上の名前のことで、実際のホストにどのようなノード名が設定されているかとは関係がないという点には注意が必要である。