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}
な感じで出力されます。