Giter Site home page Giter Site logo

saltshaker_api's Introduction

Saltshaker API

Saltshaker是基于saltstack开发的以Web方式进行配置管理的运维工具,简化了saltstack的日常使用,丰富了saltstack的功能,支持多Master的管理。此项目为Saltshaker的后端Restful API,需要结合前端项目Saltshaker_frontend

架构图

image

Dashboard

image

指导手册

要求

  • Python >= 3.6
  • Mysql >= 5.7.8 (支持Json的Mysql都可以)
  • Redis(无版本要求)
  • RabbitMQ (无版本要求)
  • Python 软件包见requirements.txt
  • Supervisor (4.0.0.dev0 版本 默认pip安装的不支持python3) 请使用此命令安装:pip install git+https://github.com/Supervisor/supervisor@master
  • GitLab >= 9.0

安装

准备工作(相关依赖及配置见saltshaker.conf):

  • 安装Redis: 建议使用Docker命令如下:
$ docker run -p 0.0.0.0:6379:6379 --name saltshaker_redis -e REDIS_PASSWORD=saltshaker -d yueyongyue/redis:08
  • 安装RabbitMQ: 建议使用Docker命令如下:
$ docker run -d --name saltshaker_rabbitmq -e RABBITMQ_DEFAULT_USER=saltshaker -e RABBITMQ_DEFAULT_PASS=saltshaker -p 15672:15672 -p 5672:5672 rabbitmq:3-management
  • 安装Mysql: 初始化系统管理员 用户名:admin 密码:admin
$ docker run -p 0.0.0.0:3306:3306 --name saltshaker_mysql -e MYSQL_ROOT_PASSWORD=123456 -d yueyongyue/saltshaker_mysql:10 --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci

使用Docker镜像安装

  1. 后端API服务
$ docker run -d -p 0.0.0.0:9000:9000 --name saltshaker_api \
-e REDIS_HOST=192.168.10.100 \
-e REDIS_PORT=6379 \
-e REDIS_PASSWORD=saltshaker \
-e MYSQL_HOST=192.168.10.100 \
-e MYSQL_PORT=3306 \
-e MYSQL_USER=root \
-e MYSQL_PASSWORD=123456 \
-e MYSQL_DB=saltshaker_plus \
-e MYSQL_CHARSET=utf8 \
-e BROKER_HOST=192.168.10.100 \
-e BROKER_PORT=5672 \
-e BROKER_USER=saltshaker \
-e BROKER_PASSWORD=saltshaker \
-e [email protected] \
-e MAIL_PASSWORD=123345 \
-e SMTP_SERVER=smtp.saltshaker.com \
-e SMTP_PORT=25 \
yueyongyue/saltshaker_api:1.12.1
  • REDIS_HOST: Redis主机地址
  • REDIS_PORT: Redis端口
  • REDIS_PASSWORD: Redis密码
  • MYSQL_HOST: Mysql数据库地址
  • MYSQL_PORT: Mysql端口
  • MYSQL_USER: Mysql用户名
  • MYSQL_PASSWORD: Mysql密码
  • MYSQL_DB: Mysql数据库名
  • MYSQL_CHARSET: Mysql字符集
  • BROKER_HOST: RabbitMQ地址
  • BROKER_PORT: RabbitMQ端口
  • BROKER_USER: RabbitMQ用户
  • BROKER_PASSWORD: RabbitMQ密码
  • FROM_ADDR: 邮箱地址用于发生邮件
  • MAIL_PASSWORD: 邮箱密码
  • SMTP_SERVER: SMTP服务器地址
  • SMTP_PORT: SMTP服务器端口
  1. 前端服务
$ docker run -d -p 0.0.0.0:80:80 --name saltshaker_frontend \
-e DOMAIN=192.168.10.100  \
-e API_ADDR=192.168.10.100 \
-e Nginx_PROXY_PASS=192.168.10.100:9000 \
yueyongyue/saltshaker_frontend:1.12
  • DOMAIN: 部署服务器的IP地址(最终通过这个地址进行浏览器访问)
  • API_ADDR: 后端API服务器的地址
  • Nginx_PROXY_PASS:后端API服务器的地址加端口

手动部署

