属性过滤
可以将选项传递给 roles()
方法(以及在 release_roles()
和 primary()
等方法中隐式传递),这些选项会影响返回的服务器集。这些选项采用作为最后一个参数传递的哈希的形式。哈希中的每个键值对都按声明顺序进行评估,如果所有键值对对于特定服务器都为真,则该服务器将被返回。键必须始终是符号,它们具有以下含义
-
:filter
或:select
:值为属性键名或 lambda,该 lambda 以服务器作为参数调用。该值必须返回 true 才能将服务器包含在内。 -
:exclude
:与上面相同,但该值必须返回 false 才能将服务器包含在内。 -
任何其他符号都被视为服务器属性名称,其值必须等于给定值。如果提供了 lambda,则不会调用它!
示例
server 'example1.com', roles: %w{web}, active: true
server 'example2.com', roles: %w{web}
server 'example3.com', roles: %w{app web}, active: true
server 'example4.com', roles: %w{app}, primary: true
server 'example5.com', roles: %w{db}, no_release: true, active: true
task :demo do
puts "All active release roles: 1,3"
release_roles(:all, filter: :active).each do |r|
puts "#{r.hostname}"
end
puts "All active roles: 1,3,5"
roles(:all, active: true).each do |r|
puts "#{r.hostname}"
end
puts "All web and db roles with selected names: 2,3"
roles(:web, :db, select: ->(s){ s.hostname =~ /[234]/}).each do |r|
puts "#{r.hostname}"
end
puts "All with no active property: 2,4"
roles(:all, active: nil).each do |r|
puts "#{r.hostname}"
end
puts "All except active: 2,4"
roles(:all, exclude: :active).each do |r|
puts "#{r.hostname}"
end
puts "All primary: 4"
roles(:all, select: :primary).each do |r|
puts "#{r.hostname}"
end
end