Периодически необходимо создавать и удалять пользователей с серверов.
Я решил переложить эти задачи на Puppet, поскольку все сервера уже подключены к нему.
В данной статье я рассмотрел стартовый ввод управления пользователями средствами Puppet с заделом на будущую оптимизацию и модернизацию в компании с сотней серверов и десятком разработчиков.
Логика метода создания/удаления пользователя
Как это работает:
В нашем случае создание пользователя проходит с введением его в соответствующие группы в зависимости от роли.
Удаление происходит с очищением домашней папки пользователя.
Далее комментарии по ходу самого модуля.
# Определяем класс и присваиваем значения по умолчанию, если не передано значений при объявлении класса.
define manage_user($user_gid = "65535", $action = "create", $m_groups = "ssh_access") {
# определяемся с пользователем:
if $action == 'create' {
# сначала создаём группу для пользователя
group { "$title":
gid => "$user_gid",
ensure => present,
}
# создаём пользователя
user { "$title":
ensure => present,
gid => $user_gid,
uid => $user_gid,
# добавляем в группы (группы передаются массивом)
groups => $m_groups,
# или добавляем группы определяя переменную при объявлении метода
# вида: m_groups => "ssh_users,developers,sudo_1", где разделителем является запятая
# groups => "$m_groups",
comment => "$title",
home => "/home/$title",
shell => "/bin/bash",
# на некоторых системах доступа по SSH не будет пока пользователь заблокирован "passwd -u -f <user>". Это можно обойти, задав пароль пользователю:
# password => "$6$fdrc...tut_hash_moego_parolya....ovj0",
# создаём домашнюю папку
managehome => true,
}
# создаём папку .ssh для нашего публичного ключа
file { "/home/$title/.ssh":
ensure => "directory",
owner => "$title",
group => "$title",
mode => 700,
}
# размещаем ключ и назначаем соответствующие права на него
file { "/home/$title/.ssh/authorized_keys":
owner => "$title",
group => "$title",
mode => "0400",
# публичный ключ я передаю из шаблонов (modules/manage_users/templates/keys/*.erb, но Puppet умеет получать файлы различными способами по различным протоколам таким как puppet://, ftp:// и т.п..)
content => template("manage_users/keys/$title.erb");
}
} else {
# Логика удаления пользователя с сервера:
#
# В данном месте логично разместить различные скрипты по очистке системы от пользовательских файлов или передачи прав другим пользователям, а также прочие действия, связанные с удалением пользователя из системы
# пример:
# find / -user $title -exec <что_то_сделать_с_файлами_пользователя> {} ;
# find / -group test_v99 -exec chgrp root {} ;
#
# Проверяем наличие домашней папки и удаляем её, если она есть (onlyif =>...)
exec { "rm -r /home/$title":
path => ["/usr/bin", "/usr/sbin", "/bin"],
onlyif => "test -d /home/$title",
}
# Последним шагом удаляем пользователя
user {"$title":
ensure => absent,
}
}
}
Подключаем модуль
manifests/site.pp:
import "hosts/server8.example.com.pp"
import "hosts/manage_users.pp"
Прописываем пользователей
manifests/hosts/server7.example.com.pp:
node "servers7.example.com" {
# ....
# [ 'one', 'two', 'three' ]
manage_user { 'test_v98': user_gid => '2098', action => "create", m_groups => [ 'ssh_access', 'sudo_1', 'sudo_2', 'developers' ] }
manage_user { 'test_v97': user_gid => '2097', action => "create", m_groups => [ 'ssh_access', 'sudo_2', 'developers' ] }
manage_user { 'test_v99': user_gid => '2099', action => "remove", m_groups => [ 'ssh_access', 'sudo_1', 'developers' ] }
# ....
}
Размещаем публичные ключи
modules/manage_users/templates/keys/test_v99.erb
ssh-rsa AAAA........== test_v99
В результате мы получаем простой инструмент управления пользователями с широкими возможностями по расширению функционала. В данной статье я рассмотрел не совсем красивый вариант, когда мы определяем пользователей в описании ноды. Это вполне поправимо и я планирую управлять пользователями в зависимости от роли пользователя и сервера. Я понимаю, что необходимо вынести логику управления пользователями и их правами за пределы описания ноды.
Автор: hard0ff