イフブロ

イフブロ

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

Capistrano Server Properties / Role Properties

いつもメモ書きなので、言葉も文章も終わってる気がしますが備忘なのでまとめる事を優先…(という言い訳)

Capistranoはserver毎固有のpropertiesと、ROLE毎のPropertiesを持てます。 本家だとこのへんの記述。

今回はサーバーの種類によって処理を分けたかったので、type的なpropertiesを持たせたかった。(ROLEとは別で)
その際に、propertiesをイジってみたのでまとめておきます。

host properties

HostのPropertiesは

server 'r1.example.com', KEY: VALUE

と書いておくと、

    on roles(:all) do | server |
     p  server.properties.KEY
    end

とする事で期待の値が取れます。 この値を元に各タスクで処理分岐とかが実装出来そうです。

余談ですが、 server.hostname server.roles ってやると、hostnameとかも取れます。

role properties

RoleのPropertiesはrolesで定義されているロール名をキーとしたプロパティを定義出来ます。 role定義がないものだと値は取れません。

<role名>: [{key: value,key: value},{key: value,key: value}]

# ex1
server 'dev.local', roles: %w{db web redis sentinel worker}, primary: true,
    redis: [ { name: 'resque', port: 6379, db: 0, downtime: 10, master: true },
             { name: 'resque', port: 6380, db: 0, downtime: 10 } ],
    sentinel: [ { port: 26379 }, { port: 26380 }, { port: 26381 } ]

serverコマンドで定義する例。


# ex2
role :redis, %w{ r1.example.com r2.example.com r3.example.com }, redis: { port: 6379, master: false },

roleコマンドで、定義する例
  role_properties(:sentinel) do |hostname, role, props|
    puts "Host: #{hostname}, Role: #{role}, #{props.inspect}"
  end

  role_properties(:sentinel) do |hostname, role, props|
    puts props[KEYS]
  end

KEYSにportとか指定すると、valueが取れる。

serverコマンドの際に、<role名> : {hash} が定義されているとrole_properties(<role名シンボル>)で、そのROLEに割り当てられたプロパティが取れます。 inspect はHashを見やすい文字列になおしてくれるRubyコマンドですね。

:sentinel の部分は、ロール名を指定しています。

Host: dev.local, Role: sentinel, {:port=>26379} Host: dev.local, Role: sentinel, {:port=>26380} Host: dev.local, Role: sentinel, {:port=>26381}

な感じで出力されます。