如何使用puppet脚本创建具有相同名称的主组的用户?

时间:2015-08-19 21:11:53

标签: linux puppet

我正在阅读this article并建议使用此代码创建用户:

user { 'myuser':
  ensure     => present,
  uid        => '1000',
  gid        => '1000',
  shell      => '/bin/bash',
  home       => '/home/myuser'
}

但是,当我运行它时,会抛出以下错误:

  

错误:无法创建用户myuser:执行'/ usr / sbin / useradd -g 1000 -G wheel -d / home / myuser -s / bin / bash -u 1000 -M myuser'返回6:useradd:组'1000'不存在

我使用了以下内容:

group {'myuser':
  ensure     => present
}

user { 'myuser':
  ensure     => present,
  uid        => '1000',
  gid        => 'myuser',
  shell      => '/bin/bash',
  home       => '/home/myuser'
}

但我不确定是否是正确的方法。有没有办法通过使用user木偶资源来实现我想要的东西?

2 个答案:

答案 0 :(得分:1)

我认为答案取决于您用于创建用户的操作系统和/或提供商。在您的配置中,它是useradd。根据{{​​3}},与-g选项一起使用时:

  

组名必须存在。组号必须指代已存在的组。

可能的解决方案是删除gid

user { 'myuser':
    ensure     => present,
    uid        => '1020',
    shell      => '/bin/bash',
    home       => '/home/myuser',
    managehome => true,
}

然后木偶会自动创建poper组:

  

root @ vagrant-ubuntu-trusty-64:/ home#su myuser

     

myuser @ vagrant-ubuntu-trusty-64:/ home $ id

     

uid = 1020(myuser)gid = 1020(myuser)groups = 1020(myuser)

好主意是添加选项managehome => true,。它会:

  

在ensure =>时创建主目录出现,并在确认=>时删除主目录缺席

答案 1 :(得分:0)

这实际上非常简单,Puppet试图让你要求它的新用户,但操作系统告诉它它不能,因为你指定的GID组不存在。< / p>

你为解决这个问题所做的是正确的,但可以说遗漏了几件事。首先,您应该指定有关该组的更多信息,而不仅仅是名称(从资源标题'myuser'收集)。这不是一个大问题,但在第一个块中,用户和组的ID都是1000.而在第二个块中,将生成GID,但操作系统决定生成GID。您可以通过指定群组的GID然后在用户声明中使用该GID来更紧密地管理此事。

其次,因为在Puppet命令中不能保证你会想到这样一种可能性,即使你的组现在声明你已经拥有它,它可能并不总是先运行,比如当用户资源来到该组之前编目目录。在这种情况下,您将遇到同样的问题。

以下是解决此问题的一种方法:

group {'myuser':
  ensure     => present,
  gid        => 1000,
  before     = User['myuser']
}

user { 'myuser':
  ensure     => present,
  uid        => '1000',
  gid        => '1000',
  shell      => '/bin/bash',
  home       => '/home/myuser',
  requires   => Group['myuser']
}

请注意用户和组中设置的requiresbefore参数。将requires参数设置为Group['myuser']将确保在声明用户之前始终应用指定的组。 before也是如此,可以用来获得相同的结果。

另一种处理此问题的方法是使用notifiessubscribe。 Puppet有一个关于资源排序的很好的页面:https://docs.puppetlabs.com/puppet/latest/reference/lang_relationships.html

最后,我最喜欢的一个,特别是当用于在模块的init.pp课程中订购课程时,资源链是:

group {'myuser':
  ensure     => present,
  gid        => 1000
} ->
user { 'myuser':
  ensure     => present,
  uid        => '1000',
  gid        => '1000',
  shell      => '/bin/bash',
  home       => '/home/myuser'
}

这也将确保上面提到的相同配置,并且可以真正派上用场。特别是在我之前说过的模块初始化中订购类时。

例如:

class sampleclass (
    $ensure,
)inherits sampleclass::params{
  class { 'sampleclass::accounts': } ->
  class { 'sampleclass::files': } ->
  class { 'sampleclass::repo': } ->
  class { 'sampleclass::links': } ->
  class { 'sampleclass::config': }
}

希望这有帮助!