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

Хм, я думаю, что для этого вам понадобится модуль Factor и небольшой хакерский файл манифеста...

Модуль facter: регистрирует переменные facter для всех пользователей, например «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,
    # ...
}

Если managehomefalse, домашний каталог даже не создается. Поэтому вам придется его специально определить. Часто лучше сделать индивидуальное определение для всего пользователя:

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"(специфичную для ОС, если необходимо) и получить домашний каталог с помощью "${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']

Имейте в виду, что это работает только в том случае, если пользователь уже существует до запуска puppet. Если пользователь создается во время запуска, домашний каталог должен быть уже известен или, по крайней мере, предсказуем. В конце концов, puppet предназначен для создания порядка.

Надеюсь, это кому-то поможет.

решение4

КогдаСчетамодуль доступен и все учетные записи создаются через hiera, затем приведенный ниже блок создает файл в домашнем каталоге каждого пользователя, предполагая, что вас не интересуют системные учетные записи пользователей, кроме root.

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каталогов.

Связанный контент