group type

175 views
Skip to first unread message

Stuart Cracraft

unread,
Nov 18, 2013, 7:15:41 PM11/18/13
to puppet...@googlegroups.com
Hi.
 
Created:
 
class mumble {
  :
  random stuff
  :
}
 
class mumble:grouper inherits mumble {
  group { "somegroup":
     name => 'somegroup',
     members => 'user1,user2,user3',
     ensure => present,
     gid => 123,
  }
}
 
After a time, mumble:grouper ran, before I added
user2, and user3 and /etc/group shows:
 
  somegroup:x:500:
 
but it doesn't show what it should show which is:
 
  somegroup:x:500:user1,user2,user3
 
I verified that user1/2/3 all exist in /etc/passwd.
 
My question is, why isn't Puppet making the right memberships?
 
Do I misunderstand member?
 
Stuart
 
 
 

Matthaus Owens

unread,
Nov 18, 2013, 7:34:50 PM11/18/13
to Puppet Users
Stuart,
In the type reference, the members property states that it requires
the 'manages members' feature
(http://docs.puppetlabs.com/references/latest/type.html#group-provider-features),
which is available in the aix, directory service, pw and windows_adsi
providers, but not the ldap or groupadd providers. Which provider is
being used for your group resource?
> --
> You received this message because you are subscribed to the Google Groups
> "Puppet Users" group.
> To unsubscribe from this group and stop receiving emails from it, send an
> email to puppet-users...@googlegroups.com.
> To view this discussion on the web visit
> https://groups.google.com/d/msgid/puppet-users/8585e0e1-5063-47c7-bb8b-5b086df1df1e%40googlegroups.com.
> For more options, visit https://groups.google.com/groups/opt_out.



--
Matthaus Owens
Release Manager, Puppet Labs

Join us at PuppetConf 2014, September 23-24 in San Francisco

Stuart Cracraft

unread,
Nov 18, 2013, 7:37:04 PM11/18/13
to puppet...@googlegroups.com
 
Just local password file and group files mostly. But some ldap.

Matthaus Owens

unread,
Nov 18, 2013, 7:55:59 PM11/18/13
to Puppet Users
Stuart,
Unfortunately, that doesn't tell us which provider is being used. A
run with --debug should show which providers are being used.

In a test run using the debug flag on a centos 6 box using the group
resource you provided, I got output which included:
'Debug: /Group[somegroup]: Provider groupadd does not support features
manages_members; not managing attribute members'.

If you post the result of running:

puppet apply --debug --exec "group { "somegroup":
name => 'somegroup',
members => 'user1,user2,user3',
ensure => present,
gid => 123,
}"

that would help determine which group provider is being used and why
member management isn't being applied.
> https://groups.google.com/d/msgid/puppet-users/c5535875-e7a5-47cf-8113-96b2ee6e1334%40googlegroups.com.

Stuart Cracraft

unread,
Nov 18, 2013, 9:07:20 PM11/18/13
to puppet...@googlegroups.com
Here it is:
 

[root@ca-sna-pm01 manifests]# puppet apply --debug --exec "  group { "bb":

    name => 'bb',

    ensure => present,

    gid => 500,

    members => 'bb,mtg',

}

"

> > > > > >

