Управляем пользователями средствами Puppet

в 5:49, , рубрики: linux, puppet, системное администрирование, метки: , ,

Периодически необходимо создавать и удалять пользователей с серверов.
Я решил переложить эти задачи на 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

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js