据我所知,puppetd 以 root 身份运行。以 root 身份启动
puppetd --onetime --no-daemonize --verbose
所以我不明白为什么这不起作用:
exec { "useradd -m testuser":
path => "/bin:/usr/bin",
}
我刚刚得到:
...Exec[useradd -m testuser]/returns: change from notrun to 0 failed:useradd -m testuser returned 1 instead of one of [0] at...
如果我直接执行该命令,它就可以正常工作。
有任何想法吗?
PS:exec { "touch /root/a.test":} 成功,所以确实是以root身份执行。
PS2:执行“apt-get autoremove”时我遇到了完全相同的问题
答案1
在大多数系统中,useradd 将位于 sbin 文件夹之一中,而不是 /bin 或 /usr/bin。您的路径应该是"/bin:/usr/bin:/sbin:/usr/sbin",
。虽然这个解决方案相当糟糕,但我会使用用户类型而不是 exec,它将使您更好地管理主机上的用户(检查 pw 和存在性要求等)
@user {
"testuser":
uid => ,
gid =>,
password => #hash of password,
home => ,
groups => ,
}
realize ( User[testuser])
这是一个虚拟资源,可以通过允许多次引用将其添加到您的主机
这是一个不错的简单解决方案
答案2
尝试使用以下命令运行:
exec { "useradd -m testuser":
path => "/bin:/usr/bin",
logoutput => true,
}
看看它说了什么。现在它应该会在命令行上显示错误。此外,“on_failure”是另一个选项,它仅在命令失败时输出。我通常会这样做:
Exec {
logoutput => on_failure,
}
默认情况下,如果所有命令失败,它们都会在全球范围内输出一些有意义的内容。
但通常情况下,你会使用“用户”资源:
user { "myusername":
ensure => present,
managehome => true,
}
这里与其他资源类型一起提供了详尽的记录:
答案3
它作品但是它返回的是 1 而不是 0 吗?尝试运行echo $?
该useradd
命令。
您往往会通过使用内置的 Puppet 类型而不是像这样的 exec 来获得更好的错误消息:
user { "foo":
ensure => present,
uid => 1001,
password => '<some password hash>',
shell => "/bin/bash",
home => "/home/foo",
groups => ["foogroup"],
managehome => true,
}
您使用 exec 而不是那样做有什么理由吗?
答案4
您需要确保您拥有 Ruby Shadow gem 才能使用 /etc/shadow
sudo apt-get install libshadow-ruby1.8
或者在 redhat/fedora 中
sudo yum install ruby-shadow