接到一个新任务,要求自动给三千台服务器修改账号和密码(统一管控服务器预定用户的使用时间),对这方面比较陌生,就去买了一本python自动化运维(刘天斯著),观摩了大佬的作品,感觉用ansible的api实现这个功能应该是一个不错的思路,只需要在主机上面部署好服务就行,被控服务器不需要部署客户端,默认通过paramiko进行ssh连接下发执行命令或者配置,定时修改账号密码任务的创建是由Flask-APScheduler库触发的,定时任务存储在MySQL里,框架会定期轮询任务,到了预定时间就会触发执行ansible方法。

部署ansible主机服务参考:https://mp.csdn.net/console/editor/html/109224132

部署ansible的时候有遇到一个坑,在centos7.6下,通过yum安装的ansible,最新版是2.9.14,执行的时候会在baseurl参数那里报错,导致定时任务失败。

查看yum源的ansible版本:[root@pa_cicd ~]# yum list | grep ansibleansible.noarch                              2.9.14-1.el7               @epel
ansible.noarch                              2.9.15-1.el7               epel
ansible-doc.noarch                          2.9.15-1.el7               epel

后来通过系统里的python36,安装了新版2.10.3的ansible,步骤如下:

[root@pa_cicd ~]# pip3 install ansible安装好之后查看版本[root@pa_cicd ~]# ansible --version
ansible 2.10.3config file = /etc/ansible/ansible.cfgconfigured module search path = ['/root/.ansible/plugins/modules', '/usr/share/ansible/plugins/modules']ansible python module location = /usr/local/lib/python3.6/site-packages/ansibleexecutable location = /usr/local/bin/ansiblepython version = 3.6.8 (default, Aug  7 2019, 17:28:10) [GCC 4.8.5 20150623 (Red Hat 4.8.5-39)]

这个版本实测OK,可以完美运行ansible定时任务。

具体项目的目录结构如下:

在main.py模块内,创建APScheduler的实例并启动。

#!/usr/bin/env python# -*- coding: utf-8 -*-
# @Time    : ********
# @Author  : ********
# @function: Flask main modelfrom flask import Flask, url_for
from flask_apscheduler import APSchedulerfrom src.database import init_db
from src.auto_modify import views as auto_blueprintdef make_app(debug=False, **kwargs):app = Flask(__name__)app.config.from_pyfile('../config.py')app.debug = not app.config['PRODUCTION']app.jinja_env.auto_reload = Trueapp.jinja_env.globals.update(**kwargs)app.permanent_session_lifetime = 5 * 3600  # session live for secondsdb = init_db()db.init_app(app)src.admin.models.init_app(app)scheduler = APScheduler()scheduler.init_app(app)scheduler.start()return appapp = make_app()if app.config['CORS_SWITCH']:#only for debug to CROSfrom flask_cors import CORSCORS(app,supports_credentials=True)app.register_blueprint(auto_blueprint.auto)

在config.py模块内,配置apscheduler的参数。

#!/usr/bin/env python# -*- coding: utf-8 -*-
# @Time    : ********
# @Author  : ********
# @function: project config modelimport osfrom apscheduler.jobstores.sqlalchemy import SQLAlchemyJobStoreBASE_DIR = os.path.dirname(__file__)SQLALCHEMY_DATABASE_URI_PREFIX = 'mysql+mysqldb://root:{passwd}@0.0.0.0/'.format(passwd=DB_PASSWD)
SQLALCHEMY_TRACK_MODIFICATIONS = FalseSQLALCHEMY_DATABASE_URI = SQLALCHEMY_DATABASE_URI_PREFIX + '%s?charset=utf8' % DB_NAMESCHEDULER_JOBSTORES = {'default': SQLAlchemyJobStore(url=SQLALCHEMY_DATABASE_URI)
}SCHEDULER_EXECUTORS = {'default': {'type': 'threadpool', 'max_workers': 5}
}SCHEDULER_JOB_DEFAULTS = {'coalesce': False,'max_instances': 3
}SCHEDULER_API_ENABLED = True

在auto_modify\views.py内,写好对应的路由蓝图,供前端在用户预定服务器的时候,调用路由设置定时任务并存储到数据库。下面例子是添加定时任务的,还需要删除定时任务,修改定时任务的路由,参照着写就行。

