Я начал использовать марионетку для управления нашими серверами RHEL. На этом этапе я пытаюсь настроить управление пользователями. Мы запускаем среду NIS в нашем кампусе, поэтому до сих пор я добавлял строку + testuser ::::: в файл / etc / passwd, который затем получал информацию о пользователе через NIS. Я хочу добиться того, чтобы у меня был набор пользователей-администраторов (admin1, admin2 и admin3), которые могут входить в систему на каждой машине, и набор пользователей (user1, user2 и user3), которые различны на каждой машине. В конце файла passwd мне нужна строка ввода + :::::: / sbin / nologin, чтобы иметь доступ ко всей информации о пользователях, но не предоставлять им доступа.
Итак, / etc / passwd на одной машине будет выглядеть так:
+admin1::::::
+admin2::::::
+admin3::::::
+user1::::::
+user2::::::
+::::::/sbin/nologin
и на другой машине
+admin1::::::
+admin2::::::
+admin3::::::
+user1::::::
+user3::::::
+::::::/sbin/nologin
Поскольку пользователи-администраторы довольно статичны, но обычные пользователи различаются от системы к системе, я решил объявить пользователей-администраторов в модуле, а обычных пользователей для каждого узла.
Моя первая проблема - как отредактировать файл / etc / passwd, чтобы добавить строки. Кроме того, важно, чтобы сортировка была правильной, чтобы строка nologin находилась в конце. У вас есть идеи, как добиться этого гибким образом?
Спасибо и привет
В последней версии stdlib есть функция - (https://forge.puppetlabs.com/puppetlabs/stdlib) - называется 'file_line', который может помочь вам достичь того, к чему вы стремитесь:
Я не тестировал это, но ресурс, скорее всего, будет выглядеть примерно так:
file_line { 'nis_admin_users':
path => '/etc/passwd',
line => '+::::::/sbin/nologin',
}
Однако я не уверен, как обеспечить размещение строки прямо внизу, поскольку вы упомянули, что порядок имеет значение. Вероятно, что в исходном файле уже будет такая же строка? Если это так, вы можете использовать дополнительный необязательный параметр для file_line, называемый 'match', и создать регулярное выражение для сопоставления.
В качестве альтернативы, посмотрите на использование augues -> http://projects.puppetlabs.com/projects/1/wiki/puppet_augeas#Using+Puppet+with+Augeas
Марионетка будет редактировать /etc/passwd
сам по себе, когда вы добавляете user
ресурсы в ваш манифест, такие как
user {
'admin1':
ensure => present,
uid => 1003,
password => '$6$...',
}
Заказ существующих линий будет в лучшем случае непростым. Puppet изначально не поддерживает ничего подобного. Мой совет - использовать exec
ресурс вроде этого:
exec {
'/path/to/script-that-moves-nologin-line-to-the-end':
unless => '/script/that/returns-true-if-nologins-line-is-currently-at-the-end'
}
Вы бы хотели, чтобы Puppet выполнил это после синхронизации всех пользовательских ресурсов с вашей системой. Есть разные способы добиться этого, все со своими плюсами и минусами.
Предполагая, что ваши манифесты не слишком сложны, вы, вероятно, можете обойтись глобальными настройками по умолчанию для user
тип.
User { before => Exec['/path/to/script-that-moves-nologin-line-to-the-end'] }
Просто будь осторожен, чтобы нет user
ресурсы перезаписывают это другим before
стоимость.
Другие альтернативы включают
before
ценность всех существующих user
ресурсы с сборщик ресурсовuser
ресурсы в нескольких классах и просто добавьте require => Class[...]
к exec
Среди других, которые, вероятно, мыслимы.