Puppet Exec 执行 useradd 失败

Puppet Exec 执行 useradd 失败

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

这里与其他资源类型一起提供了详尽的记录:

https://puppet.com/docs/puppet/latest/types/user.html

答案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

相关内容