Puppet: ユーザータイプの managehome はユーザーが存在しない場合にのみ機能します

Puppet: ユーザータイプの managehome はユーザーが存在しない場合にのみ機能します

ここで明確にしておきたいことがあります。管理ホームの属性ユーザー定義された型はユーザーが存在しない場合にのみ機能します。この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オプションであるため、そのディレクトリについてはあまり説明していません。したがって、ホーム ディレクトリの場所を設定および変更するとホーム ディレクトリが作成され、ユーザーを削除するとホーム ディレクトリが削除され、ユーザーを追加するとホーム ディレクトリが作成されます。ただし、ディレクトリが常に存在するとは限りません。useraddusermoduserdelmanagehome => 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

それは既知の問題計画されている解決策は、現在の動作を維持しながら、名前を変更することです。管理ホーム作成ホームより明確にするためです。

関連情報