Puppet

有條件的木偶使用者創建

  • May 7, 2019

如何創建具有相同 UID 的使用者(僅當它不存在時)而不影響具有相同使用者和隨機 UID 的伺服器。提供更多見解: 1. 在具有相同 UID 的伺服器群中維護一個使用者“user1” 2. 相當多的伺服器具有具有隨機 UID 的相同使用者。在這種情況下,木偶類不應該做任何事情

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',
   }

任何幫助表示讚賞。

為了執行您所描述的操作,您需要一個自定義 Fact來檢查 user1 的存在並根據該系統上的狀態有條件地執行某些操作。

也許您根據 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 腳本將您的使用者創建包裝在Exec 資源中。

這兩個都不是最好的選擇,但考慮到你的要求,這是你可以做的。就個人而言,我會研究如何在不一致的系統上遷移 user1 的 UID。這可能更像是一項前期工作,但隨著時間的推移應該會有所回報。


編輯:

我根據您的評論執行了一個場景並驗證了我的擔憂。Puppet 函式由 Puppetserver 執行。所以,你寫的條件不依賴於客戶端上user1的狀態,而是依賴於master。

我首先將 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。

引用自:https://serverfault.com/questions/966025