属性过滤

可以将选项传递给 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
Fork me on GitHub