带条件的 Puppet 用户创建

带条件的 Puppet 用户创建

如何创建具有相同 UID 的用户(仅当不存在时)而不影响具有随机 UID 的相同用户的服务器。为了提供更多见解:1. 在所有具有相同 UID 的服务器群中维护一个用户“user1”2. 相当多的服务器都具有具有随机 UID 的相同用户。在这种情况下,puppet 类不应该执行任何操作

user { 'user1':
        ensure   => present,
        comment  => 'Appp user',
        uid      => 55555,
        onlyif   => <if the user1 is not present>   ---> I know there is no attribute called onlyif in 'user'
        gid      => 55555,
        home     => '/home/user1',
        shell    => '/bin/bash',
    }

任何帮助均感激不尽。

答案1

为了做你所描述的事情,你需要一个自定义事实检查用户1是否存在,并根据系统的状态有条件地执行某些操作。

也许你根据 user1 的存在来参数化 UID。如果已经有 user1,就不要管理 uid。

$user1_uid = $::user1 ? {
  true => undef,
  default => 55555,
}

user { 'user1':
  ensure   => present,
  comment  => 'Appp user',
  uid      => $user1_uid,
  gid      => 55555,
  home     => '/home/user1',
  shell    => '/bin/bash',
}

或者更糟的是,将你的用户创建内容包装在执行资源使用 shell 脚本。

这两种方法都不是最佳选择,但考虑到您的要求,您可以这样做。就我个人而言,我会研究如何在不一致的系统上迁移 user1 的 UID。这可能更多的是前期工作,但随着时间的推移应该会有所回报。


编辑:

我根据您的评论运行了一个场景并验证了我的担忧。Puppet 函数由 Puppetserver 执行。因此,您编写的条件不依赖于客户端上 user1 的状态,而是依赖于主服务器。

我首先将 user1 添加到 Puppet 客户端系统。然后,我获取了您的代码并创建了文件 user1.pp。

$user_id = inline_template("<%= `/usr/bin/getent passwd user1` %>") 
if ("$user_id" == "") {
  user { 'user1': 
    ensure => present,
    comment => 'App user',
    uid => 61234,
    gid => 61234,
    home => '/home/user1',
    shell => '/bin/bash', 
  } 
} else { 
  notify { "The group is already present. Skipping..": } 
}

当我使用 执行此文件时puppet apply,如果用户已经存在,我会得到预期的结果,因为里面的命令inline_template()是在本地执行的。(如果用户存在于 Puppetserver 主机上,则结果相同。)

[root@localhost ~]# puppet apply /root/user1.pp 
...
Notice: The group is already present. Skipping..
Notice: /Stage[main]/Main/Notify[The group is already present. Skipping..]/message: defined 'message' as 'The group is already present. Skipping..'
Notice: Applied catalog in 0.15 seconds

当我将代码放到我的 Puppetserver 上并运行 puppet 代理时,它会尝试修改现有用户。您已将此描述为不受欢迎的结果。

[root@localhost ~]# puppet agent -t
...
Notice: /Stage[main]/User[user1]/uid: uid changed 1000 to 61234
Error: Could not find group(s) 61234
Error: /Stage[main]/User[user1]/gid: change from 1000 to 61234 failed: Could not find group(s) 61234
Notice: /Stage[main]/User[user1]/comment: comment changed '' to 'App user'
...

如果用户在 Puppetserver 上存在,但在客户端上不存在,则不会添加该用户,因为该getent函数在 Puppetserver 上成功返回。

[root@localhost ~]# id user1
id: user1: no such user
[root@localhost ~]# puppet agent -t
...
Notice: The group is already present. Skipping..
Notice: /Stage[main]/Notify[The group is already present. Skipping..]/message: defined 'message' as 'The group is already present. Skipping..'
Notice: Applied catalog in 19.73 seconds

恐怕您需要重新考虑您的解决方案才能获得所需的结果。如果您运行您的解决方案,您可能会意外更改 UID。

相关内容