Puppet:使用者類型上的管理主頁僅在使用者不存在時才有效

Puppet:使用者類型上的管理主頁僅在使用者不存在時才有效

我在這裡尋求澄清。看來管理之家的屬性使用者定義的類型僅在使用者不存在時有效。看看這個 DSL

user { 'artifactory':
        ensure     => 'present',
        home       => '/home/artifactory',
        managehome => true,
}

file { '/home/artifactory/data':
        ensure  => link,
        target  => '/var/lib',
        require => User['artifactory'],
}

我第一次運行它時效果很好,但是,如果我刪除人工製品使用者的主目錄,然後再次執行它,puppet barfs。

錯誤:無法在確保上設定「連結」:沒有這樣的檔案或目錄

我的第一個想法是真的?看看文件

管理使用者時是否管理主目錄。當確保=>存在時,這將建立主目錄

如果我刪除用戶並重試,它會起作用。那麼這是設計使然還是一個錯誤呢?對我來說這似乎很微妙。

答案1

從運行時的角度來看,puppet 檢查系統上使用者的狀態並將其與清單進行比較。如果系統上不存在該用戶,則 puppet 會執行適當的useradd命令來建立它。如果使用者不應該存在,但確實存在,則它會執行適當的userdel命令。如果使用者的某些屬性(例如群組成員資格、uid、名稱等)已更改,則它會發出相應的gpasswd命令usermod

不幸的是,有關使用者類型的文件並不是最清楚的。這個managehome參數與其說是對該目錄的聲明,不如說它是useraddusermoduserdel命令的選項。因此,如果您設定managehome => true和更改主目錄的位置,那麼它將被創建,如果您刪除用戶,它將被刪除,如果您新增用戶,它將被建立。但是,它並不確保該目錄始終存在。

如果需要的話,我建議您建立一個文件類型並設定適當的要求。像這樣的事情:

user { 'artifactory':
    ensure     => 'present',
    home       => '/home/artifactory',
    managehome => true,
}

file { 
  '/home/artifactory/data':
    ensure  => link,
    target  => '/var/lib',
    require => [ User['artifactory'], File['artifactoryhomedir'] ]; 
  '/home/artifactory':
    ensure => directory,
    alias => 'artifactoryhomedir',
    require => User['artifactory'];
}

答案2

它是已知問題。計劃的解決方案是保留當前行為,但重命名管理之家創建家園讓它更清楚。

相關內容