
我在這裡尋求澄清。看來管理之家的屬性使用者定義的類型僅在使用者不存在時有效。看看這個 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
參數與其說是對該目錄的聲明,不如說它是useradd
、usermod
或userdel
命令的選項。因此,如果您設定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
它是已知問題。計劃的解決方案是保留當前行為,但重命名管理之家到創建家園讓它更清楚。