如何创建具有相同 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。