Ansible+Flask+jQueryFileUpload 远程文件管理

一.利用Ansible API 2.0对远程主机指定目录内文件的上传,删除,以及解压缩等操作.

核心代码:

AnsibleApi2.py

#!/usr/bin/env python
# -*- coding: utf-8 -*-
#
# this is the Simple Interface package of Ansible2 API
# 
# Author: TCollaboration
#

import os
from tempfile import NamedTemporaryFile
from collections import namedtuple
from ansible.parsing.dataloader import DataLoader
from ansible.vars import VariableManager
from ansible.inventory import Inventory
from ansible.playbook.play import Play
from ansible.executor.playbook_executor import PlaybookExecutor
from ansible.executor.task_queue_manager import TaskQueueManager
from ansible.plugins.callback import CallbackBase

class ResultsCollector(CallbackBase):

    def __init__(self, *args, **kwargs):
        super(ResultsCollector, self).__init__(*args, **kwargs)
        self.host_ok = {}
        self.host_unreachable = {}
        self.host_failed = {}

    def v2_runner_on_unreachable(self, result):
        self.host_unreachable[result._host.get_name()] = result

    def v2_runner_on_ok(self, result, *args, **kwargs):
        self.host_ok[result._host.get_name()] = result

    def v2_runner_on_failed(self, result, *args, **kwargs):
        self.host_failed[result._host.get_name()] = result

class AnsibleTask(object):

    def __init__(self, targetHost, passwd=None):

        Options = namedtuple(‘Options‘,
                             [‘listtags‘,
                              ‘listtasks‘,
                              ‘listhosts‘,
                              ‘syntax‘,
                              ‘connection‘,
                              ‘module_path‘,
                              ‘forks‘,
                              ‘remote_user‘,
                              ‘private_key_file‘,
                              ‘ssh_common_args‘,
                              ‘ssh_extra_args‘,
                              ‘sftp_extra_args‘,
                              ‘scp_extra_args‘,
                              ‘become‘,
                              ‘become_method‘,
                              ‘become_user‘,
                              ‘verbosity‘,
                              ‘check‘])

        # initialize needed objects
        self.variable_manager = VariableManager()

        self.options = Options(
            listtags=False,
            listtasks=False,
            listhosts=False,
            syntax=False,
            connection=‘smart‘,
            module_path=‘/usr/lib/python2.7/site-packages/ansible/modules‘,
            forks=100,
            remote_user=‘root‘,
            private_key_file=None,
            ssh_common_args=None,
            ssh_extra_args=None,
            sftp_extra_args=None,
            scp_extra_args=None,
            become=False,
            become_method=None,
            become_user=‘root‘,
            verbosity=None,
            check=False)
        if not passwd:
            self.passwords = dict(vault_pass=‘secret‘)
        else:
            self.passwords = {
                ‘conn_pass‘: ‘{0}‘.format(passwd),
                ‘become_pass‘: ‘{0}‘.format(passwd)
            }
        self.loader = DataLoader()

        # create inventory and pass to var manager
        self.hostsFile = NamedTemporaryFile(delete=False)
        self.hostsFile.write(targetHost)
        self.hostsFile.close()
        self.inventory = Inventory(
            loader=self.loader,
            variable_manager=self.variable_manager,
            host_list=self.hostsFile.name)
        self.variable_manager.set_inventory(self.inventory)
        self.callback = None

    def ansiblePlay(self, module_name, module_args):
        # create play with tasks
        play_source = dict(
            name="Ansible Play",
            hosts=‘all‘,
            gather_facts=‘no‘,
            tasks=[
                dict(action=dict(module=module_name, args=module_args))
            ]
        )
        play = Play().load(
            play_source,
            variable_manager=self.variable_manager,
            loader=self.loader)

        # run it
        tqm = None
        self.callback = ResultsCollector()
        try:
            tqm = TaskQueueManager(
                inventory=self.inventory,
                variable_manager=self.variable_manager,
                loader=self.loader,
                options=self.options,
                passwords=self.passwords,
                stdout_callback=‘default‘,
            )
            tqm._stdout_callback = self.callback
            result = tqm.run(play)
        finally:
            # print result
            if tqm is not None:
                tqm.cleanup()
                os.remove(self.hostsFile.name)
                self.inventory.clear_pattern_cache()

            return result

    def run_playbook(self, playbook_path):
        self.callback = ResultsCollector()
        pbex = PlaybookExecutor(
            playbooks=[playbook_path],
            inventory=self.inventory,
            variable_manager=self.variable_manager,
            loader=self.loader,
            options=self.options,
            passwords=self.passwords)

        pbex._tqm._stdout_callback = self.callback

        return pbex.run()  # 返回的结果是数字,不同的结果对应不同的数字

    def get_result(self):
        self.results_raw = {‘success‘: {}, ‘failed‘: {}, ‘unreachable‘: {}}
        for host, result in self.callback.host_ok.items():
            self.results_raw[‘success‘][host] = result._result

        for host, result in self.callback.host_failed.items():
            self.results_raw[‘failed‘][host] = result._result[‘msg‘]

        for host, result in self.callback.host_unreachable.items():
            self.results_raw[‘unreachable‘][host] = result._result[‘msg‘]

        return self.results_raw

