我刚刚开始学习 puppet,遇到了一个问题,想知道是否有人知道如何解决。我试图删除一个用户,但收到一条错误消息,指出他们已登录,因此无法删除。
现在,在这种情况下,我知道他们登录了哪个服务器,所以我可以简单地注销用户并从那里继续。但是我的问题是,当你不知道他们登录了哪个服务器时,你会怎么做?请记住,可能有很多服务器。
是否有强制删除选项或方法在 Puppet 中注销用户?
代码如下:
user {'art':
ensure => absent,
}
错误:
错误:无法删除用户 art:执行“/usr/sbin/userdel art”返回 8:userdel:用户 art 当前已登录
错误:/Stage[main]/Main/Node[demo]/User[art]/ensure:从出席更改为缺席失败:无法删除用户 art:执行“/usr/sbin/userdel art”返回 8:userdel:用户 art 当前已登录
答案1
根据这个帖子,您可以使用 断开用户连接pkill -STOP -u USERNAME
。
您可以创建资源定义木偶里有这样的事:
define kill_and_delete {
exec { "killing $title":
command => "pkill -STOP -u $title",
onlyif => "grep '^$title' /etc/passwd",
before => User[$title],
}
user { $title: ensure => absent}
}
之后,你可以像这样使用它:
kill_and_delete {'art': }
笔记:我没有测试过这个。
请参阅资源排序 - 之前和需要和类型引用-exec。
答案2
终止会话可以通过终止其父进程(称为会话领导者)来实现。使用以下命令找出它是哪个进程:
ps -dN|grep pts/3
或者
正如@Nitz 所提到的
pkill -9 -u 用户名
请参考以下链接:
答案3
在删除正在运行进程的用户时,我偶然发现了同样的问题。我已经在我们的生产服务器上测试了我的解决方案,因此我可以提供一个有效的解决方案,即使用“ensure”变量在单独的类中创建用户。并且根据变量,我决定是否调用进程停止序列,如下所示:
define your_class::user (
$user = $name,
$ensure = 'present',
){
# only call when user gets removed
if $ensure == 'absent' {
exec {
"killing ${user}":
command => "pkill -9 -u ${user}",
# need to check if user exists and processes are running
# otherwise command would fail with no processes
onlyif => "grep '^${user}' /etc/passwd && ps -u ${user}",
# run before user gets removed
before => User[$user];
}
}
# create/remove user with managed home
user {
$user:
ensure => $ensure,
home => "/home/${user}",
managehome => true,
shell => '/bin/bash',
}
}