#!/usr/bin/env python# -*- coding: utf-8 -*-
# @Time    : ********
# @Author  : ********
# @function: auto modify server BMC account and passwordimport json
import random
import logging
import datetimefrom flask_login import login_required
from flask import request, jsonify, session, current_app, Blueprintfrom src.reservation.models import SutData
from src.auto_modify.models import ApschedulerJobsauto = Blueprint('auto', __name__)
LOG = logging.getLogger(__name__)def random_num():"""Get 8 random password containing uppercase letters, lowercase letters and numbers:return:"""ret = ""for i in range(8):num = random.randint(0, 9)# Lowercase letterletter = chr(random.randint(97, 122))# Uppercase letterLetter = chr(random.randint(65, 90))s = str(random.choice([num, letter, Letter]))ret += sreturn ret@auto.route('/auto/add/', methods=["POST"])
@login_required
def auto_add():"""Add auto task:return:"""data = request.formif not data:data = json.loads(request.data)start_date = data.get('start_date')end_date = data.get('end_date')ip = data.get('ip')sut_id = data.get('sut_id')user = data.get('user')passwd = random_num()# Get server admin account and password from databasesut = SutData.query.get_or_404(sut_id)if sut:sut_user = sut.sutLoginUsersut_passwd = sut.sutLoginPasswordelse:return jsonify({'success': False,'message': "sut id is wrong!",})now_date = str(datetime.datetime.now().date())if start_date:start_date = str(start_date)end_job_name = passwd + "1"if end_date:end_date = str(end_date)end_date = end_date + " 23:55:00"start_func = "ansible_config:add_user"end_func = "ansible_config:delete_user"# If Scheduled start date is now, change account and password immediatelyif start_date == now_date:try:current_app.apscheduler.add_job(id=passwd, func=start_func, args=(sut_user, sut_passwd, ip, user, passwd))except:return jsonify({'success': False,'message': "Failed to create automatic modification task!",})else:try:current_app.apscheduler.add_job(id=passwd, func=start_func, trigger='date', replace_existing=True,run_date=start_date, args=(sut_user, sut_passwd, ip, user, passwd))except:return jsonify({'success': False,'message': "Failed to create automatic modification task!",})# While at the end of the scheduled date, add task to delete user's account and passwordtry:current_app.apscheduler.add_job(id=end_job_name, func=end_func, trigger='date', replace_existing=True,run_date=end_date, args=(sut_user, sut_passwd, ip, user))except:return jsonify({'success': False,'message': "Failed to create automatic modification task!",})return jsonify({'success': True,'passwd': passwd,})

在auto_modify\model.py内, 创建数据库表用来存储任务。这里创建此模块,是为了避免存储定时任务的表被migrate初始化的时候删除掉。

参考venv\lib\python2.7\site-packages\apscheduler\jobstores\sqlalchemy.py库的SQLAlchemyJobStore类初始化方法里面的self.jobs_t设置就行。

#!/usr/bin/env python# -*- coding: utf-8 -*-
# @Time    : ********
# @Author  : ********
# @function: auto modify server BMC account and passwordfrom sqlalchemy import Column, String, Integer, Text, DateTime, Unicode, Float, LargeBinaryfrom src.database import dbclass ApschedulerJobs(db.Model):__tablename__ = 'apscheduler_jobs'id = Column(Unicode(191, _warn_on_bytestring=False), primary_key=True)next_run_time = Column(Float(25), index=True)job_state = Column(LargeBinary, nullable=False)

在ansible_config.py里,编写具体要被执行的ansible方法。

#!/usr/bin/env python# -*- coding: utf-8 -*-
# @Time    : ********
# @Author  : ********
# @function: ansible functionimport re
import logging
import subprocessLOG = logging.getLogger(__name__)def add_user(sut_user, sut_passwd, bmc_ip, new_user, new_password):"""Add User:param sut_user::param sut_passwd::param bmc_ip::param new_user::param new_password::return:"""command = '/usr/local/bin/ansible localhost -m redfish_command -a "category=Accounts command=AddUser ' \'baseuri=%s username=%s password=%s roleid=Administrator new_username=%s ' \'new_password=%s timeout=60"' % (bmc_ip, sut_user, sut_passwd, new_user, new_password)LOG.info("This is step: Add XCC User.\n")LOG.info("This step will add a XCC user %s, password is %s, role is Administrator\n" % (new_user, new_password))try:output = subprocess.check_output(command, shell=True, universal_newlines=True)except Exception as err:LOG.error("Failed to execute command! The error info [%s]\n" % err)return check = re.compile(r"\"msg\": \"Action was successful\"")check_result = check.findall(output)if len(check_result) == 0:LOG.error("Add user command Failed.\n")LOG.error(output)else:LOG.info("Add user command Succeed.\n")def delete_user(sut_user, sut_passwd, bmc_ip, new_user):"""Delete User:param sut_user::param sut_passwd::param bmc_ip::param new_user::return:"""command = '/usr/local/bin/ansible localhost -m redfish_command -a "category=Accounts command=DeleteUser ' \'baseuri=%s username=%s password=%s new_username=%s timeout=60"' % \(bmc_ip, sut_user, sut_passwd, new_user)LOG.info("This step will delete user %s \n" % new_user)try:output = subprocess.check_output(command, shell=True, universal_newlines=True)except Exception as err:LOG.error("Failed to execute command! The error info [%s]\n" % err)returncheck = re.compile(r"\"msg\": \"Action was successful\"")check_result = check.findall(output)if len(check_result) == 0:LOG.error("Delete user command Failed.\n")LOG.error(output)else:LOG.info("Delete user command Succeed.\n")

这是MySQL存储的定时任务:

至此,初步的无人值守修改大量服务器账号密码功能就实现了。

