Puppet: Получить домашний каталог пользователей

12

Я создаю пользователя следующим образом

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],
}

Как я могу получить домашний каталог пользователя для этого?

Quintin Par
источник

Ответы:

11

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

модуль 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",
}

Возможно, есть лучший способ, но я боюсь, что нет.

jfried
источник
Можете ли вы дать мне несколько советов о том, где разместить эти манифесты? У меня есть базовый класс в init.pp, и куда мне идти?
Quintin Par
1
@QuintinPar Я только начал загружать некоторые примеры кукол или лучшие практики в github. Вы найдете этот пример (класс facter) здесь: github.com/drandor/puppet-examples/tree/master/modules/user, для которого вам нужно активировать функцию pluginsync на вашем главном сервере и вашем агенте. второй код можно использовать в любом месте ваших * .pp файлов. Конфигурацию марионеток и манифесты узлов (с этапами) можно найти здесь: github.com/drandor/puppet-config
jfried
1
Если пользователь еще не существует на компьютере (добавлен новый пользователь), факт home_user недоступен. Для создания новых пользователей может потребоваться два запуска Puppet. При первом запуске $ home_path пуст, и это может привести к нежелательным результатам.
Микко
3

Я попытался найти решение для точно такой же проблемы, и оказалось, что лучше придерживаться немного другого подхода.

Определите домашний каталог явно, например:

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

При managehomeзначении false домашний каталог даже не создается. Таким образом, вы должны конкретно определить это. Часто лучше сделать пользовательское определение для всего пользователя:

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}" 
            }
    # ...
}
Микко
источник
2
Это не работает, когда / home не используется по умолчанию. скажем / var / lib / psql
Quintin Par
@ Барри: Вы прочитали остальную часть ответа, "пользовательские домашние каталоги"? (Ответ был отредактирован после комментария Quintin Par)
Mikko
@Mikko Да, и я попытался поднять правильный (принятый) ответ. Это было заперто.
0

Этот вопрос старый, но все еще актуален. На самом деле сейчас есть лучший способ. Добавьте пользовательский факт в [module] /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']

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

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

К. Тейлор
источник