- From: Ash Berlin <
>
- To:
- Subject: [chef] Re: Dynamically building attributes (ie. via search) for cross-service, cross-node configuration
- Date: Tue, 28 Dec 2010 16:37:12 +0000
On 28 Dec 2010, at 16:25, Charles Duffy wrote:
>
Howdy!
>
>
I'm trying to figure out the best way to leverage Chef's attributes for
>
configuring a firewall. For the scenario in question, I'm using the
>
following cookbooks:
>
>
- memcached <- unmodified upstream (except for CentOS support)
>
- shorewall <- local, intend to contribute eventually
>
- appserver-mysite
>
- memcached-mysite
>
>
memcached-mysite includes both memcached and shorewall, and needs to tell
>
shorewall to add rules allowing incoming connections to the local memcached
>
instance from all systems having role[appserver-mysite]. Thus, I would like
>
to do something like the following in memcached-mysite's
>
attributes/default.rb:
>
>
set[:shorewall][:rules] = [] # this will get merged, not overwrite, correct?
>
search(:node, 'role\[appserver-mysite\]').each do |matching_node|
>
local_addresses = []
>
matching_node["network"]["interfaces"].each_pair do |ifname, ifdata|
>
interface_addresses = ifdata["addresses"].find{ |k,v| k =~
>
/^192[.]168[.]/ }
>
if interface_addresses; then
>
local_addresses = local_addresses + interface_addresses
>
end
>
end
>
internal_ips =
>
matching_node["network"]["interfaces"]["eth0"]["addresses"].find{ |k,v| k
>
=~ /^192[.]168[.]/ } # FIXME: support other private ranges
>
if ! internal_ips; then break; end
>
internal_ips.each do |internal_ip|
>
set[:shorewall][:rules] << {
>
:description => "Allow app server #{node["name"]} access to
>
memcached",
>
:action => :accept,
>
:source => "lan:#{internal_ip}",
>
:dest => :fw,
>
:proto => "tcp",
>
:port => "11211"
>
}
>
end
>
end
>
>
...such that the shorewall recipe, in creating the rules file, can have its
>
template simply iterate over the full contents of node[:shorewall][:rules],
>
and use information appended by the memcached-mysite recipe (as well as
>
dbserver-mysite, and any other such cookbooks as may be applied). (By the
>
way -- while this uses search, I'm not sure I like that -- trusting
>
something as important as firewall configuration to a search engine which
>
could potentially be out-of-date makes me a little uncomfortable).
>
>
Unfortunately, it doesn't appear to me that I can do this quite the way I
>
want. I understand that search is only available in recipes, not
>
attributes, and while I could update the attributes from within a recipe,
>
this loses ordering guarantees (such that if the same node is both a
>
memcache server and a database server -- very likely on a development
>
system -- only the first set of attributes might be in place at the time
>
when the firewall rules are applied).
>
>
How can I build up a description of my firewall rules using knowledge of
>
the other nodes' configuration, and ensure that this information is
>
available when the templates are applied?
>
>
Thanks!
I have a similar sort of thing for setting up DB users/pass from the app
servers to my DB servers - I use data bags:
https://gist.github.com/757395
Does this give you some pointers?
Further: why do you need it in an attribute? Can you not just have the
template block setup the variables as needed?
-ash
Archive powered by MHonArc 2.6.16.