From 9ba73cc1fe9c57689373c025294cbd6f88416cb4 Mon Sep 17 00:00:00 2001 From: guohongze Date: Fri, 9 Feb 2018 14:12:40 +0800 Subject: [PATCH] add redis config celery redis config update update scripts update --- adminset.conf | 6 ++ adminset/celery.py | 16 +++- adminset/ldap.py | 2 + adminset/settings.py | 12 ++- config/views.py | 22 +++++ delivery/delivery.py | 4 +- delivery/tasks.py | 38 ++++++--- docs/Manual.txt | 161 +++++++++++++++++++++++++++++++++++ install/server/update.sh | 11 ++- static/dist/img/avatar.png | Bin 0 -> 8117 bytes static/dist/img/avatar04.png | Bin 0 -> 13539 bytes static/dist/img/avatar2.png | Bin 0 -> 8262 bytes static/dist/img/avatar3.png | Bin 0 -> 9241 bytes static/dist/img/avatar5.png | Bin 0 -> 7578 bytes templates/config/index.html | 39 ++++++++- 15 files changed, 288 insertions(+), 23 deletions(-) create mode 100644 docs/Manual.txt create mode 100644 static/dist/img/avatar.png create mode 100644 static/dist/img/avatar04.png create mode 100644 static/dist/img/avatar2.png create mode 100644 static/dist/img/avatar3.png create mode 100644 static/dist/img/avatar5.png diff --git a/adminset.conf b/adminset.conf index c0f13a03..d711d44c 100644 --- a/adminset.conf +++ b/adminset.conf @@ -30,4 +30,10 @@ collection = sys_info [webssh] domain = adminset.cn +[redis] +redis_host = 127.0.0.1 +redis_port = 6379 +redis_password = root +redis_db = 0 + diff --git a/adminset/celery.py b/adminset/celery.py index 507a3af4..49d18aaf 100644 --- a/adminset/celery.py +++ b/adminset/celery.py @@ -4,12 +4,24 @@ from __future__ import absolute_import, unicode_literals import os from celery import Celery - +import ConfigParser # set the default Django settings module for the 'celery' program. os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'adminset.settings') - app = Celery('adminset') +# redis connect code +BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) +config = ConfigParser.ConfigParser() +config.read(os.path.join(BASE_DIR, 'adminset.conf')) +redis_host = config.get('redis', "redis_host") +redis_port = config.get("redis", "redis_port") +redis_db = config.get('redis', "redis_db") +redis_password = config.get('redis', "redis_password") +if redis_password: + app.conf.broker_url = 'redis://:{0}@{1}:{2}/{3}'.format(redis_password, redis_host, redis_port, redis_db) +else: + app.conf.broker_url = 'redis://{0}:{1}/{2}'.format(redis_host, redis_port, redis_db) + # Using a string here means the worker doesn't have to serialize # the configuration object to child processes. # - namespace='CELERY' means all celery-related configuration keys diff --git a/adminset/ldap.py b/adminset/ldap.py index 3ce77537..ef97fdef 100644 --- a/adminset/ldap.py +++ b/adminset/ldap.py @@ -6,6 +6,8 @@ USER = 'cn=admin,dc=gccmx,dc=cn' PASSWORD = 'yourpass' BASE_DN = 'dc=gccmx,dc=cn' + + class LDAPTool: def __init__(self,ldap_host=None,base_dn=None,user=None,password=None): diff --git a/adminset/settings.py b/adminset/settings.py index 964cb490..77b38e0f 100644 --- a/adminset/settings.py +++ b/adminset/settings.py @@ -17,13 +17,20 @@ # Build paths inside the project like this: os.path.join(BASE_DIR, ...) BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) +config = ConfigParser.ConfigParser() +config.read(os.path.join(BASE_DIR, 'adminset.conf')) # Quick-start development settings - unsuitable for production # See https://docs.djangoproject.com/en/1.9/howto/deployment/checklist/ + # SECURITY WARNING: keep the secret key used in production secret! + SECRET_KEY = 'n@s)3&f$tu#-^^%k-dj__th2)7m!m*(ag!fs=6ezyzb7l%@i@9' -CELERY_BROKER_URL = 'redis://localhost/0' +# if redis_password: +# CELERY_BROKER_URL = 'redis://:{0}@{1}:{2}/{3}'.format(redis_password, redis_host, redis_port, redis_db) +# else: +# CELERY_BROKER_URL = 'redis://{0}:{1}/{2}'.format(redis_host, redis_port, redis_db) CELERY_ACCEPT_CONTENT = ['json'] CELERY_RESULT_BACKEND = 'django-db' CELERY_TASK_SERIALIZER = 'json' @@ -97,8 +104,7 @@ # 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'), # } # } -config = ConfigParser.ConfigParser() -config.read(os.path.join(BASE_DIR, 'adminset.conf')) + DATABASES = {} if config.get('db', 'engine') == 'mysql': diff --git a/config/views.py b/config/views.py index 264145ee..97323312 100644 --- a/config/views.py +++ b/config/views.py @@ -39,6 +39,10 @@ def index(request): mongodb_pwd = config.get('mongodb', 'mongodb_pwd') mongodb_collection = config.get('mongodb', 'collection') webssh_domain = config.get('webssh', 'domain') + redis_host = config.get('redis', 'redis_host') + redis_port = config.get('redis', 'redis_port') + redis_password = config.get('redis', 'redis_password') + redis_db = config.get('redis', 'redis_db') return render(request, 'config/index.html', locals()) @@ -73,6 +77,11 @@ def config_save(request): mongodb_collection = request.POST.get('mongodb_collection') # webssh domain webssh_domain = request.POST.get('webssh_domain') + # redis infon + redis_host = request.POST.get('redis_host') + redis_port = request.POST.get('redis_port') + redis_password = request.POST.get('redis_password') + redis_db = request.POST.get('redis_db') config = ConfigParser.RawConfigParser() dirs = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) @@ -102,6 +111,11 @@ def config_save(request): config.set('mongodb', 'collection', mongodb_collection) config.add_section('webssh') config.set('webssh', 'domain', webssh_domain) + config.add_section('redis') + config.set('redis', 'redis_host', redis_host) + config.set('redis', 'redis_port', redis_port) + config.set('redis', 'redis_password', redis_password) + config.set('redis', 'redis_db', redis_db) tips = u"保存成功!" display_control = "" with open(dirs+'/adminset.conf', 'wb') as cfgfile: @@ -127,6 +141,10 @@ def config_save(request): mongodb_pwd = config.get('mongodb', 'mongodb_pwd') mongodb_collection = config.get('mongodb', 'collection') webssh_domain = config.get('webssh', 'domain') + redis_host = config.get('redis', 'redis_host') + redis_port = config.get('redis', 'redis_port') + redis_password = config.get('redis', 'redis_password') + redis_db = config.get('redis', 'redis_db') else: display_control = "none" return render(request, 'config/index.html', locals()) @@ -151,6 +169,10 @@ def get_dir(args): mongodb_pwd = config.get('mongodb', 'mongodb_pwd') mongodb_collection = config.get('mongodb', 'collection') webssh_domain = config.get('webssh', 'domain') + redis_host = config.get('redis', 'redis_host') + redis_port = config.get('redis', 'redis_port') + redis_password = config.get('redis', 'redis_password') + redis_db = config.get('redis', 'redis_db') # 根据传入参数返回变量以获取配置,返回变量名与参数名相同 if args: return vars()[args] diff --git a/delivery/delivery.py b/delivery/delivery.py index fb9af7cb..bc588ff1 100644 --- a/delivery/delivery.py +++ b/delivery/delivery.py @@ -87,14 +87,14 @@ def delivery_edit(request, project_id): def delivery_deploy(request, project_id): server_list = [] project = Delivery.objects.get(job_name_id=project_id) - project.bar_data = 1 + project.bar_data = 10 job_name = project.job_name.name source_address = project.job_name.source_address app_path = project.job_name.appPath project.status = True project.deploy_num += 1 project.save() - sleep(5) + sleep(3) os.system("mkdir -p /var/opt/adminset/workspace/{0}/logs".format(job_name)) if app_path == "/": return HttpResponse("app deploy destination cannot /") diff --git a/delivery/tasks.py b/delivery/tasks.py index 1644304e..91e92f0b 100644 --- a/delivery/tasks.py +++ b/delivery/tasks.py @@ -8,6 +8,17 @@ import shutil from time import sleep +# class GetRedis(object): +# host = get_dir("redis_host") +# port = get_dir("redis_port") +# db = get_dir("redis_db") +# password = get_dir("redis_password") +# +# def connect(self): +# conn = redis.StrictRedis(host=self.host, port=self.port, +# password=self.password, db=self.db) +# return conn + @shared_task def deploy(job_name, server_list, app_path, source_address, project_id): @@ -18,22 +29,29 @@ def deploy(job_name, server_list, app_path, source_address, project_id): if app_path.endswith("/"): app_path += "/" # clean build code - p1.bar_data = 2 + p1.bar_data = 20 p1.save() - sleep(5) - print p1.bar_data + sleep(3) + cmd = "" if p1.build_clean: try: shutil.rmtree("{0}code/".format(job_workspace)) except: print "dir is not exists" - if os.path.exists("{0}code/.git".format(job_workspace)): - print "git pull" - cmd = "cd {0}code/ && git pull".format(job_workspace) - else: - print "git clone" - cmd = "git clone {0} {1}code/".format(source_address, job_workspace) - p1.bar_data = 3 + if p1.job_name.SOURCE_TYPE == "git": + if os.path.exists("{0}code/.git".format(job_workspace)): + cmd = "cd {0}code/ && git pull".format(job_workspace) + else: + cmd = "git clone {0} {1}code/".format(source_address, job_workspace) + if p1.job_name.SOURCE_TYPE == "svn": + if os.path.exists("{0}code/.svn".format(job_workspace)): + cmd = "cd {0}code/ && svn update".format(job_workspace) + else: + cmd = "svn checkout {0} {1}code/".format(source_address, job_workspace) + if p1.job_name.SOURCE_TYPE == "file": + os.remove("{0}code/*".format(job_workspace)) + cmd = "cd {1}code/ && wget {0} ".format(source_address, job_workspace) + p1.bar_data = 30 p1.save() sleep(5) p = Popen(cmd, stdout=PIPE, stderr=PIPE, shell=True) diff --git a/docs/Manual.txt b/docs/Manual.txt new file mode 100644 index 00000000..45d299b0 --- /dev/null +++ b/docs/Manual.txt @@ -0,0 +1,161 @@ +#主机名 + adminset程序依赖主机名,所以被控机器、客户机,都需要设置主机名,主机名唯一,并且可以被解析 + 请在 /etc/hosts 或是DNS中加入主机名的解析。 +#install + 安装需要使用yum源请保证可用,或使用本地yum源。 + 如果ubuntu客户端需要ansible等管理功能,需要开启root登录(配置脚本会自动开始,如不需要请手工关闭) + + 服务器安装: + 1、下载代码 + git clone https://github.com/guohongze/adminset.git + 2、执行安装脚本 + adminset/install/server/server_install.sh + 安装过程需要输入管理员数据库等交互信息,如果安装中断再次执行server_install.sh即可. + 安装过程中会生成rsa密钥,位于/root/.ssh 目录下,如果已经存在,忽略即可。 + 3、交互信息 + 1、如果系统开启了selinux会提示:Do you want to disabled selinux?[yes/no] + 选择yes。(默认yes) + 2、YUM源选择提示do you want to use an internet yum repository?[yes/no] + 没有本地的yum源请选择yes,如果有本地的YUM源(包括epel源)请选择no。(默认值yes) + 3、数据库选择提示:do you want to create a new mysql database?[yes/no] + 本地没有数据库选择yes自动下载安装mariadb数据库,如已经存在mysql或mariadb数据库选择no,然后填写相关信息主机、端口、用户名、密码。(默认值yes) + 4、mongodb选择提示:do you want to create a new Mongodb?[YES/no] + 本地没有mongodb选择yes自动下载安装mongodb数据库,如已经存在mongodb数据库选择no,然后填写相关信息主机、端口、用户名、密码。(默认值yes) + 5、创建超管用户提示,please create your adminset' super admin: 输入超管用户名、邮件、密码。 + 客户端安装 + 说明:为保证注册IP是管理IP(后续会被ansible等调用),客户端的IP抓取目前使用主机名解析,否则报错。 如:主机名为cn-bj-web01 请在/etc/hosts中加入相应的解析 192.168.x.x cn-bj-web01,这样再执行adminset_agent.py 可以保证正常运行。 centos7不进行解析也可获取主机IP. + step1:安装依赖 + 拷贝adminset/install/client/client_install.sh 到客户机上并执行: + sh client_install.sh + + step2:执行agent + 拷贝adminset/install/client/adminset_agent.py 到客户机上并执行: + python adminset_agent.py + 后台运行请参考: + nohup adminset_aent.py & + agent默认每1800秒上传一次资产和硬件信息,可以在adminset_agent.py中自定义 + 访问: + http://your_server_ip + 使用自己在安装过程中创建的super admin用户名密码 + +#程序目录 + 安装脚本会将文件安装在/var/opt/adminset + main为程序代码 + config 配置 + pid pid文件 + logs 日志 + data 常用数据 + +#站点导航用法 + 在站点管理中输入常用的运维工具系统后会自动出现在站点导航界面。 + +#cmdb用法 + install/client/adminset_agent.py 开户后会自动上报主机相关信息到CMDB + 获取主机信息 + http://your_server_ip/cmdb/get/host/?token=your_token&name=host_name + 获取所有主机: + http://your_server_ip/cmdb/get/host/?token=your_token&name=all + 获取组信息: + http://your_server_ip/cmdb/get/group/?token=your_token&name=group_name + 获取所有组: + http://your_server_ip/cmdb/get/group/?token=your_token&name=all + +#启用webssh + 需要设置域名解析,默认域名为adminset.cn(可以在配置管理页面进行变更) + 需要将这个域名做泛解析指向adminset所在的服务器,在本地或公网DNS都行,如果没有可以设置HOSTS解析,但HOSTS不支持泛解析。 + 这样做是为了解决webssh启动时区分不同session进行认证而设置。 + + 指向完成后点击资产管理中的webssh按钮会触发域名格式如下: + {{ host.hostname }}.adminset.cn:2222/ssh/host/{{ host.ip }} + 如主机名为cmdb IP为 192.168.47.130 + http://cmdb.adminset.cn:2222/ssh/host/192.168.47.130 + 通过此URL进入webssh访问界面,第一次进入时会询问用户名密码,请填写系统对应的用户和密码即可。 + + +# 定时任务用法 + 首先新建interval 或crontab + 新建任务填写名字 + 选择间隔或crontab + 在Keyword arguments(任务指令):处的写法是json格式: + 执行命令
+ {"host":"c1", name:"service tomcat restart"} + 执行脚本
+ {"host":"c1", name:"reboot.sh"} + 拉到最下边Task (registered) + setup.tasks.command是直接向目标机器发送命令 + setup.tasks.scripts是在目标机器上执行一个你已经上传到服务器中的脚本,默认路径/var/opt/adminset/data/scripts + 注意:已经运行任务以后,再去修改任务不会立即生效,需要重启beat组件,在任务编排的后台管理中可以重启。 + 这是由于celery的BUG导致,会在社区发布稳定版本以后修复。 + +#ansible用法 + 1、自动设置证书认证 + 通过adminset_agent自动上报的服务器,可以自动设置免密登入(认书认证) + 前提是已经在客户端做了hosts解析,并且密码与在服务器的系统配置>密钥设置>ssh password + 相同,也就是说如果自动分发密钥必须在系统配置中提前输入密码并保存,系统默认带的密码是root。 + 注意:系统只有在第一次上报信息时会调用ssh密钥分发.如果以后想使用自动密钥分发需要在资产管理中 + 删除服务信息,然后再自动上报即可。 + + 2、手工设置认证书认证。 + 配置免密钥登陆客机(ansible和shell管理客户机需要此配置) + 在服务器上执行 + ssh-keygen + ssh-copy-id -i /root/.ssh/id_rsa.pub {客户机IP} + 输入客户机密码后认证成功可以ssh免密登入 + + CMDB自动上报主机以后,在ansible页面执行 同步到ansible将主机信息写入ansible的hosts文件 + 然后将playbook 或是role脚本上传到/var/opt/adminset/data/playbook 或/var/opt/adminset/data/roles + +#shell用法 + 依赖免密登入(与ansible同) + CMDB自动上报主机以后,shell界面可以直接调用主机。 + 然后将常用脚本上传到/var/opt/adminset/data/scripts 中shell脚本栏将会自动发现脚本。 + +#监控平台用法 + 当adminset_agent.py自动上报信息到,监控会自动发现并配置,无需干预. + 当监控页面打开时,前端JS每10秒会异步抓取监控数据 + agent默认每60秒上传一次监控数据,可以在adminset_agent.py中自定义 + +#权限管理 + 1、新建权限如: + 名字:资产管理 + URL:/cmdb/ + 2、新建角色: + 名字:资产管理员 + 可选择权限:资产管理 + 3、新建用户 + 在角色一栏选择:资产管理员 + + +#组件启动管理 + service adminset {start|stop|restart} # gunicorn管理程序 + service nginx {start|stop|restart} # web server + service redis {start|stop|restart} # 缓存和任务列表 + service mariadb {start|stop|restart} # 数据库,账号资产等信息 + service celery {start|stop|restart} # 异步任务主程序 + service beat {start|stop|restart} # 任务调用 + service mongod {start|stop|restart} # 监控数据库 + service webssh {start|stop|restart} # web终端功能 + +#升级与更新 + 强烈建设在升级或更新adminset之前先备份数据库,并在测试环境验证通过,因为adminset在快速的发展过程中,每版本功能与结构变化较大。 + 1)小版本更新: + 如v0.3.6更新到v0.3.7只需下载相应版本的代码到本地然后执行: + adminset/install/update.sh + 2)大版本更新: + 如v0.3.0更新到v0.4.0 + adminset/install/server_install.sh + 如果原在数据库本机上未设置密码则在do you want to install new mysql/mongodb时选择yes可覆盖安装,这时会要求再创建一个超管,但不能和以前的超管同名,因为之前已经有数据了。 + 如果已设置密码或是独立服务器可以选择no,或者在安装完成后手动修改/var/opt/adminset/main/adminset.conf文件中的相应信息。 + 3)二次开发 + rsync.sh脚本只做增量,rsync参数不带--delete选项,不会在生产环境删除代码中已删除的条目,不更新组件配置文件,不会生成新的ORM数据库条目。 + update.sh脚本带--delete选项,同步代码,重新发布各组件的配置文件,并重新生成ORM数据文件(makemigrations migrate)。 + 4)0.5版本结构变动较大,更新请使用server_install.sh 然后在设置数据库时使用现有数据库。 + +# 安全 + 强烈建议不要将程序启动在有公网可以直接访问的设备上,如果需要请使用VPN。 + 建议生产环境中使用https配置服务器
+ 建议adminset放在网管区中,并且开启防火墙。 + django的settings中开启了DEBUG,在生产中需要关闭并指定自己的域名。 + +# 开发者交流 + QQ群:427794947 \ No newline at end of file diff --git a/install/server/update.sh b/install/server/update.sh index 8b0edda7..170f4f36 100755 --- a/install/server/update.sh +++ b/install/server/update.sh @@ -12,8 +12,15 @@ rsync --progress -ra --delete --exclude '.git' $cur_dir/ $adminset_dir #scp $adminset_dir/install/server/ansible/ansible.cfg /etc/ansible/ansible.cfg cd $adminset_dir pip install -r requirements.txt -python manage.py makemigrations -python manage.py migrate + +if [ $1 ] +then + python manage.py makemigrations $1 + python manage.py migrate +else + python manage.py makemigrations + python manage.py migrate +fi echo "####update celery####" mkdir -p $config_dir/celery scp $adminset_dir/install/server/celery/beat.conf $config_dir/celery/beat.conf diff --git a/static/dist/img/avatar.png b/static/dist/img/avatar.png new file mode 100644 index 0000000000000000000000000000000000000000..55d63064f5c74add69523769f5fb905072744206 GIT binary patch literal 8117 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 literal 0 HcmV?d00001 diff --git a/static/dist/img/avatar2.png b/static/dist/img/avatar2.png new file mode 100644 index 0000000000000000000000000000000000000000..26a4d22d5fe8be7f4589df39118469d6fce76d79 GIT binary patch literal 8262 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 literal 0 HcmV?d00001 diff --git a/static/dist/img/avatar3.png b/static/dist/img/avatar3.png new file mode 100644 index 0000000000000000000000000000000000000000..c3bf8a57e25c0760ee114e2a651db4ca27f7075f GIT binary patch literal 9241 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 literal 0 HcmV?d00001 diff --git a/templates/config/index.html b/templates/config/index.html index 3f1d176a..55378b83 100644 --- a/templates/config/index.html +++ b/templates/config/index.html @@ -77,17 +77,17 @@

{{ tips }}

- +
- +
- +
- +
@@ -141,6 +141,35 @@

{{ tips }}

+
+

Reids

+
+ + +
+ +
+
+
+ + +
+ +
+
+
+ + +
+ +
+
+
+ +
+ +
+

密钥设置

@@ -179,6 +208,7 @@

{{ tips }}

+

webssh域名设置

@@ -189,6 +219,7 @@

{{ tips }}

+