我正在阅读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
木偶资源来实现我想要的东西?
答案 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']
}
请注意用户和组中设置的requires
和before
参数。将requires
参数设置为Group['myuser']
将确保在声明用户之前始终应用指定的组。 before
也是如此,可以用来获得相同的结果。
另一种处理此问题的方法是使用notifies
和subscribe
。 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': }
}
希望这有帮助!