def ansible_command(targetHost, passwd, module_name, module_args):
    """
     ansible 模块接口
     :param targetHost 主机ip
     :param passwd 主机访问密码
     :param module_name 模块名称
     :param module_args 模块参数
    """
    ansiTask = AnsibleTask(targetHost, passwd)
    ret = ansiTask.ansiblePlay(module_name, module_args)
    return ret, ansiTask.get_result()

def ansible_playbook(targetHost, passwd, playbook_yaml):
    """
     ansible playbook接口
     :param targetHost 主机ip
     :param passwd 主机访问密码
     :param playbook_yaml yaml任务文件
    """
    ansiTask = AnsibleTask(targetHost, passwd)
    ret = ansiTask.run_playbook(playbook_yaml)
    return ret, ansiTask.get_result()

二.利用jQueryFileUpload框架完成文件列表,文件上传,文件删除等操作的Http请求,以及UI展示

主要涉及到:

<script src="/static/plugins/jQueryFileUpload/vendor/jquery.ui.widget.js"></script>
<!-- The Templates plugin is included to render the upload/download listings -->
<script src="/static/plugins/jQueryFileUpload/tmpl.min.js"></script>
<!-- blueimp Gallery script -->
<script src="/static/plugins/jQueryFileUpload/jquery.blueimp-gallery.min.js"></script>
<!-- The Iframe Transport is required for browsers without support for XHR file uploads -->
<script src="/static/plugins/jQueryFileUpload/jquery.iframe-transport.js"></script>
<!-- The basic File Upload plugin -->
<script src="/static/plugins/jQueryFileUpload/jquery.fileupload.js"></script>
<!-- The File Upload processing plugin -->
<script src="/static/plugins/jQueryFileUpload/jquery.fileupload-process.js"></script>
<!-- The File Upload validation plugin -->
<script src="/static/plugins/jQueryFileUpload/jquery.fileupload-validate.js"></script>
<!-- The File Upload user interface plugin -->
<script src="/static/plugins/jQueryFileUpload/jquery.fileupload-ui.js"></script>
<!-- The main application script -->
<script src="/static/plugins/jQueryFileUpload/bootstrap.min.js"></script>

当然在form表单提交的时候,你可能会带外数据,那么你可能会用到jQueryFileUpload框架中的绑定事件,

如下:

// Callback for the submit event of each file upload:
// submit: function (e, data) {}, // .bind(‘fileuploadsubmit‘, func);

// Callback for the start of each file upload request:
// send: function (e, data) {}, // .bind(‘fileuploadsend‘, func);

// Callback for successful uploads:
// done: function (e, data) {}, // .bind(‘fileuploaddone‘, func);

// Callback for failed (abort or error) uploads:
// fail: function (e, data) {}, // .bind(‘fileuploadfail‘, func);

// Callback for completed (success, abort or error) requests:
// always: function (e, data) {}, // .bind(‘fileuploadalways‘, func);

// Callback for upload progress events:
// progress: function (e, data) {}, // .bind(‘fileuploadprogress‘, func);

// Callback for global upload progress events:
// progressall: function (e, data) {}, // .bind(‘fileuploadprogressall‘, func);

// Callback for uploads start, equivalent to the global ajaxStart event:
// start: function (e) {}, // .bind(‘fileuploadstart‘, func);

// Callback for uploads stop, equivalent to the global ajaxStop event:
// stop: function (e) {}, // .bind(‘fileuploadstop‘, func);

// Callback for change events of the fileInput(s):
// change: function (e, data) {}, // .bind(‘fileuploadchange‘, func);

// Callback for paste events to the pasteZone(s):
// paste: function (e, data) {}, // .bind(‘fileuploadpaste‘, func);

// Callback for drop events of the dropZone(s):
// drop: function (e, data) {}, // .bind(‘fileuploaddrop‘, func);

// Callback for dragover events of the dropZone(s):
// dragover: function (e) {}, // .bind(‘fileuploaddragover‘, func);

// Callback for the start of each chunk upload request:
// chunksend: function (e, data) {}, // .bind(‘fileuploadchunksend‘, func);

// Callback for successful chunk uploads:
// chunkdone: function (e, data) {}, // .bind(‘fileuploadchunkdone‘, func);

// Callback for failed (abort or error) chunk uploads:
// chunkfail: function (e, data) {}, // .bind(‘fileuploadchunkfail‘, func);

// Callback for completed (success, abort or error) chunk upload requests:
// chunkalways: function (e, data) {}, // .bind(‘fileuploadchunkalways‘, func);

三.利用Flask搭建Web服务器,Flask依赖两个外部库:Jinja2模板引擎和Werkzeug WSGI工具集。