通过ansible和Flask-APScheduler实现自动化无人值守修改服务器账号密码相关推荐

  1. python flask+apscheduler定时任务导致数据重复和错误

    python flask+apscheduler 定时任务导致数据重复和错误的解决办法 我们先看一下未定时前的代码,每一次执行数据都是准确的,是我们想要的结果 import datetime clas ...

  2. 运维自动化之ansible,轻松实现企业级自动化运维

    Ansible是近年来越来越火的一款开源运维自动化工具,通过Ansible可以实现运维自动化,提高运维工程师的工作效率,减少人为失误. Ansible通过本身集成的非常丰富的模块可以实现各种管理任务, ...

  3. 搭建Cobbler无人值守安装服务器

    Cobbler 介绍 Cobbler是一个Linux服务器快速网络安装的服务,而且在经过调整也可以支持网络安装windows. 该工具使用python开发,小巧轻便(才15k行python代码),可以 ...

  4. 搭建无人值守安装服务器(CentOS)

    使用PXE+DHCP+TFTP+Kickstart+FTP搭建无人值守安装服务器.一般只有频繁安装系统才会搭建无人值守安装服务器. 虚拟机环境:youxi1,CentOS7系统双网卡,一个网卡桥接模式 ...

  5. python自动化部署程序,聊聊Python自动化脚本部署服务器全流程(详细)

    原标题:聊聊Python自动化脚本部署服务器全流程(详细) 来源:AirPython 作者:星安果 1. 前言 大家好,我是安果! 日常编写的 Python 自动化程序,如果在本地运行稳定后,就可以考 ...

  6. Flask入门之上传文件到服务器

    https://www.cnblogs.com/wongbingming/p/6802660.html flask 文件的上传下载和excel操作 Flask入门之上传文件到服务器 今天要做一个简单的 ...

  7. python的flask实现第三方登录怎么写_Python语言的Flask框架应用程序实现使用QQ账号登录的方法...

    本文主要向大家介绍了Python语言的Flask框架应用程序实现使用QQ账号登录的方法,希望对大家学习Python语言有所帮助. Flask-OAuthlib是OAuthlib的Flask扩展实现, ...

  8. 搭建无人值守安装服务器

    搭建无人值守安装服务器 方法:FTP+TFTP+DHCP+Kickstart+PXE 一.原理和概念 1.PXE PXE并不是一种安装方式,而是一种引导方式.进行PXE安装的必要条件是要安装的计算机中 ...

  9. 批量自动化配置Dell服务器idrac管理口IP

    背景说明 工作中经常会遇到一次上几十台.几百台服务器的情况 每当到这个时候小伙伴们拿台笔记本和一根网线,一台服务器.一台服务器的去修改idrac IP 为了节约这个工作量,利用dell的racadm工 ...

最新文章

  1. 【年度学术大会合集】SIGGRAPH,KDD,AAAI,NIPS…这些你想参加的会议
  2. Memcached 1.5.13 发布,支持 TLS
  3. linux ora 00119,ORA-00119和ORA-00132的解决方案
  4. 【深度学习系列】基础知识、模型学习
  5. Linux网络故障排查命令(ifconfig、ping、telnet、netstat、lsof、nc、curl、tcpdump)
  6. java dump分析工具_Java 性能分析工具 (2):Java 内置监控工具
  7. 想了解表格问答,我们先看看TA的前世
  8. JS实现图片翻书效果
  9. mysql如何从两个表取出内容_如何从mysql中的两个表中获取数据?
  10. Hugging Face Course-Diving in 抱抱脸 Datasets library
  11. 智和信通围绕智和网管平台构建统一监控运维方案
  12. 计算机鼠标双击怎么,电脑鼠标双击没反应怎么办
  13. office_professional_plus_2010安装
  14. HiveSQL最近7/30日各品牌复购率
  15. NFC应用(一)卡应用
  16. “自动修复”无法修复你的电脑-SATAFIRM S11-固态硬盘坏了
  17. libvirt Java 实现远程管理虚拟机
  18. Git统计一段时间内代码的修改量
  19. CAD制图初学入门教程:CAD怎么复制?
  20. 最新版win10安装Texlive2022和Texstudio2022教程

热门文章

  1. 为安全起见 出差时可以将涉密计算机,张某因组织聚众扰乱公共秩序被公安机关行政拘留15日。张某提起行政诉讼的时限应自获得人身自由之日起...
  2. Linux 挂载2TB以上硬盘
  3. 【求职】程序员如何应对面试?保姆级步骤让你完美面试
  4. 安卓手机使用Alpine Term APK安装Linux系统,并安装docker
  5. 发送测试报告时,报错:ClassNotFoundException: javax.mail.MessagingException
  6. EmailAll 强大的邮箱收集工具(企业邮箱收集)
  7. BBR学习笔记--什么是BBR、可调整的参数
  8. python 移动平均线_6移动平均线预测交易
  9. 自动点击大师(AUTO CLICKER)
  10. Fiddler抓取微信公众号数据