安装Saltshaker,你需要首先准备Python 3的环境(假定项目clone到你的家目录即$HOME下面,若果不是请对应修改相关路径)

  1. 下载:

    $ cd $HOME
    $ git clone https://github.com/yueyongyue/saltshaker_api.git
  2. 安装依赖:

    $ pip install -r requirements.txt
  3. 导入FLASK_APP环境变量以便使用Flask CLI工具,路径为所部署的app的路径

    $ export FLASK_APP=$Home/saltshaker_api/app.py
  4. 初始化数据库表及相关信息,键入超级管理员用户名和密码(数据库的配置见saltshaker.conf,请确保数据库可以连接并已经创建对应的数据库)

    $ mkdir /var/log/saltshaker_plus
    $ flask init
    输出如下:
        Enter the initial administrators username [admin]: admin
        Enter the initial Administrators password: 
        Repeat for confirmation: 
        Create user table is successful
        Create role table is successful
        Create acl table is successful
        Create groups table is successful
        Create product table is successful
        Create audit_log table is successful
        Create event table is successful
        Create cmd_history table is successful
        Create host table is successful
        Create grains table is successful
        Create period_task table is successful
        Create period_result table is successful
        Create period_audit table is successful
        Create sls table is successful
        Init 超级管理员 role successful
        Init 普通用户 role successful
        Init 产品管理员 role successful
        Init 用户管理员 role successful
        Init 访问控制管理员 role successful
        Init user successful
        Successful
    

    也可以直接导入数据库文件saltshaker_plus.sql, 初始化管理员用户名:admin 密码:admin

    mysql> source $HOME/saltshaker_api/saltshaker_plus.sql;
  5. 启动Flask App, 成功启动后会启动9000的端口

    • 开发模式

      $ python $Home/saltshaker_api/app.py
    • Gunicorn模式

      $ cd $Home/saltshaker_api/ && gunicorn -c gun.py app:app
    • 生产模式

      supervisord.conf 里面的directory配置项修改为自己对应的代码路径
      $ /usr/local/bin/supervisord -c $Home/saltshaker_api/supervisord.conf
  6. 启动Celery (使用生产模式的忽略此步骤,因为在Supervisor里面已经启动Celery)

    $ cd $Home/saltshaker_api/ && celery -A app.celery worker --loglevel=info
  7. 结合前端项目

    https://github.com/yueyongyue/saltshaker_frontend
    

