Puppet-删除已登录的用户?

Puppet-删除已登录的用户?

我刚刚开始学习 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',
  }
}

相关内容