页面展示:

打印业务数据:

当然这只是目前研究开发的项目中很小的一个功能模块,拿出来分享,谢谢.

时间: 2024-10-19 02:14:03

Ansible+Flask+jQueryFileUpload 远程文件管理的相关文章

ansible批量管理远程服务器

使用ansible批量管理远程服务器 背景 本地需要管理远程的一批服务器,主要执行以下任务: 1) 将本地的文件复制到远端所有服务器:  2) 需要在远程服务器中执行一个个命令: 远端服务器路径并非完全一致,一般访问通过环境变量中定义的变量路径访问:  比如在.bashrc中定义$app_path=/opt/app/bin 最终选择ansible,使用这个自动化运维工具可以满足我的需求:  下面介绍下对于我这种场景需要使用的ansible的主要模块:  关于ansible是什么以及安装配置请自行

使用ansible批量管理远程服务器

使用ansible批量管理远程服务器 背景 本地需要管理远程的一批服务器,主要执行以下任务: 1) 将本地的文件复制到远端所有服务器: 2) 需要在远程服务器中执行一个个命令: 远端服务器路径并非完全一致,一般访问通过环境变量中定义的变量路径访问: 比如在.bashrc中定义$app_path=/opt/app/bin 最终选择ansible,使用这个自动化运维工具可以满足我的需求: 下面介绍下对于我这种场景需要使用的ansible的主要模块: 关于ansible是什么以及安装配置请自行百度:

用Flask封装下Ansible提供后端API

Ansible是作为自动化运维的底层实现,功能很强大,但需要通过命令或playbook的yaml文件来实现,相对对运维人员而言,学习成本过大.所以这里要考虑到通过Flask Web框架来实现其二次封装,提供HTTP接口来实现远程调用.但我们在请求Ansbile API的时候,ansible默认本身是阻塞的,用户那边会一直处于等待状态,这样大家的用户体验也不好,所以这里会用rq来实现其非阻塞功能,即实现任务的异步化. 使用的开源软件 Ansible Flask redis redis-rq 代码地

[转帖]Ansible批量远程管理Windows主机(部署与配置)

2018-09-12 12:04:42 https://blog.51cto.com/7424593/2174156 一.测试环境介绍 Ansible管理主机: 系统:   CentOS6.8 IP Addr: 172.16.10.22 Linux管理服务器需安装pip.pywinrm插件 Windows客户端主机: 系统:   Server2008R2 SP1 IP Addr: 172.16.10.23 Windows机器需要安装或升级powershell4.0以上版本,Server2008R

自动化运维工具--Ansible常用模块

注意:-a 参数后的命令用单引号:双引号有可能会出问题,特别是在user模块 模块一:测试目标主机是否在线,ping模块 主机如果在线,则回复Pong [[email protected] ~]# ansible web -m ping 192.168.30.36 | SUCCESS => { "changed": false, "ping": "pong" } 192.168.30.32 | SUCCESS => { "c

Linux下的自动化运维ansible工具

什么是自动化运维     随着信息时代的持续发展,IT运维已经成为IT服务内涵中重要的组成部分.面对越来越复杂的业务, 面对越来越多样化的用户需求,不断扩展的IT应用需要越来越合理的模式来保障IT服务能灵活便捷.安 全稳定地持续保障,这种模式中的保障因素就是IT运维(其他因素是更加优越的IT架构等).从初期的 几台服务器发展到庞大的数据中心,单靠人工已经无法满足在技术.业务.管理等方面的要求,那么标 准化.自动化.架构优化.过程优化等降低IT服务成本的因素越来越被人们所重视.其中,自动化最开始作

paramiko &nbsp; 远程控制模块

paramiko   远程控制模块 paramiko是一个用于做远程控制的模块,使用该模块可以对远程服务器进行命令或文件操作,fabric和ansible内部的远程管理就是使用的paramiko来现实. 1.  下载安装 # pycrypto,由于 paramiko 模块内部依赖pycrypto,所以先下载安装pycrypto # 下载安装 pycrypto wget http://files.cnblogs.com/files/wupeiqi/pycrypto-2.6.1.tar.gz tar

Radmin远程控制软件

Radmin远程控制软件 日期:2015-08-20     作者:lujl   Radmin是一款快速的远程控制软件,可以用来远程管理公司或个人计算机来实现远程办公.你可以通过鼠标和键盘来控制远程的电脑,就好象直接坐在电脑操作自已的电脑一样.Radmin具有完全控制.屏幕监视.Telnet.文件传输管理.语音聊天.文字聊天.发送讯息.关机等功能,这些功能足以能满足你的办公需求. 与Radmin相比,网络人远程控制软件的功能更强大,网络人远程控制软件特点是采用UDP协议,可轻松穿透内网和防火墙且

Ansible configure management--翻译(二)

一. Getting Started with Ansible Ansible is profoundly different from other configuration management tools available today. It has been designed to make configuration easy in almost every way, from its simple English configuration syntax to its ease o