[chef] Re: using env attr to override a default


Chronological Thread 
  • From: AJ Christensen < >
  • To:
  • Subject: [chef] Re: using env attr to override a default
  • Date: Tue, 27 Sep 2011 19:59:50 +1300

Yo,

Your environments attributes are wrong:

On 27 September 2011 17:49,  
< >
 wrote:
>
> hello. after many, many years of cfengine, i'm wading thru a learning
> phase with chef, and loving it. bear with me while i get a handle on
> this. i'm trying to override an attribute in the postfix cookbook using
> an environment attribute. which cookbook it is doesn't matter. it's
> something fundamental i'm trying to grasp, and this is a simple example.
>
> let's say for my prod environment i want my postfix clients to use a
> certain mail relay, and for my dev environment i want them to use
> another. in the postfix cookbook attributes (the lowest precedence), i
> can set defaults.
>
> it's not working for me, and i'm wondering what i'm doing wrong. what i
> expect to have on my mail client node is a relayhost of
> mungbeans.dev.dorqtown.com, but what i'm getting is
> mailrelay.dev.dorqtown.com.
>
>
> first, the prod and dev environments:
>
>    [chef-repo]$ knife environment show dev
>    chef_type:            environment
>    cookbook_versions:
>    default_attributes:
>      mail-client:
>        relayhost:  mungbeans.dev.dorqtown.com
>      mail-server:
>        relayhost:  [smtp.gmail.com]:587
>    description:          Development environment (dev)
>    json_class:           Chef::Environment
>    name:                 dev
>    override_attributes:

this should be:
default_attributes "postfix" => { "relayhost" => "whatever" }

The attributes are deep merged together onto the node and thus the
atribute structure must remain the same. Does this make sense?

If you can post the on-disk, ruby version of the environment files I
can point out the problem, otherwise good luck!

–AJ

>
>
>    [chef-repo]$ knife environment show prod
>    chef_type:            environment
>    cookbook_versions:
>    default_attributes:
>      mail-client:
>        relayhost:  mailrelay.prod.dorqtown.com
>      mail-server:
>        relayhost:            [smtp.sendgrid.net]:587
>        smtp_fallback_relay:  [smtp.gmail.com]:587
>    description:          Production environment
>    json_class:           Chef::Environment
>    name:                 prod
>    override_attributes:
>
>
> a test node's run list:
>
>    [chef-repo]$ knife node show sous-chef1.dev.dorqtown.com -r
>    run_list:
>        role[base]
>        role[dns-client]
>        role[mail-client]
>        role[syslog-ng-client]
>        recipe[toolbin]
>
>
>    [chef-repo]$ knife role show mail-client -a run_list
>    run_list:             recipe[postfix]
>
>
> so, above, we know the "default" recipe is implied. i could've written
> this as recipe[postfix::default]. i wonder if this is biting me - in my
> attributes dir, i only have mail-client.rb and mail-server.rb, not
> default.rb. does that matter? i wonder how the chef-client run would
> parse either of those if run_list isn't recipe[postfix::mail-client] or
> recipe[postfix::mail-server].  i'm misunderstanding something on the use
> of the attributes dir. but let's get to it:
>
> the relayhost attribute:
>
>    [chef-repo]$ grep relayhost cookbooks/postfix/attributes/mail-client.rb
>    default[:postfix][:relayhost]  = "mailrelay.dev.dorqtown.com"
>
>    [chef-repo]$ grep relayhost cookbooks/postfix/attributes/mail-server.rb
>    default[:postfix][:relayhost]  = "[smtp.gmail.com]:587"
>
>
> a relevant portion of the template,
> postfix/templates/default/main.cf.erb. do i need to add logic to the
> template to first check for attribute coming from an env before the
> cookbook attributes file?
>
>
>    <% if node[:postfix][:mail_type] == "mail-server" -%>
>    relayhost = <%= node[:postfix][:relayhost] %>
>    smtp_fallback_relay = <%= node[:postfix][:relayhost] %>
>    mynetworks = <%= node[:postfix][:mail_relay_networks] %>
>    inet_interfaces = all
>    <% else -%>
>    relayhost = <%= node[:postfix][:relayhost] %>
>    mynetworks = <%= node[:postfix][:mail_relay_networks] %>
>    inet_interfaces = localhost
>    <% end -%>
>
>
>
> the resulting main.cf on a client:
>    ###
>    # Generated by Chef for sous-chef1.dev.dorqtown.com
>    # Configured as mail-client
>    ###
>    biff = no
>    append_dot_mydomain = yes
>    myhostname = sous-chef1.dev.dorqtown.com
>    mydomain = dev.dorqtown.com
>    myorigin = $myhostname
>    smtpd_banner = $myhostname ESMTP $mail_name
>    alias_maps = hash:/etc/aliases
>    alias_database = hash:/etc/aliases
>    mydestination = sous-chef1.dev.dorqtown.com, sous-chef1, 
> localhost.localdomain, localhost
>    relayhost = mailrelay.dev.dorqtown.com
>    mynetworks = 127.0.0.0/8
>    inet_interfaces = localhost
>    mailbox_size_limit = 0
>    recipient_delimiter = +
>
>
> above, i want the dev env attribute for relayhost, not the default one
> from cookbooks/postfix/attributes/mail-client.rb.
>
>
>
> and hmmm.. my test node running the mail-server role kept picking up the
> mail-client postfix config UNTIL i removed all attribute files from
> cookbooks/postfix/attributes EXCEPT for server.rb. hmmm. clearly i need
> to be schooled...
>
> thanks a lot,
> kallen
>
>
>



Archive powered by MHonArc 2.6.16.

§