配置Salt Master (如下是以 CentOS 7 版本进行安装配置的,其他版本的操作系统请替换对应的命令,以下操作都是在salt master服务器上完成)

  1. 安装salt-api 具体安装方法请查看官方文档(https://repo.saltstack.com/

    sudo yum install salt-api
  2. 创建salt api 认证用户名密码,使用pam认证方式

    sudo useradd admin          # 必须是admin,如果是其他用户,需要对应修改$HOME/saltshaker_api/saltapi.conf里面的admin
    sudo passwd admin           # 记住admin的密码,稍后配置产品线的时候需要填写
  3. 配置saltstack api 拷贝 saltshaker_api/saltapi.conf 到 master配置文件下,开启salt-api的Restful接口(端口为8000)

    sudo cp $HOME/saltshaker_api/saltapi.conf /etc/salt/master.d/
    sudo systemctl restart salt-master
    sudo systemctl restart salt-api
  4. 使用GitLab作为FileServer: 官方配置gitfs说明 请查看此链接需要 pygit2 或者 GitPython 包用于支持git, 如果都存在优先选择pygit2 Saltstack state及pillar SLS文件采用GitLab进行存储及管理,使用前务必已经存在GitLab,如下配置在/etc/salt/master进行添加修改

    fileserver_backend:
      - roots
      - git   # git和roots表示既支持本地又支持git 先后顺序决定了当sls文件冲突时,使用哪个sls文件(谁在前面用谁的)
      
    gitfs_remotes:
      - http://test.com.cn:9000/root/salt_sls.git: # GitLab项目地址 格式https://<user>:<password>@<url>
        - mountpoint: salt://  # 很重要,否则在使用file.managed等相关文件管理的时候会找不到GitLab上的文件 https://docs.saltstack.com/en/latest/topics/tutorials/gitfs.html
      
    gitfs_base: master   # git分支默认master
    
    pillar_roots:         
      base:
        - /srv/pillar
        
    ext_pillar:  # 配置pillar使用gitfs, 需要配置top.sls
      - git:
        - http://test.com.cn:9000/root/salt_pillar.git:
          - mountpoint: salt://
  5. 后端文件服务器文件更新:

    • master 配置文件修改如下内容 (不建议)

      loop_interval: 1      # 默认时间为60s, 使用后端文件服务,修改gitlab文件时将不能及时更新, 可根据需求缩短时间
    • Saltshaker页面通过Webhook提供刷新功能, 使用reactor监听event, 当event的tag中出现gitfs/update的时候更新fiilerserve

      a. 在master上开启saltstack reactor
         reactor:
           - 'salt/netapi/hook/gitfs/*':
             - /srv/reactor/gitfs.sls
      b. 编写/srv/reactor/gitfs.sls
          {% if 'gitfs/update' in tag %}
          gitfs_update: 
            runner.fileserver.update
          pillar_update:
            runner.git_pillar.update
          {% endif %}

Restful API

Restful API文档见Wiki: https://github.com/yueyongyue/saltshaker_api/wiki

Saltshaker 交流学习QQ群:622806083

image

运维架构技术 交流学习QQ群:991904631

image

Saltshaker 论坛

http://project-help.cn/forum-4.htm

功能介绍

Job

Job创建

Job创建,主要是以Job的方式进行日常的配管工作,避免重复性的手动执行配管操作,同时支持定时及周期性的Job

并行为0 立即 定时 周期
一次 重开、删除 重开、删除
周期 暂停周期、继续周期、删除
并行为非0 立即 定时 周期
一次 暂停并行、继续并行、重开、删除 暂停并行、继续并行、重开、删除
周期 暂停周期、继续周期、删除

image

Job历史

Job历史,通过saltstack event获取相关saltshaker事件供用户查看及检索(系统工具里面的event要开启才会有,每增加一个产品线要重启一次)

image

Job管理

Job管理,如果执行了某些长时间驻留的任务,如ping,top这种,可以在里面进行kill

image

Minion管理

状态信息

可以查看minion的状态信息

image

Key管理

可以对minion key 进行管理,接受key会自动同步minion到主机,删除后自动从主机,分组中删除

image

Grains

展示minion Grains 信息;此功能根据salt master已经接受的minion进行Grains的生成,同步Grains使用了异步方式进行同步,同步之前请确保celery worker已经启动

image

主机管理

在key管理里面点击Accepted后,此minion id会自动同步到主机管理,如果不是在页面点击的Accepted可以使用同步主机进行同步,或者发现管理的minion于主机的数量不相同,也可以点击同步主机同步,此功能会根据salt maste已经接受的minion进行主机的同步

image

分组管理

对主机进行分组,以便进行批量操作

image

文件管理

使用基于gitfs的方式进行日常的文件管理;state、template、pillar等文件都可以放到里面;支持添加、编辑、删除、上传等操作;使用webhook对gitfs文件进行更新

image

image

image

执行命令

Shell

根据分组执行对应的shell命令

image

State

根据分组执行对应的state

image

Pillar

根据分组执行对应的pillar(只有pillar形式的sls,执行才有效果)

image

产品线管理

项目初始完成后首先需要配置的 支持多产品线的管理,不同产品线使用不同的salt-master,可以分别进行管理,方便多master的接入

  • 产品线名:为管理的salt-master起个名字
  • 描述:描述
  • Master ID:salt-master所在的服务器也是要部署salt-minion的,此ID为这台服务器上salt-minion的ID,用于管理salt-master服务器
  • Master API 地址:salt-api的地址;如:http://192.168.10.10:8000
  • Master API 用户名:salt-api的用户名
  • Master API 密码: salt-api的密码
  • 文件服务器: 现只支持GitLab模式,默认勾就可以了,选择GitLab后saltstack的后端文件服务将是使用GitLab
  • GitLab 地址:Gitlab服务的地址;如:http://git.saltshaker.com.cn
  • GitLab API 版本:此版本为GitLab API的版本,不是GitLab的版本,填4即可
  • GitLab Token:访问GitLab的Token,可以去GitLab的页面生成
  • GitLab State 项目:salt state项目的地址;如:xxx/项目名
  • GitLab Pillar 项目:salt pillar项目的地址;如:xxx/项目名

image

ACL管理

对执行的shell进行ACL,避免执行敏感命令,如reboot、shutdown等,现在只支持黑名单(拒绝的,只有Shell有效,SLS的文件暂时不支持)

image

系统管理

用户管理

对注册进来的用户,进行产品线的分配、主机组的分配、ACL的分配、角色的分配等

image

角色管理

系统预定义的角色,不能删除修改,如有需要可以扩展角色

image

操作日志

记录用户日常操作

image

系统工具

event工具用于对saltstack event进行记录,每添加一个产品线重启一次,如果发现celery worker的数量的数量多于产品线数量,job历史可能重复

image

saltshaker_api's People

Contributors

ansen avatar yueyongyue avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

saltshaker_api's Issues

增加shell输出的错误信息与信息返回

执行命令--shell 这个批量实时执行命令的功能,在数据返回展示,过于简单

在salt-master使用cmd.run命令执行,无错,但是在界面中失败后,没有返回任何异常信息。

文件服务器

一定要使用gitlab吗?可以用gitea或者github吗?

文件管理 目录下文件过多导致如下报错

{"status": false, "message": "HTTPConnectionPool(host='config-center', port=80): Max retries exceeded with url: /api/v4/projects/1/repository/tree?all=True&id=1&page=2&path=service&per_page=20&recursive=false&ref_name=master (Caused by NewConnectionError('<urllib3.connection.HTTPConnection object at 0x7fe6a2d29320>: Failed to establish a new connection: [Errno -3] Try again',))"}

运行测试job提示一下错误

2019-09-12 18:40:45,571 ERROR: The APScheduler job crashed : local variable 'p_result' referenced before assignment [/home/www/server/saltshaker_api/extensions.py line:203]

产品线建议增加接口test功能

在初始化产品时,salt-api和gitlab这一块希望单独出一份文档。在新建产品线时,增加saltpai和gitlab的正确性探测,这样对纠错的使用体验比较好

源代码普通用户增加超级管理员权限不生效

源代码普通用户增加超级管理员权限不生效,排查了一下代码,发现代码逻辑上如果用户A注册后默认为普通用户,增加超级管理员后,有两个role,但是在判断权限的时候,普通用户的role排在前面,当匹配到普通用户,循环语句break,无法继续循环到其他role的查询。
此处应该把break改成continue,保证高低权限同时存在的时候,能循环到最高级权限。
if result["tag"] == role_dict["superuser"]: # 100 放到最后以保证系统管理在最后 menu = [1, 10, 11, 12, 2, 20, 21, 22, 3, 30, 4, 40, 5, 50, 6, 60, 61, 62, 63, 7, 70, 8, 80, 100, 101, 102, 103, 104 ] break elif result["tag"] == role_dict["product"]: menu = [1, 10, 11, 12, 2, 20, 21, 22, 3, 30, 4, 40, 5, 50, 6, 60, 61, 62, 63 ] continue ##源代码为break elif result["tag"] == role_dict["common_user"]: menu = [1, 10, 11, 12, 2, 20, 21, 22, 5, 50, 6, 60, 61, 62, 63 ] continue ##源代码为break

前端传参为list,导致salt-api调用时,master执行无法解析

API接口:/saltshaker/api/v1.0/execute/shell
执行命令: echo ok
调用类:ExecuteShell 中 minion_id = args["minion_id"] ,前端传入minion_id是list导致salt-api调用时,master执行无法解析。
如果将这个参数解析 minion_id = ",".join(minion_id) 成字符串,命令执行成功,但是页面展示结果会出现异常:
总数: 12
成功: 1
失败: 11
失败主机: 1,.,6,3,2,8,9

English Translation

This looks to be one of the more active and well done Salt GUI projects out there.

If anyone or @yueyongyue can attempt an English translation, it would be much appreciated. Google Translate does a decent job so far.

I was also wondering if there was an English option on the front end?

admin登录密码

尝试好久还是admin用户密码还是不对,有大佬知道么

编辑已有分组无法显示新添加的主机。

编辑已有分组无法显示新添加的主机,新建分组是正常的。

  1. 添加主机-新建分组,这个流程是正常的,没有问题。
  2. 添加主机-编辑分组,即如果想要把新添加的主机放到已有分组中,编辑分组时,就会出现主机不会在待选列表中出现。
  3. 临时解决方案: 点击新建分组,然后关掉,再进行编辑分组时,就可以发现新添加的主机了。

flask init失败的问题

第一次失败是因为mysql版本不同,后在另外一台机器上部署高版本的mysql并更改配置后,再次执行flask init,结果连接的IP不是最新的。这类缓存在哪里放着呢?

关于ACL控制策略

新建了一个用户,赋予一个分组,一个ACL控制策略。使用该账号登录后,无法显示分组。请问这个是bug吗

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.