rvlinden
2011-Jul-19 13:50 UTC
[Puppet Users] Variables in nodes classes and defines (headache)
All,
The entire puppet configuration I have is based on the rule that nodes
can only have variables and/or classes.
below are two examples how I configured puppet to deal with an apache
installation and addding users
The ''apache'' example does work perfectly, but the
''users'' example does
not and this is where I need your help
For example a node named apache.mydomain.com could be like this
node ''apache.mydomain.com'' {
# Variables
$apache_srv_version = "2.2.17-1"
$apache_vgname = "vg01"
# Classes
include apache::setup
}
Apache module
## init.pp
class apache {
require apache::params
}
## params.pp
class apache::params {
....
$package_version = $apache_srv_version ? {
"2.2.16" => "2.2.16-1.el5",
"2.2.16-1" => "2.2.16-1.el5",
"2.2.17" => "2.2.17-1.el5",
"2.2.17-1" => "2.2.17-1.el5",
default => "latest",
} # End package version
....
}
## setup.pp
class apache::setup inherits apache {
class { "apache::setup::pre1": stage => pre1 }
}
class apache::setup::pre1 inherits apache::setup {
package { $apache::params::package_name_modules:
ensure => "${apache::params::package_version}",
......
}
}
What happens is that the variable gets set in the node
''apache.mydomain.com''
$apache_srv_version = "2.2.17-1"
Then it''s evaluated in the apache::params class and the proper version
value is stored in $package_version
$package_version = $apache_srv_version ? { }
When the actual package get installed in apache::setup::pre1, the
value is retrieved from apache::params
ensure => "${apache::params::package_version}",
This all works like a charm and I have dozens of other classes which
work the same way as the apache class.
The module I have a problem with is my users module. This looks like
the apache module, but is slightly different (like the
''define'' used
instead of only classes)
Let me explain
node ''users.mydomain.com'' {
# Variables
$users_application_name = "ap1"
# Classes
include users::funcusers::was
}
## init.pp
define users (
$ensure = "present",
$username = "${title}",
$uid,
$gid,
$comment = "${username}",
$home = "/home/${username}",
$shell = "/bin/bash",
$system = "false",
$password = "",
$password_min_age = "0",
$password_max_age = "90",
$groups = "",
$membership = "",
$mode = "700",
$force = "false" ) {
#
# Load subclasses
include users::params
include users::virtual
#
# Required user settings
user { "${username}":
ensure => "${ensure}",
uid => "${uid}",
gid => "${gid}",
comment => "${comment}",
home => "${home}",
shell => "${shell}",
system => "${system}",
}
#
# Additional user settings
if $password != "" and
"${users::params::password_initialize}"
== "true" {
User["${username}"] {
password => "${password}",
}
}
if $groups != "" {
User["${username}"] {
groups => $groups,
}
}
if $membership != "" {
User["${username}"] {
membership => $membership,
}
}
if $password_min_age != "" and $centrify_mode == ""
{
User["${username}"] {
password_min_age => $password_min_age,
}
}
if $password_max_age != "" and $centrify_mode == ""
{
User["${username}"] {
password_max_age => $password_max_age,
}
}
#
# Create homedirectory
file { "${home}":
ensure => $ensure ? {
"present" => "directory",
"absent" => "absent",
default => "directory",
},
owner => "${uid}",
group => "${gid}",
mode => "${mode}",
force => "${force}",
require => User["${username}"],
}
}
## params.pp
class users::params {
$users_applications = $users_application_name ? {
"ap1" => "ap1",
"ap1" => "ap2",
default => "unknown",
}
}
## funcusers.pp
import "funcusers/*.pp"
class users::funcusers inherits users::virtual {
$user_type = "funcusers"
}
## funcusers/was.pp
class users::funcusers::was inherits users::funcusers {
case $users::params::users_applications {
"ap1": { Users <| title == was |> <- Group
<| title
== ap1 |> }
"ap2": { Users <| title == was |> <- Group
<| title
== ap2 |> }
default: { Users <| title == was |> <- Group <|
title
== was |> }
}
}
## virtual.pp
class users::virtual {
require users::params
class { "users::virtual::init": stage => init }
}
class users::virtual::init inherits users::virtual {
@group { "was": gid =>
"${users::params::gid_was}" }
@group { "ap1": gid =>
"${users::params::gid_ap1}" }
@group { "ap2": gid =>
"${users::params::gid_ap2}" }
@users {
"was":
uid => "123",
gid =>
$users::params::users_applications ? {
"ap1" => "$
{users::params::gid_ap1}",
"ap2" => "$
{users::params::gid_ap2}",
default => "$
{users::params::gid_was}",
},
groups => "extra",
comment => "Functional user $
{users::params::users_applications}";
}
}
When puppet runs, the variable set in the host
''users.mydomain.com''
$users_application_name = "ap1"
is ignored and does not seem to be ''known'' to the other
subclassess
(like params) and therefore ap1 will never be used, but always the
defaults
I know the users module and the way I have created it DOES work,
because when I copy the same variable line from the node directly into
the params class everything works fine
class users::params {
$users_application_name = "ap1"
$users_applications = $users_application_name ? {
"ap1" => "ap1",
"ap1" => "ap2",
default => "unknown",
}
}
the $users_applications will have ''ap1'' as value and will
create the
user ''was'' with the gid of ap1 and put ap1 in the user
comment.
Can somebody explain me what I am doing wrong here ? or what I have
missed ?
WHy does the apache params ''see'' the variable frmo the node
config and
the users params not ?
FYI,
I use puppet version 2.6.8 (and also tested with 2.6.9) on a RHEL5
server with ruby 1.8.5
--
You received this message because you are subscribed to the Google Groups
"Puppet Users" group.
To post to this group, send email to puppet-users@googlegroups.com.
To unsubscribe from this group, send email to
puppet-users+unsubscribe@googlegroups.com.
For more options, visit this group at
http://groups.google.com/group/puppet-users?hl=en.
vagn scott
2011-Jul-19 15:15 UTC
Re: [Puppet Users] Variables in nodes classes and defines (headache)
On 07/19/2011 09:50 AM, rvlinden wrote:> Can somebody explain me what I am doing wrong here ? or what I have > missed ? > WHy does the apache params ''see'' the variable frmo the node config and > the users params not ? >bad news: your apache class relies on dynamically scoped variables. When dyn. scope goes away your apache class will break, too. The solution to both is to pass in your variables in the argument list to a define or parameterized class. What might work for you immediately is to include users::params in the node before including funcusers. -- vagn -- You received this message because you are subscribed to the Google Groups "Puppet Users" group. To post to this group, send email to puppet-users@googlegroups.com. To unsubscribe from this group, send email to puppet-users+unsubscribe@googlegroups.com. For more options, visit this group at http://groups.google.com/group/puppet-users?hl=en.