Puppet: 사용자 홈 디렉토리 가져오기

Puppet: 사용자 홈 디렉토리 가져오기

나는사용자다음과 같이

user { $username:
    comment => "$name",
    shell   => "$shell",
    managehome => false,
    password  => "$password",
    groups => $groups
}

보시다시피 저는 지금 하고 있어요관리 홈은 거짓입니다 이제 나중에 사용자의 홈 디렉터리에 파일을 푸시해야 합니다.

$key = "${homedir}/${name}/file"

    file { $key:
    ensure => present,
    owner  => $username,
    group  => $username,
    mode   => 600,
    content => "$keyvalue",
    subscribe => User[$username],
}

어떻게 얻을 수 있나요?사용자의 홈 디렉토리이것을 위해?

답변1

흠, 그렇게 하려면 팩터 모듈과 약간의 해킹된 매니페스트 파일이 필요할 것 같아요...

팩터 모듈: 모든 사용자에 대한 팩터 변수를 등록합니다. "home_root" 또는 "home_apache"와 같습니다.

require 'etc'

Etc.passwd { |user|

   Facter.add("home_#{user.name}") do
      setcode do
         user.dir
      end
   end

}

그런 다음 매니페스트 파일 내에서 다음과 같이 사용할 수 있습니다.

$username = "root"
$home = "home_$username"
$home_path = inline_template("<%= scope.lookupvar('::$home') %>")

file { "$home_path/test.txt":
   content => "huhu",
}

아마도 더 좋은 방법이 있을 것 같지만 그렇지 않을 것 같습니다.

답변2

나는 똑같은 문제에 대한 해결책을 찾으려고 노력했고 약간 다른 접근 방식을 취하는 것이 가장 좋은 것으로 나타났습니다.

홈 디렉터리를 명시적으로 정의합니다. 예를 들면 다음과 같습니다.

user { $username:
    comment    => "comment",
    home       => "/home/${username}",
    managehome => false,
    # ...
}

false 이면 managehome홈 디렉터리도 생성되지 않습니다. 그래서 구체적으로 정의해야 합니다. 전체 사용자에 대해 맞춤 정의를 만드는 것이 가장 좋은 경우가 많습니다.

define custom_user($username, $password) {
    user { $username:
        home     => "/home/${username}",
        password => $password,
        # etc.
    }
    file { "/home/${username}":
        ensure  => directory,
        owner   => $username,
        require => User[$username],
        # etc.
    }
}

예를 들어 매개변수를 더 추가 $keyvalue하고 해당 매개변수가 제공되면 키 파일을 생성할 수 있습니다.

전역 변수 $home = "/home"(필요한 경우 OS별)를 정의하고 를 사용하여 홈 디렉토리를 가져올 수도 있습니다 "${home}/${username}".

편집: 해시를 사용하여 사용자별 홈 디렉토리 정의

최신 Puppet 버전(>= 2.6)은 해시를 지원합니다. username => /path/to/home각 사용자에 대한 매핑을 포함하는 해시를 정의하는 것이 가능합니다 .

$home = {
    normal_user => '/home/normal_user',
    backup      => '/var/backup',
    mysql       => '/var/lib/mysql'
}

어떤 사용자 이름이라도 를 사용하면 홈 디렉토리를 쉽게 얻을 수 있습니다 $home['username'].

대체 기능이 포함된 홈 디렉터리 해시

대부분의 경우 사용자가 해시에 없으면 "대체 기본값"을 사용하는 것이 가장 좋습니다.이론에 의하면이는 가능하지만 구문이 약간 이해하기 어렵고 부풀려집니다.

$home = { ... }
$default_home = '/home'

user {$username:
    home => has_key($home, $username) ? {
                true => $home[$username], 
                false => "${default_home}/${username}" 
            }
    # ...
}

답변3

이 질문은 오래되었지만 여전히 관련성이 있습니다. 실제로 더 좋은 방법이 있습니다. 사용자 정의 사실을 추가하세요.[모듈]/lib/facter/home_dirs.rb다음을 포함합니다:

require 'etc'

Facter.add(:home_dirs) do
  setcode do

    home_dirs = {}   
    Etc.passwd { |user|
      home_dirs[user.name] = user.dir
    }

    home_dirs

  end
end

그러면 다음과 같이 매니페스트의 데이터에 액세스할 수 있습니다.

$facts['home_dirs']['some_username']

이는 꼭두각시 실행 이전에 사용자가 이미 존재하는 경우에만 작동한다는 점을 명심하세요. 실행 중에 사용자가 생성되는 경우 홈 디렉터리는 이미 알려져 있거나 최소한 예측 가능해야 합니다. 인형극은 결국 질서를 창조하도록 설계되었습니다.

이것이 누군가에게 도움이 되기를 바랍니다.

답변4

계정모듈을 사용할 수 있고 모든 계정이 hiera를 통해 생성된 다음 루트 이외의 시스템 사용자 계정에 관심이 없다고 가정하면 아래 블록은 각 사용자 홈 디렉터리에 파일을 생성합니다.

require accounts::user::defaults

# filter out accounts with ensure=absent or managehome=false 
$managed_accounts = $accounts::user_list.filter |$name, $account| {
  (!has_key($account, 'managedhome') or $account['managedhome']) and (!has_key($account, 'ensure') or $account['ensure']!='absent')
}

# Add a file to each users
$managed_accounts.each |$name, $account| {
  $user_home_dir = has_key($account, 'home') ? {
    true    => $account['home'],
    default => $name ? {
      'root'  => $accounts::user::defaults::root_home,
      default => $accounts::user::defaults::home_template.sprintf($name),
    },
  }

  # Push a file to the user’s home directory.
  file { "${user_home_dir}/.helloworld":
    ensure  => file,
    owner   => $name,
    content => "Hi ${name}",
    require => User[$name],
  }
}

$user_home_dir다음을 수행하는 모든 사용자에게 정확해야 합니다 .

  1. 로 관리하다 accounts,
  2. 보장됩니다present
  3. 비표준 home디렉토리의 경우.

관련 정보