通过flask框架写成http接口调用Ansible
admin
2023-08-02 08:40:08
0
#*******一、flask_ansible.py文件
#!/usr/bin/env python
#_*_ coding:utf-8 _*_
import json
from flask import Flask,request
from ansible_api_job import Ansibles

app = Flask(__name__)

@app.route('/ansible/command', methods=['GET','POST'])
def command():
    if request.method == 'POST':
        jsondata = request.get_data()
        dictdata = json.loads(jsondata)
        ansible = Ansibles(dictdata['host']) #实例化Ansible对象
        res = ansible.shell(dictdata['command'])
        return res
    else:
        return '

Access error

' @app.route('/ansible/copyfile', methods=['GET','POST']) def copyfile():     if request.method == 'POST':         jsondata = request.get_data()         dictdata = json.loads(jsondata)         ansible = Ansibles(dictdata['targethost']) #实例化Ansible对象         res = ansible.copyfile(str(dictdata['srcfile']),str(dictdata['dectdir']))         return res     else:         return '

Access error

' @app.route('/ansible/pullfile',methods=['GET','POST']) def pullfile():     if request.method == 'POST':         jsondata = request.get_data()         dictdata = json.loads(jsondata)         ansible = Ansibles(dictdata['srchost'])         res = ansible.pull(dictdata['pullsrcfile'], dictdata['savelocaldir'])         return res     else:         return '

Access error

' if __name__ =='__main__':     app.run(debug=True,host='0.0.0.0') #************二、ansible_api_job.py文件 #!/user/bin/eng python # -*- coding=utf-8 -*- import ansible.runner class Ansibles(object):     def __init__(self,hostname):         self.hostlist = "host.txt"         self.user = "root"         self.passwd = "1qaz#EDC"         self.pattern = "vmserver"         self.hostname = hostname         hostlist = self.hostname.split(',')         hostfile = open('host.txt', 'w+')         hostfile.writelines('[vmserver]' + '\n')         for line in hostlist:             hostfile.writelines(line + '\n')         hostfile.close()     def shell(self,command):         results = ansible.runner.Runner(             host_list= self.hostlist,             remote_user = self.user,             remote_pass = self.passwd,             module_name = 'shell',             module_args = command,             pattern = self.pattern,             forks = 10             ).run()         for (hostname,result) in results['contacted'].items():             if result['stdout'] == "":                 return "HOST:%s, ERROR>>(%s)" % (hostname, result['stderr'])             else:                 return "HOST:%s, RESULTS>>(%s)" % (hostname, result['stdout'])     def copyfile(self,srcfile,dectdir):         results = ansible.runner.Runner(             host_list=self.hostlist,             remote_user=self.user,             remote_pass=self.passwd,             module_name='copy',             module_args='src=%s dest=%s' % (srcfile,dectdir),             pattern=self.pattern,             forks=10         ).run()         for (hostname,result) in results['contacted'].items():             if 'failed' in result:                 return "HOST:%s, ERROR>>(%s)" % (hostname,result['msg'])             else:                 return "HOST:%s, copy ok" % (hostname)     # 文件拉取到本地     def pull(self,pullsrcfile,savelocaldir):         pullfileres = ansible.runner.Runner(             host_list=self.hostlist,             remote_user=self.user,             remote_pass=self.passwd,             module_name='fetch',             module_args='src=%s dest=%s flat=yes' % (pullsrcfile, savelocaldir),             pattern=self.pattern,             forks=10         ).run()         for (hostname,result) in pullfileres['contacted'].items():             if 'msg' in result:                 return "HOST:%s ERROR>>(%s)" % (hostname,result['msg'])             else:                 return 'HOST:%s pull ok' % (hostname) if __name__ == "__main__":     pass      #*********三、urlib2调用http接口 #_*_coding:utf-8_*_ import urllib2 import json #调用执行命令HTTP接口 def ansible_http_post_command(host,command):     url = 'http://192.168.89.8:5000/ansible/command'     data = {'host': host, 'command': command}     headers = {'Content-Type': 'application/json'}     req = urllib2.Request(url=url, headers=headers, data=json.dumps(data))     response = urllib2.urlopen(req)     return response.read() #res = ansible_http_post_command('vm5',"uname -a") #print res #调用传送文件到目标主机的HTTP接口 def ansible_http_post_copyfile(srcfile,targethost,dectdir):     url = 'http://192.168.89.8:5000/ansible/copyfile'     data = {'srcfile': srcfile, 'targethost': targethost,'dectdir':dectdir}     headers = {'Content-Type': 'application/json'}     req = urllib2.Request(url=url, headers=headers, data=json.dumps(data))     response = urllib2.urlopen(req)     return response.read() res = ansible_http_post_copyfile('/tmp/12345.txt','vm4','/root/') print res #调用从目标主机中拉取文件到本地的HTTP接口 def ansible_http_post_pullsend(srchost,pullsrcfile,savelocaldir):     url = 'http://192.168.89.8:5000/ansible/pullfile'     data = {'srchost':srchost,'pullsrcfile':pullsrcfile,'savelocaldir':savelocaldir}     headers = {'Content-Type': 'application/json'}     req = urllib2.Request(url=url, headers=headers, data=json.dumps(data))     response = urllib2.urlopen(req)     return response.read() #res = ansible_http_post_pullsend('vm2','/tmp/12345.txt','/tmp/') #print res

相关内容

热门资讯

美政客唬人:万一中国商船藏导弹... 【文/观察者网 独生】这简直就是危言耸听!美国印第安纳州联邦参议员托德·扬(Todd Young)近...
声网联合网易智企-易盾推出内容... 随着直播、语聊、社交、游戏等实时互动场景持续火热,内容安全已经成为平台稳定运营的基础能力。对于此类场...
【社论】向着科技强国的目标坚定... 7月8日上午,国家科学技术奖励大会、两院院士大会、中国科协第十一次全国代表大会在京召开。习近平为国家...
7英寸+8000mAh!刚公布... 红米Note17开启预热,最大的惊喜是7英寸OLED超大屏和8000毫安时电池,搭配千元机的价格和定...
肯纳金属申请预加载铣刀专利,能... 国家知识产权局信息显示,肯纳金属公司申请一项名为“预加载铣刀”的专利,公开号CN122352957A...
原创 红... 红米新机继续推出,6月已推出红米K90至尊版,现在预热新一代小金刚,可谓是新机连连。红米拥有四大系列...
换车计划如何影响长期持有更关键... 在汽车消费过程中,换车是许多车主会面临的决策。而换车计划对于车辆长期持有来说有着至关重要的影响,这其...
日本也想凑热闹,明日将测试发射... 据《日经亚洲》报道,日本宇宙航空研究开发机构(JAXA)将于当地时间7月11日发射可回收火箭RV-X...
消息称以色列愿参与对伊打击,正... △霍尔木兹海峡(资料图)据以色列方面10日消息,以色列已向美国表示,以方愿参与美国对伊朗的进一步军事...
大金空调绿灯一闪一闪内外机不启... 1、检查空调设置的模式是否正确,比如空调遥控器设置的模式是制热,送风,抽湿等,及时的更换空调模式,使...