イフブロ

イフブロ

インフラエンジニアのブログ

Capistranoでon rolesだけなく on host 又は on serverみたいに1台指定固定をやりたい時の方法

こんにちは。
今日も作業の中でハマった事を書きたいと思います。
誰かのお役に立ってると嬉しいです。

Capistranoでtaskを作る時に、taskを実行するサーバーをロールで指定出来ると思います。
これをとある1サーバーだけでやりたい場合にどうするの?というものです。

今回は
- 1サーバーでだけ動かしたい処理がある(だけどrun_locallyではない)
- roleを切りたくない (無駄に増やしたくない)

という所があったので処理を検討しました。
on roles(:all)を指定して、 コマンドライン側でcap prod cleanup:repository HOSTS=hostnameとする事も出来ますが
今回は指定ではなく、強制的にそのサーバーのみとしたかったので実装側で解決させたかったのです。

以下が、on roles での指定になると思います。

namespace :cleanup do
  desc "comment"
  task :repository do
    on roles(:rolename) do
    ~処理~
    end
  end
end

これを以下の様にする事で1サーバー指定で実行する事が出来ました。
カンマ区切りで複数かけるかな?と思ったけど、それはダメでした。

namespace :cleanup do
  desc "comment"
  task :repository do
    on "servername" do
    ~処理~
    end
  end
end
    

今回私は、configの方にset repository_server=testserver と定義しておいたので、
以下の様に書く事でソースコードから定義をconfigに移す事が出来ました。

namespace :cleanup do
  desc "comment"
  task :repository do
    on fetch(:repository_server) do
    ~処理~
    end
  end
end
    

以上です。