Puppet Exec无法执行useradd

据我所知,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:

http://docs.puppetlabs.com/references/2.7.0/type.html#user

它的工作原理,但它返回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