背景需求:

  随意业务的发展,服务器数据也是越来越多,开发人员,运维人员也是越来越多。这时候如果有大量的人需要登录到服务器的话,那么我们就很有必要对用户进行管理。传统的方式是登录到每台服务器创建一个用户,工作重复性太大,如果有 1000台怎么办?甚至有的公司用户都不创建直接让所有人以root登录,这样更危险!!!,那么聪明一点的运维人员会写个创建用户的脚本来实现半自动化的创建用户。这些方法都不适合管理大批量的机器,接下来给大家带来其于SaltStack和Python脚本实现的自动化用户管理。

实现目标:

  1. 不可以使用root直接远程登录服务器

  2. 不可以使用密码登录服务器(只能密钥)

  3. 通过简单的命令就能自动化的创建用户,并且将用户密钥发送到用户目录下,使用户可以密钥登录,并且拥有sudo权限


关salt的使用可以查看我以前发表的几篇文章《Salt安装,基本命令使用》,《Salt远程执行模拟的使用》,《Target的介绍》,《Salt配置管理系统》。关于Python的使用请自行学习


完成上面的操作和学习再继续看下面的实现方法:

/srv/salt/test:是我们salt的test环境根目录

目录结构如下:

user_managent
├── files
│   └── user-authorized_keys
├── init.sls
└── useradd.sls
#files目录存放所有用户的公钥文件,命名规则为USERNAME-authorized_keys

状态配置文件如下:init.sls

#禁用root远程登录
modify PermitRootLogin:
  file.replace:
    - name: /etc/ssh/sshd_config
    - pattern: ^\#PermitRootLogin yes$
    - repl: PermitRootLogin no

#禁用密码登录
modify PasswordAuthentication:
  file.replace:
    - name: /etc/ssh/sshd_config
    - pattern: ^PasswordAuthentication yes$
    - repl: PasswordAuthentication no

#重启服务
sshd managent:
 service.running:
    - name: sshd
    - enable: True
    - reload: True
    - watch:
      - file: /etc/ssh/sshd_config

#创建组
create group:
  group.present:
    - name: aek
    
#增加sudo组
modify sudoers:
  file.append:
    - name: /etc/sudoers
    - text:
      - "%aek        ALL=(ALL)       ALL"

状态配置文件如下:useradd.sls

#下面两行是定义用户名和密码,密码是以用户名通过加密算法产生的, 所以用户密码和用户名一样
{% set USERNAME = 'user' %}
{% set PASSWORD = '$6$i6qujzCmWYsXGDJ0$Mxo50GGqCNMI3AKReNXKZ3GGxhFLzrZSQRxuFChw9JX/QrIdIIjqqkM52A7tEKOb61OuXmV7IrvtNWbzVgt000' %}

#以下为创建用户的模块,需要注意的是groups,指定用户的附加组,此组需要有sudo权限
create user:
  user.present:
    - name: `USERNAME`
    - password: `PASSWORD`
    - groups:
      - aek

#将用户的key发送到指定用户
pub key:
  ssh_auth.present:
    - user: `USERNAME`
    - source: salt://user_managent/files/`USERNAME`-authorized_keys
    - template: jinja

Python脚本:

#!/usr/bin/python
#coding:utf:8

import sys
import fileinput
import crypt
import re

class UserAdd:
    #此脚本会自动修改salt状态配置文件里面的用户和密码

    def __init__(self, username=sys.argv[1]):
        self.username = username

    #根据用户名生成加密码后的密码
    def password(self):
        self.password = crypt.crypt(self.username)    
        return self.password

    #修改state配置文件里面的用户名和密码变量
    def modifyStateFile(self):
        password = self.password()
        for i in fileinput.input("/srv/salt/test/user_managent/useradd.sls", inplace=True):
            if "USERNAME = " in i:
                print(re.sub(r"USERNAME = '.*?'", "USERNAME = '"+self.username+"'", i).rstrip())
            elif "PASSWORD = " in i:
                print(re.sub(r"PASSWORD = '.*?'", "PASSWORD = '"+password+"'", i).rstrip())
            else:
                print(i).rstrip()

if __name__ == "__main__":
    a = UserAdd()
    a.modifyStateFile()

Python脚本使用方法:

#如果你的状态文件存放位置与我不一样,或者名称不一样,请自行修改
chmod +x useradd.py    #只需要运行一次
./useradd.py USERNAME   #每次创建用户前运行

当执行完成Python脚本后接下来我们就可以执行Salt命令创建用户了,命令如下:

salt -G "os:CentOS" state.sls user_managent saltenv=test    #只需要第一次运行即可
salt -G "os:CentOS" state.sls user_managent.useradd saltenv=test    #创建用户时运行

最后你需要的就是等待完成就可以了