[0;36mDebug: Puppet::Type::Group::ProviderLdap: true value when expecting false[0m

[0;36mDebug: Puppet::Type::Group::ProviderDirectoryservice: file /usr/bin/dscl does not exist[0m

[0;36mDebug: Puppet::Type::Group::ProviderPw: file pw does not exist[0m

[0;36mDebug: /Group[bb]: Provider groupadd does not support features manages_members; not managing attribute members[0m

[0;36mDebug: /Group[bb]: Provider groupadd does not support features libuser; not managing attribute forcelocal[0m

[0;36mDebug: Creating default schedules[0m

[0;36mDebug: Using settings: adding file resource 'vardir': 'File[/var/lib/puppet]{:links=>:follow, :ensure=>:directory, :backup=>false, :loglevel=>:debug, :path=>"/var/lib/puppet"}'[0m

[0;36mDebug: Using settings: adding file resource 'client_datadir': 'File[/var/lib/puppet/client_data]{:links=>:follow, :ensure=>:directory, :backup=>false, :mode=>"750", :loglevel=>:debug, :path=>"/var/lib/puppet/client_data"}'[0m

 

[0;36mDebug: Puppet::Type::User::ProviderLdap: true value when expecting false[0m

[0;36mDebug: Puppet::Type::User::ProviderDirectoryservice: file /usr/bin/dsimport does not exist[0m

[0;36mDebug: Puppet::Type::User::ProviderPw: file pw does not exist[0m

[0;36mDebug: Puppet::Type::User::ProviderUser_role_add: file roledel does not exist[0m

[0;36mDebug: /User[puppet]: Provider useradd does not support features libuser; not managing attribute forcelocal[0m

[0;36mDebug: Using settings: adding file resource 'hostpubkey': 'File[/var/lib/puppet/ssl/public_keys/ca-sna-pm01.mercurytechnology.com.pem]{:links=>:follow, :ensure=>:file, :backup=>false, :owner=>"puppet", :mode=>"644", :loglevel=>:debug, :path=>"/var/lib/puppet/ssl/public_keys/ca-sna-pm01.mercurytechnology.com.pem"}'[0m

[0;36mDebug: Using settings: adding file resource 'rundir': 'File[/var/run/puppet]{:links=>:follow, :ensure=>:directory, :backup=>false, :mode=>"755", :loglevel=>:debug, :path=>"/var/run/puppet"}'[0m

[0;36mDebug: Using settings: adding file resource 'libdir': 'File[/var/lib/puppet/lib]{:links=>:follow, :ensure=>:directory, :backup=>false, :loglevel=>:debug, :path=>"/var/lib/puppet/lib"}'[0m

[0;36mDebug: Using settings: adding file resource 'publickeydir': 'File[/var/lib/puppet/ssl/public_keys]{:links=>:follow, :ensure=>:directory, :backup=>false, :owner=>"puppet", :loglevel=>:debug, :path=>"/var/lib/puppet/ssl/public_keys"}'[0m

[0;36mDebug: Using settings: adding file resource 'privatedir': 'File[/var/lib/puppet/ssl/private]{:links=>:follow, :ensure=>:directory, :backup=>false, :owner=>"puppet", :mode=>"750", :loglevel=>:debug, :path=>"/var/lib/puppet/ssl/private"}'[0m

[0;36mDebug: /Group[puppet]: Provider groupadd does not support features libuser; not managing attribute forcelocal[0m

[0;36mDebug: Using settings: adding file resource 'logdir': 'File[/var/log/puppet]{:links=>:follow, :group=>"puppet", :ensure=>:directory, :backup=>false, :owner=>"puppet", :mode=>"750", :loglevel=>:debug, :path=>"/var/log/puppet"}'[0m

[0;36mDebug: Using settings: adding file resource 'statefile': 'File[/var/lib/puppet/state/state.yaml]{:links=>:follow, :ensure=>:file, :backup=>false, :mode=>"660", :loglevel=>:debug, :path=>"/var/lib/puppet/state/state.yaml"}'[0m

[0;36mDebug: Using settings: adding file resource 'hostcert': 'File[/var/lib/puppet/ssl/certs/ca-sna-pm01.mercurytechnology.com.pem]{:links=>:follow, :ensure=>:file, :backup=>false, :owner=>"puppet", :mode=>"644", :loglevel=>:debug, :path=>"/var/lib/puppet/ssl/certs/ca-sna-pm01.mercurytechnology.com.pem"}'[0m

[0;36mDebug: Using settings: adding file resource 'clientbucketdir': 'File[/var/lib/puppet/clientbucket]{:links=>:follow, :ensure=>:directory, :backup=>false, :mode=>"750", :loglevel=>:debug, :path=>"/var/lib/puppet/clientbucket"}'[0m

[0;36mDebug: Using settings: adding file resource 'localcacert': 'File[/var/lib/puppet/ssl/certs/ca.pem]{:links=>:follow, :ensure=>:file, :backup=>false, :owner=>"puppet", :mode=>"644", :loglevel=>:debug, :path=>"/var/lib/puppet/ssl/certs/ca.pem"}'[0m

[0;36mDebug: Using settings: adding file resource 'hostcrl': 'File[/var/lib/puppet/ssl/crl.pem]{:links=>:follow, :ensure=>:file, :backup=>false, :owner=>"puppet", :mode=>"644", :loglevel=>:debug, :path=>"/var/lib/puppet/ssl/crl.pem"}'[0m

[0;36mDebug: Using settings: adding file resource 'lastrunfile': 'File[/var/lib/puppet/state/last_run_summary.yaml]{:links=>:follow, :ensure=>:file, :backup=>false, :mode=>"644", :loglevel=>:debug, :path=>"/var/lib/puppet/state/last_run_summary.yaml"}'[0m

[0;36mDebug: Using settings: adding file resource 'certdir': 'File[/var/lib/puppet/ssl/certs]{:links=>:follow, :ensure=>:directory, :backup=>false, :owner=>"puppet", :loglevel=>:debug, :path=>"/var/lib/puppet/ssl/certs"}'[0m

[0;36mDebug: Using settings: adding file resource 'graphdir': 'File[/var/lib/puppet/state/graphs]{:links=>:follow, :ensure=>:directory, :backup=>false, :loglevel=>:debug, :path=>"/var/lib/puppet/state/graphs"}'[0m

[0;36mDebug: Using settings: adding file resource 'requestdir': 'File[/var/lib/puppet/ssl/certificate_requests]{:links=>:follow, :ensure=>:directory, :backup=>false, :owner=>"puppet", :loglevel=>:debug, :path=>"/var/lib/puppet/ssl/certificate_requests"}'[0m

[0;36mDebug: Using settings: adding file resource 'confdir': 'File[/etc/puppet]{:links=>:follow, :ensure=>:directory, :backup=>false, :loglevel=>:debug, :path=>"/etc/puppet"}'[0m

[0;36mDebug: Using settings: adding file resource 'clientyamldir': 'File[/var/lib/puppet/client_yaml]{:links=>:follow, :ensure=>:directory, :backup=>false, :mode=>"750", :loglevel=>:debug, :path=>"/var/lib/puppet/client_yaml"}'[0m

[0;36mDebug: Using settings: adding file resource 'hostprivkey': 'File[/var/lib/puppet/ssl/private_keys/ca-sna-pm01.mercurytechnology.com.pem]{:links=>:follow, :ensure=>:file, :backup=>false, :owner=>"puppet", :mode=>"600", :loglevel=>:debug, :path=>"/var/lib/puppet/ssl/private_keys/ca-sna-pm01.mercurytechnology.com.pem"}'[0m

[0;36mDebug: Using settings: adding file resource 'resourcefile': 'File[/var/lib/puppet/state/resources.txt]{:links=>:follow, :ensure=>:file, :backup=>false, :owner=>"root", :mode=>"640", :loglevel=>:debug, :path=>"/var/lib/puppet/state/resources.txt"}'[0m

[0;36mDebug: Using settings: adding file resource 'statedir': 'File[/var/lib/puppet/state]{:links=>:follow, :ensure=>:directory, :backup=>false, :mode=>"1755", :loglevel=>:debug, :path=>"/var/lib/puppet/state"}'[0m

[0;36mDebug: Using settings: adding file resource 'lastrunreport': 'File[/var/lib/puppet/state/last_run_report.yaml]{:links=>:follow, :ensure=>:file, :backup=>false, :mode=>"640", :loglevel=>:debug, :path=>"/var/lib/puppet/state/last_run_report.yaml"}'[0m

[0;36mDebug: Using settings: adding file resource 'httplog': 'File[/var/log/puppet/http.log]{:links=>:follow, :ensure=>:file, :backup=>false, :owner=>"root", :mode=>"640", :loglevel=>:debug, :path=>"/var/log/puppet/http.log"}'[0m

[0;36mDebug: Using settings: adding file resource 'ssldir': 'File[/var/lib/puppet/ssl]{:links=>:follow, :ensure=>:directory, :backup=>false, :owner=>"puppet", :mode=>"771", :loglevel=>:debug, :path=>"/var/lib/puppet/ssl"}'[0m

[0;36mDebug: Using settings: adding file resource 'privatekeydir': 'File[/var/lib/puppet/ssl/private_keys]{:links=>:follow, :ensure=>:directory, :backup=>false, :owner=>"puppet", :mode=>"750", :loglevel=>:debug, :path=>"/var/lib/puppet/ssl/private_keys"}'[0m

[0;36mDebug: /File[/var/lib/puppet/ssl/public_keys]: Autorequiring File[/var/lib/puppet/ssl][0m

[0;36mDebug: /File[/var/lib/puppet/state/last_run_report.yaml]: Autorequiring File[/var/lib/puppet/state][0m

[0;36mDebug: /File[/var/lib/puppet/state/state.yaml]: Autorequiring File[/var/lib/puppet/state][0m

[0;36mDebug: /File[/var/lib/puppet/clientbucket]: Autorequiring File[/var/lib/puppet][0m

[0;36mDebug: /File[/var/lib/puppet/state/last_run_summary.yaml]: Autorequiring File[/var/lib/puppet/state][0m

[0;36mDebug: /File[/var/lib/puppet/ssl/private]: Autorequiring File[/var/lib/puppet/ssl][0m

[0;36mDebug: /File[/var/lib/puppet/client_yaml]: Autorequiring File[/var/lib/puppet][0m

[0;36mDebug: /File[/var/lib/puppet/ssl/crl.pem]: Autorequiring File[/var/lib/puppet/ssl][0m

[0;36mDebug: /File[/var/lib/puppet/ssl/public_keys/ca-sna-pm01.mercurytechnology.com.pem]: Autorequiring File[/var/lib/puppet/ssl/public_keys][0m

[0;36mDebug: /File[/var/lib/puppet/ssl/private_keys/ca-sna-pm01.mercurytechnology.com.pem]: Autorequiring File[/var/lib/puppet/ssl/private_keys][0m

[0;36mDebug: /File[/var/lib/puppet/ssl/certificate_requests]: Autorequiring File[/var/lib/puppet/ssl][0m

[0;36mDebug: /File[/var/lib/puppet/ssl/certs]: Autorequiring File[/var/lib/puppet/ssl][0m

[0;36mDebug: /File[/var/lib/puppet/ssl/certs/ca.pem]: Autorequiring File[/var/lib/puppet/ssl/certs][0m

[0;36mDebug: /File[/var/lib/puppet/lib]: Autorequiring File[/var/lib/puppet][0m

[0;36mDebug: /File[/var/lib/puppet/client_data]: Autorequiring File[/var/lib/puppet][0m

[0;36mDebug: /File[/var/lib/puppet/state]: Autorequiring File[/var/lib/puppet][0m

[0;36mDebug: /File[/var/lib/puppet/ssl/certs/ca-sna-pm01.mercurytechnology.com.pem]: Autorequiring File[/var/lib/puppet/ssl/certs][0m

[0;36mDebug: /File[/var/log/puppet/http.log]: Autorequiring File[/var/log/puppet][0m

[0;36mDebug: /File[/var/lib/puppet/state/graphs]: Autorequiring File[/var/lib/puppet/state][0m

[0;36mDebug: /File[/var/lib/puppet/ssl/private_keys]: Autorequiring File[/var/lib/puppet/ssl][0m

[0;36mDebug: /File[/var/lib/puppet/ssl]: Autorequiring File[/var/lib/puppet][0m

[0;36mDebug: /File[/var/lib/puppet/state/resources.txt]: Autorequiring File[/var/lib/puppet/state][0m

 

[0;36mDebug: Finishing transaction 70000528421020[0m

[0;36mDebug: Loaded state in 0.00 seconds[0m

[0;36mDebug: Loaded state in 0.00 seconds[0m

[0;32mInfo: Applying configuration version '1384804821'[0m

[0;36mDebug: /Schedule[daily]: Skipping device resources because running on a host[0m

[0;36mDebug: /Schedule[monthly]: Skipping device resources because running on a host[0m

[0;36mDebug: /Schedule[hourly]: Skipping device resources because running on a host[0m

[0;36mDebug: /Schedule[never]: Skipping device resources because running on a host[0m

[0;36mDebug: /Schedule[weekly]: Skipping device resources because running on a host[0m

[0;36mDebug: /Schedule[puppet]: Skipping device resources because running on a host[0m

[0;36mDebug: Finishing transaction 70000527187220[0m

[0;36mDebug: Storing state[0m

[0;36mDebug: Stored state in 0.03 seconds[0m

[mNotice: Finished catalog run in 0.16 seconds[0m

[0;36mDebug: Using settings: adding file resource 'rrddir': 'File[/var/lib/puppet/rrd]{:links=>:follow, :group=>"puppet", :ensure=>:directory, :backup=>false, :owner=>"puppet", :mode=>"750", :loglevel=>:debug, :path=>"/var/lib/puppet/rrd"}'[0m

[0;36mDebug: Finishing transaction 70000528357160[0m

[0;36mDebug: Received report to process from ca-sna-pm01.mercurytechnology.com[0m

[0;36mDebug: Processing report from ca-sna-pm01.mercurytechnology.com with processor Puppet::Reports::Store[0m

[root@ca-sna-pm01 manifests]# [root@ca-sna-pm01 manifests]# [root@ca-sna-pm01 manifests]# [root@ca-sna-pm01 manifests]#

[root@ca-sna-pm01 manifests]#

[root@ca-sna-pm01 manifests]#

[root@ca-sna-pm01 manifests]# !eg

egrep bb /etc/group /etc/passwd

/etc/group:bb:x:500:

/etc/passwd:bb:x:500:500:bb:/home/bb:/bin/bash

[root@ca-sna-pm01 manifests]#

 

Matthaus Owens

unread,
Nov 18, 2013, 9:15:49 PM11/18/13
to Puppet Users
Stuart,
Your run also has "[0;36mDebug: /Group[bb]: Provider groupadd does not
support features manages_members; not managing attribute members",
which indicates the groupadd provider is being used. The groupadd
provider does not support the members property. If your end goal is to
have those users be members of the group, using the groups property of
the user resource will do what you want
(http://docs.puppetlabs.com/references/latest/type.html#user-attribute-groups)

Something like:
group { "somegroup":
name => 'somegroup',
ensure => present,
gid => 123,
}

user { ["user1","user2","user3"]:
groups => "somegroup",
ensure => present,
require => Group["somegroup"],
}

Would probably work (and worked for me in a local test run).
> https://groups.google.com/d/msgid/puppet-users/87b33ab4-e69a-4eb5-9894-fb4ddd954824%40googlegroups.com.

Rich Burroughs

unread,
Nov 18, 2013, 11:47:10 PM11/18/13
to puppet...@googlegroups.com
I bet members needs to be an array when you specify more than one value.



--

Rich Burroughs

unread,
Nov 19, 2013, 12:16:05 AM11/19/13
to puppet...@googlegroups.com
Oops my mail client hadn't loaded the replies, it looks like Matthaus has it. But yeah you do also need to use arrays when there are multiple values.


Rich

Stuart Cracraft

unread,
Nov 19, 2013, 12:31:41 AM11/19/13
to puppet...@googlegroups.com
Is there a way to assign the uids in the user {["user1", "user2"]: .... } expression?
To unsubscribe from this group and stop receiving emails from it, send an email to puppet-users+unsubscribe@googlegroups.com.

Rich Burroughs

unread,
Nov 19, 2013, 4:41:39 AM11/19/13
to puppet...@googlegroups.com
If you really mean assign, no. UIDs are managed through the user resource type:



Rich
To unsubscribe from this group and stop receiving emails from it, send an email to puppet-users...@googlegroups.com.
To view this discussion on the web visit https://groups.google.com/d/msgid/puppet-users/6b1c2004-54bd-4ea1-bd5b-513a94447caf%40googlegroups.com.

Stuart Cracraft

unread,
Nov 19, 2013, 5:10:22 AM11/19/13
to puppet...@googlegroups.com
Thanks.

You received this message because you are subscribed to a topic in the Google Groups "Puppet Users" group.
To unsubscribe from this topic, visit https://groups.google.com/d/topic/puppet-users/39Qwntp2yrs/unsubscribe.
To unsubscribe from this group and all its topics, send an email to puppet-users...@googlegroups.com.
To view this discussion on the web visit https://groups.google.com/d/msgid/puppet-users/CAPGcbtCADPaop9QazQd3YGbZK%2BtX72OktuHKoyVt4OrbWf-KLg%40mail.gmail.com.

jcbollinger

unread,
Nov 19, 2013, 2:35:51 PM11/19/13
to puppet...@googlegroups.com


On Monday, November 18, 2013 10:41:39 PM UTC-6, Rich Burroughs wrote:
If you really mean assign, no. UIDs are managed through the user resource type:





Well, that's what Stuart is using.  He switched up on you.

I take the question to be "is there a way to declare different UIDs for different users in an array-titled User declaration?".  The basic answer is "not as such".  The whole point of the array-title resource declaration shortcut is that all the resources declared via any one such declaration get the same parameter declarations.

That does not mean you cannot both use compact forms and assign different parameters per user, however.  There are several alternatives.  One of the simpler ones is to use resource parameter defaults (beware: unlike variables, parameter defaults have dynamic scope) and multiple-distinct resources per resource declaration block.  Example:

class mymodule::users {
  # These default parameters apply to all Users declared
  # in this dynamic scope:
  User {
    ensure     => 'present',
    gid        => 'users',
    managehome => true,
    shell      => '/bin/bash'
  }

  # such as these:
  user {
    'alice':   uid => 501;
    'bob':     uid => 502;
    'charlie': uid => 503;
  }
}


Another alternative is to use a defined-type wrapper to adapt your data source to the User resource type:

class mymodule {
  # A data source:
  $user_uids = {
    'david' => 504,
    'emily' => 505,
    'frank' => 506
  }
}

# An adapter definition:
define mymodule::local_user(
    $ensure = 'present',
    $gid = 'users',
    $managehome = 'true',
    $shell = '/bin/bash') {
  include 'mymodule'
  user { $title:
    ensure => $ensure,
    # Here's where the magic happens:
    uid => $mymodule::user_uids[$title],
    gid => $gid,
    managehome => $managehome,
    shell => $shell
  }
}

# The resource-declaring class:
class mymodule::other_users {
  include 'mymodule'
  # The keys() function is from the puppetlabs-stdlib module
  $declared_users = keys($mymodule::user_uids)
  mymodule::local_user { $declared_users: }
}


That's not an improvement for so few users, but by the time you get up even to tens of users it's a win.  Moreover, it's all driven by the single data source, so you there is no risk of different data sources falling out of sync with each other.

If the point is to keep your manifests simple, but you don't mind the data being complex and repetitive, then you also have the option of declaring multiple resources of the same type with whatever parameters you want via the built-in create_resources() function.  That might make sense if the data are being loaded from an external source, perhaps via Hiera (recommended):

class my_module::still_more_users {
  $user_data = hiera('still_more_users')
  create_resources('user', $user_data)
}


You can't get much simpler than that on the manifest side, but you need to express all the non-default parameter values in the data.


John

Reply all
Reply to author
Forward
0 new messages