[chef] Re: Re: Overriding attributes


Chronological Thread 
  • From: Daniel DeLeo < >
  • To:
  • Subject: [chef] Re: Re: Overriding attributes
  • Date: Wed, 19 Mar 2014 08:17:33 -0700

On Tuesday, March 18, 2014 at 11:55 AM, DV wrote:
> Ran into this issue today so thought I'd revive this thread.
>  
> I'm using postgresql cookbook with chef-solo and cookbook attributes
> aren't merged together with attributes set in .json file passed to
> chef-solo. Instead .json file attributes override those set in
> cookbook.
>  
> Here's what's in postgresql/attributes/default.rb:
> ...
> default['postgresql']['pg_hba'] = [
> {:type => 'local', :db => 'all', :user => 'postgres', :addr => nil,
> :method => 'ident'},
> {:type => 'local', :db => 'all', :user => 'all', :addr => nil,
> :method => 'ident'},
> {:type => 'host', :db => 'all', :user => 'all', :addr =>
> '127.0.0.1/32', :method => 'md5'},
> {:type => 'host', :db => 'all', :user => 'all', :addr => '::1/128',
> :method => 'md5'}
> ]
> ...
>  
> Here's what in my .json file:
> ...
> {
> ...
> "postgresql": {
> ...
> "pg_hba": [
> { "type": "host", "db": "replication", "user": "postgres",
> "addr": "10.0.0.0/8", "method": "trust" }
> ],
> ...
> "run_list": [ "recipe[postgresql::server]" ]
> }
>  
> Resulting pg_hba.conf has only one line in it:
>  
> host replication postgres 10.0.0.0/8 trust
>  
> Since node[:postgresq][:pg_hba] is an array attribute, it should be
> merged rather than overwritten.
>  
> The behavior is same with chef-solo 10.28.0 and 11.6.0.
>  
> I'll go ahead and submit that as a defect unless someone thinks it's
> intended behavior.
>  
> On Fri, Jun 28, 2013 at 1:55 AM, Jeffrey Jones 
> <
>  
> (mailto: )>
>  wrote:
> > Hello all
> >  
> > I have a list of default users I would like for my DB and am attempting to
> > combine them with ones set in an attribute.json file used by chef solo. 
> > The
> > relevant code is below
> >  
> > https://gist.github.com/rurounijones/5883385
> >  
> > If there is nothing set in the json file then it write the 3 default 
> > values
> > to pg_hba.conf
> >  
> > However if there are values set in the json then ONLY the values in the
> > .json file are used. They are not merged in with the default_db_users
> > despite my setting of them (I tried everything up to force_override which,
> > as far as I see it, should take precedence),
> >  
> > Am I missing something here?
> >  
> > Cheers
> >  
> > Jeff
>  
>  
>  
> --  
> Best regards, Dmitriy V.


Arrays are difficult to get right, because the behavior you want totally 
depends on what your use case is. For example, you might use an array to 
specify a list of ports that a server should bind to. So your cookbook might 
specify, say, port 80 and 443 for an HTTP server. If arrays merged in a 
purely additive way, then you would not be able to specify that the server 
should listen only on, say, 8000 and 8443.

Chef attempts to reach a compromise by merging arrays within precedence 
levels, that is, default attributes regardless of source (environment, role, 
cookbook) are merged, as are override attributes from those sources. Arrays 
are replaced between different precedence levels, however, so when you use 
`-j SOME_JSON`, these become “normal” level attributes, where arrays will 
replace anything set at the “default” level (which is what cookbooks 
typically do).  

Your best bet is to work with the cookbook maintainer to come up with a 
non-array-based attributes API, which will behave the way you want.

--  
Daniel DeLeo






Archive powered by MHonArc 2.6.16.

§