据我所知,puppetd是以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”时遇到同样的问题
那么在大多数系统中,useradd将位于其中一个sbin文件夹中,而不是/ bin或/ usr / bin。 你的path应该是"/bin:/usr/bin:/sbin:/usr/sbin", 。 虽然这个解决scheme是相当可怕的,我会使用用户types,而不是一个可执行文件,它会给你更好的主机上的用户pipe理(检查PW和存在需要等)
@user { "testuser": uid => , gid =>, password => #hash of password, home => , groups => , }
这是一个虚拟资源,可以通过realize ( User[testuser])添加到你的主机,允许多次引用它
这是一个很好的简单解决scheme
尝试运行命令:
exec { "useradd -m testuser": path => "/bin:/usr/bin", logoutput => true, }
并看看它说什么。 它现在应该给你命令行上的错误。 另外'on_failure'是另一个只在命令失败时才输出的选项。 我通常做:
Exec { logoutput => on_failure, }
作为默认,所有我的命令输出一些有意义的东西,如果他们失败了。
但通常情况下,您将使用“用户”资源:
user { "myusername": ensure => present, managehome => true, }
单独logging在这里与其他资源types:
它的工作原理,但它返回1而不是0? 尝试运行echo $? 之后useradd命令。
你倾向于通过使用内置的Puppettypes而不是像这样执行得到更好的错误消息:
user { "foo": ensure => present, uid => 1001, password => '<some password hash>', shell => "/bin/bash", home => "/home/foo", groups => ["foogroup"], managehome => true, }
有什么理由你使用exec而不是这样做?
您需要确保您拥有Ruby Shadow gem才能使用/ etc / shadow
sudo apt-get install libshadow-ruby1.8
或者在redhat / fedora中
sudo yum install ruby-shadow