Slide 28
Slide 28 text
Load Balancing a Dynamic Infrastructure @kevinreedy
Real World Example
if Chef::Config[:solo]
Chef::Log.warn('This recipe uses search. Chef Solo does not support search.')
else
services = Chef::DataBagItem.load('belly-platform', 'portmap')
services['services'].each do |service_name, service_attr|
servers = Array.new
!
search_keys = {
'name' => ['name'],
'ipaddress' => ['ipaddress']
}
!
partial_search(:node, "recipe:belly-service\\:\\:#{ service_name } AND chef_environment:#{ node.chef_environment }", keys: search_keys).each
do |result|
servers.push(
'host' => result['ipaddress'],
'port' => service_attr['port'],
'comment' => result['name']
)
end
!
unless servers.empty?
# Generate site config
template "#{ node['nginx']['dir'] }/sites-available/#{ service_name }" do
source "simple-site.erb"
mode 0444
owner "root"
group "root"
variables(
'service_name' => service_name,
'service_comment' => service_attr['comment'],
'domain_name' => "#{ service_name }.#{ node['belly']['lb']['domain'] }"
'servers' => servers,
'ssl_cert' => "#{ node['belly']['lb']['cert_name'] }.crt",
'ssl_key' => "#{ node['belly']['lb']['cert_name'] }.key"
)
notifies :reload, 'service[nginx]'
end
!
# Enable site
nginx_site service_name
end
end
end