
ここで明確にしておきたいことがあります。管理ホームの属性ユーザー定義された型はユーザーが存在しない場合にのみ機能します。このDSLをご覧ください
user { 'artifactory':
ensure => 'present',
home => '/home/artifactory',
managehome => true,
}
file { '/home/artifactory/data':
ensure => link,
target => '/var/lib',
require => User['artifactory'],
}
初めて実行すると問題なく動作しますが、人工物ユーザーのホーム ディレクトリで再度実行すると、puppet が barfs します。
エラー: 'link' を Ensure に設定できませんでした: そのようなファイルまたはディレクトリはありません
私の最初の考えは本当に? 見てみましょうドキュメンテーション
ユーザーを管理するときにホームディレクトリを管理するかどうか。これにより、ensure => present の場合にホームディレクトリが作成されます。
ユーザーを削除してもう一度試すと動作します。これは仕様ですか、それともバグですか? 私には微妙に思えます。
答え1
実行時の観点から、puppet はシステム上のユーザーのステータスをチェックし、それをマニフェストと比較します。ユーザーがシステムに存在しない場合、puppet は適切なuseradd
コマンドを実行してユーザーを作成します。ユーザーが存在しないはずであるのに、存在する場合は、適切なコマンドを実行しますuserdel
。グループ メンバーシップ、uid、名前などのユーザーの属性が変更された場合は、適切なコマンドgpasswd
またはusermod
コマンドを発行します。
残念ながら、ユーザー タイプに関するドキュメントは明確ではありません。 パラメーターは、、、またはコマンドのmanagehome
オプションであるため、そのディレクトリについてはあまり説明していません。したがって、ホーム ディレクトリの場所を設定および変更するとホーム ディレクトリが作成され、ユーザーを削除するとホーム ディレクトリが削除され、ユーザーを追加するとホーム ディレクトリが作成されます。ただし、ディレクトリが常に存在するとは限りません。useradd
usermod
userdel
managehome => true
これが必要な場合は、ファイル タイプを作成し、適切な require を設定することをお勧めします。次のようになります。
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
それは既知の問題計画されている解決策は、現在の動作を維持しながら、名前を変更することです。管理ホームに作成ホームより明確にするためです。