Linux

有沒有辦法讓 puppet 創建使用者的主文件夾(managehome)但在確保“不存在”時不刪除?

  • October 2, 2014

我的第一個想法是做這樣的事情:

define my_user( $name = $title, $ensure = present, $uid, $gid, $password, $groups, $comment, $shell ) {
   $managehome = $ensure ? {
       present => true,
       default => false,
   }
   user { $name:
       ensure     => $ensure,
       managehome => $managehome,
       uid        => $uid,
       gid        => $gid,
       password   => $password,
       groups     => $groups,
       comment    => $comment,
       shell      => $shell,
    }
}

這有幾個問題:

  • 如果我想使用另一個user類型屬性,我需要my_user在兩個地方進行更改。
  • 我需要更改所有user聲明以使用my_user.
  • 我寧願使用內置類型而不是定義類型。

也許有:

  • 一種將所有參數擷取到已定義類型並將其作為屬性傳遞給內置類型的方法。
  • 一種更優雅的方式來做到這一點,而無需使用定義的類型。

有人有什麼建議嗎?

有幾種方法可以解決這個問題,您可以直接在使用者聲明中使用三元檢查,如下所示:

user { $user:
 ensure     => $ensure,
 managehome => $ensure ? { present => true, default => false, },
 uid        => $uid,
 gid        => $gid,
 password   => $password,
 groups     => $groups,
 comment    => $comment,
 shell      => $shell,
}

這是假設您在這裡參數化您的值,我猜這不一定是這種情況。您仍然會遇到必須更新所有類型引用的問題,這可能會有點痛苦。相反,您可以使用功能更強大的create_resources函式。考慮以下 puppet 文件的摘錄:

class profile::base {
 $user_params = {
     'user1'     => { ensure     => absent,
                      managehome => false,
                      uid        => '1337',
                      gid        => dev,
                    },
     'user2'     => { uid        => '1338',
                      gid        => ops,
                      groups     => ['wheel', 'company'],
                    },
 }

 $user_defaults = {
     ensure        => present,
     managehome    => true,
     groups        => ['users', 'company'],
     comment       => 'Managed by puppet',
     shell         => '/bin/bash',
 }

 create_resources(user, $user_params, $user_defaults)

 ...
}

所以最終在這裡發生的是 create_resources 函式採用散列**$user_params**並使用提供的參數為每個條目動態創建資源。此外, $user_params未提供的任何參數都使用來自*$user_defaults*散列的值。上面的程式碼有效地評估為以下程式碼段。(如果您不熟悉 create_resources 函式,我強烈建議您在此處閱讀相關內容)

class profile::base {

 user { 'user1':
   ensure     => absent,
   managehome => false,
   uid        => 1337,
   gid        => dev,
   groups     => ['users', 'company'],
   comment    => 'Managed by puppet',
   shell      => '/bin/bash',
 }

 user { 'user2':
   ensure     => present,
   managehome => true,
   uid        => 1338,
   gid        => ops,
   groups     => ['wheel', 'company'],
   comment    => 'Managed by puppet',
   shell      => '/bin/bash',
 }

 ...
}

這使您可以快速添加/更改要管理的所有使用者的屬性,而無需查找每個參考。假設您想為您的公司切換到使用 ksh,您只需更改user_defaults雜湊中的值以反映這一點。也沒有什麼可以阻止您擁有不同的參數組和預設值(例如 $ root_params and $ root_defaults 為您的超級使用者)並有另一個 create_resources 函式呼叫。

更進一步,您可以將此概念與Hiera 的數據配對,然後解決方案將如下所示:

class profile::base {
 $user_params = hiera("user-params")
 $user_defaults = hiera("user-defaults")

 create_resources(user, $user_params, $user_defaults)

 ...
}

更乾淨,更容易閱讀。相應的hieradata json 文件如下所示:

{
 "user-params": {
                 "user1": {
                           "ensure": "absent",
                           "managehome": "false",
                           "uid": "1337",
                           "gid": "dev"
                 },

                 "user2": {
                           "uid": "1338",
                           "gid": "ops",
                           "groups": ["wheel", "company"]
                 }
 },

 "user_defaults": {
                   "ensure": "present",
                   "managehome": "true",
                   "groups": ["users", "company"],
                   "comment": "Managed by puppet",
                   "shell": "/bin/bash"
 }
}

我個人更喜歡 JSON 作為我的 hieradata,但 YAML 也是一個可行的選擇(Hiera Data Sources) Hiera 的好處是您可以根據您在 hiera.yaml 文件中決定和配置的任何標準使用不同的數據源(通常按照環境,但可能是每個節點)

作為最後的想法,您可能需要考慮編寫一個自定義類型來包裝使用者類型,該類型將:

  • 如果確保 => 不存在,則歸檔使用者的主目錄
  • 如果確保 => 存在,則搜尋並恢復存檔目錄
  • 正常使用內置使用者類型,managehome => true

如果您決定走這條路,您仍然可以通過使用create_resources函式和Hiera獲得很多好處

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