`

Ansible自定义模块

阅读更多

Ansible自定义模块


描述: 用户部署mondo客户端程序


具体代码见附件


执行脚本 : ansible zhangb_test2  -m mondo_deploy
参数说明:
zhangb_test2 :分组名称,即将一批主机按业务或其他标准进行分组,这里暂且将要装的主机IP划分到一个组里面。具体配置在/etc/ansible/hosts 文件中

-m :指明所用的模块(这里使用我们自定义的模块mondo_deploy)









-----------------------------------------------------------------------
#!/usr/bin/python
# -*- coding: utf-8 -*-

DOCUMENTATION = '''
---
module: mondo_deploy
short_description: check mondo client if has been deploy , if not exist then deploy.
description:
  - check mondo client if has been deploy , if not exist then deploy.
version_added: "1.0"

notes:
   - Not tested on any debian based system.
author: zhangb biao  <xtayhame@189.cn>
'''

import urllib2
import os
import json
import hashlib
import time
import urllib
from time import sleep
import getpass
import subprocess
import commands


#op2(132)
#server1='http://132.121.97.178:9518/sync/'
#192
#server2='http://192.168.51.191:9518/sync/'
#172
#server3='http://172.20.3.219:9518/sync/'

server_links = ['http://132.121.97.178:9518/sync/',
                'http://192.168.51.191:9518/sync/',
                'http://172.20.3.219:9518/sync/',]

down_dir='/data/mondev/mondo/client/'
log_dir='/data/mondev/mondo/client/log/'


def getCurrentServer():
    dict_server={}
    print 'get current can connect server......'
    for link in server_links:
        try:
            f = urllib2.urlopen(url=link,timeout=10)
            if f is not None:
                if f.code == 200:
                    now_server = link
                    server_json = f.read()
                    f.close()
                    dict_server['now_server']  = now_server  
                    dict_server['server_json']  = server_json
                    break
        except:
            print ''
    return dict_server

def createMulitDir(dir_path):
    try:
        if os.path.exists(dir_path) and os.path.isdir(dir_path):
            pass
        else:
            os.makedirs(dir_path)
    except:
        return False


def download(remotepath, locapath, servimd5, tempfile=True):
    time.sleep(1)
    tempath = ''
    if tempfile == True:
        tempath = locapath + '.tmp'
        urllib.urlretrieve(remotepath, tempath)
        time.sleep(1)
        if os.path.exists(tempath):
            if getMd5(tempath) == servimd5:
                try:
                    os.rename(tempath, locapath)
                    chmod(locapath)
                except Exception, e:
                    return False
            else:
                return False
  
                       

def chmod(filepath):
    if os.path.isfile(filepath):
        if filepath.endswith('.sh'):
            os.system("chmod 744  %s" % (filepath))
        elif filepath.endswith('.py'):
            os.system("chmod 644  %s" % (filepath))
        else:
            os.system("chmod 744  %s" % (filepath))              
           
'''
get file's MD5 value
'''          
def getMd5(file_path):
    with open(file_path,'rb') as f:
        md5obj = hashlib.md5()
        md5obj.update(f.read())
        hash = md5obj.hexdigest()
        return hash
     

'''
restart
'''
def restart():
    try:
        createMulitDir(log_dir)
        p = subprocess.Popen(['sh','/data/mondev/mondo/client/bin/magent','restart'],stdout=subprocess.PIPE)
        stdout, stderr = p.communicate()
    except Exception,ex:
        return False

'''
update mondev user's crontab
'''
def updateCrontab():
    file_name='/data/mondev/crontab_temp'
    if os.path.exists(file_name) and os.path.isfile(file_name):
        os.remove(file_name)
    f = open(file_name,'a')
    f.write('0 */24 * * * /data/mondev/mondo/client/bin/magent restart\n')
    f.close()
   
    if os.path.isfile(file_name):
        tuple_temp = commands.getstatusoutput('crontab /data/mondev/crontab_temp')
        if tuple_temp and tuple_temp[0] == 0:
            return True
        else:
            return False
    else:
        return False  

'''
check mondo client process if exist.
'''
def checkProcesss():
    tuple_temp = commands.getstatusoutput('ps -ef|grep mondev|grep -v grep|grep magent|wc -l')
    if tuple_temp and tuple_temp[0] == 0:
        print 'tuple_temp[1]=',tuple_temp[1]
        if tuple_temp[1] == '2':
            return True
    return False

def startDeploy():
    dict_temp={}
    dict_temp['result'] = False
    username = getpass.getuser()
    if username is not None and username == "mondev":
        if checkProcesss():
            dict_temp['result'] = True
            dict_temp['msg'] = 'mondo client has benn deployed.'
        else:
            print 'begin to deploy monod project.'
            dict_server = getCurrentServer()
            if dict_server and len(dict_server) == 2:
                now_server = dict_server['now_server']
                server_json = dict_server['server_json']
                print 'server link:', now_server
                print 'server json:' , server_json
                json_obj = json.loads(server_json)
                if json_obj:
                    for ak , av in json_obj.items():
                        file_dir = os.path.dirname(ak)
                        file_name = os.path.basename(ak)
                        temp_dir=''
                        if file_dir is not None:
                            temp_dir = os.path.join(down_dir,file_dir)
                        else:
                            temp_dir = down_dir
                        if os.path.exists(temp_dir) and os.path.isdir(temp_dir):
                            pass
                        else:
                            createMulitDir(temp_dir)
                       
                        file_path = os.path.join(temp_dir,file_name)
                        file_md5 = json_obj[ak]['md5']
                        if os.path.isfile(file_path):
                            md5 = getMd5(file_path)
                            if md5 is not None and file_md5 == md5:
                                pass
                            else:
                                download(os.path.join(now_server,ak), file_path, file_md5, tempfile=True)
                        else:
                            download(os.path.join(now_server,ak), file_path, file_md5, tempfile=True)
                   
                    restart()
                    updateCrontab()
                    time.sleep(3)
                    if checkProcesss():
                        dict_temp['result'] = True
                        dict_temp['msg'] = 'deployed success.'
                    else:
                        dict_temp['msg'] = 'Error:deploy fail......'
                else:
                    dict_temp['msg'] = "Error:service return result is not right......"
            else:
                dict_temp['msg'] = "Error:Can't find useful server link......"
    else:
        dict_temp['msg'] = 'Error:current user is not mondev......'
       
    return dict_temp
       
def main():
    module = AnsibleModule(
    argument_spec = dict(),supports_check_mode=True
    )
   
    try:
        dict_temp = startDeploy()
        if dict_temp and dict_temp['result']:
            module.exit_json(msg=dict_temp['msg'])
        else:
            module.exit_json(msg=dict_temp['msg'])   
    except Exception, ex:
        module.fail_json(changed=False, msg='%s ' % ex)
       
from ansible.module_utils.basic import *
main()




----------------------------------------------------------------------


@dianxinguangchang.43F.zhongshanerlu.yuexiuqu.guangzhoushi.guangdongsheng

2016-11-03 17:20

0
3
分享到:
评论

相关推荐

    ansible-mysql-query:Ansible自定义模块,允许您在mysql数据库中设置值

    Ansible模块,用于在mysql表中设置值或插入记录。 对于将配置存储在数据库中的Web应用程序很有用。 例如,icingaweb2需要将初始用户插入数据库。 install-wizard可以做到,但是Ansible想要自动安装;) 在Ansible ...

    Ansible-ansible-mysql-query.zip

    Ansible-ansible-mysql-query.zip,ansible自定义模块,允许您在mysql databasesansible role:mysql\u query中设置值,ansible是一个简单而强大的自动化引擎。它用于帮助配置管理、应用程序部署和任务自动化。

    ceph-ansible-4.0.62.tar.gz

    - **library**:可能包含一些Ansible自定义模块,用于执行特定的Ceph操作。 在实际使用中,你需要根据自己的网络环境修改inventory文件,定义各个节点的IP地址,并根据需求调整配置变量。然后,运行Ansible ...

    Ansible常用模块

    Ansible模块分为三种类型:核心模块、附加模块和用户自定义模块。核心模块是由Ansible官方团队提供的,附加模块是由各个社区提供的,用户自定义模块是由用户自己定义的。 六、联机帮助 Ansible提供了联机帮助,...

    ansible-nodetool:Ansible模块,用于通过Erlang RPC与Erlang节点进行交互

    然后,你可以将 `ansible-nodetool-master` 文件夹导入到你的 Ansible 自定义模块路径中。 2. **配置**:在 Ansible 的 inventory 文件中指定目标 Erlang 节点,并设置必要的认证信息,如用户名、密码和 SSH 密钥。...

    ansibleExamples

    在这个名为 "ansibleExamples" 的压缩包中,我们很显然看到是关于 Ansible 的开发实例,特别是针对 FTP 功能的自定义模块(modules)和回调插件(callback plugins)。 **Ansible 模块开发** 在 Ansible 中,模块是...

    ansible-module-diff:Ansible模块,用于相互比较字符串,文件内容或命令输出

    Ansible模块:差异一些尚未由提交或接受的自定义ansible模块。用法Ansible模块,用于对字符串,文件和命令输出进行通用差异。争论名称必需的默认描述来源是的diff的源输入。 可以是字符串,文件内容或命令的输出,...

    自动化运维工具ansible学习笔记

    Modules是Ansible的核心模块和自定义模块,核心模块可以使远程节点执行特定任务或匹配一个特定的状态,自定义模块可以添加新的功能。Plugins是完成模块功能的补充,包括连接插件、邮件插件等。Playbooks是Ansible...

    Ansible-ansible.zip

    5. **Go语言编写Ansible模块**:创建自定义模块时,可以使用Go语言。首先,需要了解Ansible模块的输入/输出约定,然后编写Go代码实现这些功能。最后,编译为可执行文件并放置在Ansible的模块目录下。 6. **...

    自动化运维工具Ansible文档与笔记.zip

    8. Ansible变量之自定义变量 9. Ansible变量之fact 10. Ansible魔法变量及变量优先级 11. 使用lookup生成变量 12. Ansible Vault配置加密 13. Ansible文件管理模块及Jinja2过滤器 14. Ansible Playbook with_X循环...

    Ansible的健康检查模块 -Python-下载

    在这个“Ansible的健康检查模块 - Python - 下载”主题中,我们将深入探讨如何使用Python编写自定义的Ansible模块来进行系统健康检查。 首先,让我们理解Ansible模块是什么。Ansible模块是可重用的代码单元,用于...

    Ansible学习资源文档

    Ansible模块和插件:介绍Ansible的核心模块和插件,以及如何编写自定义模块和插件。 Ansible任务和剧本:解释如何编写Ansible任务和剧本以实现特定的自动化任务。 Ansible角色和Playbooks:讲解如何组织和管理...

    ansible-zone:适用于Solaris的Ansible区域模块

    Python是Ansible的编程语言基础,因此,了解Python编程对于自定义模块和处理复杂逻辑是非常有用的。通过Python脚本,你可以扩展`ansible-zone`模块的功能,实现更高级的自动化任务,比如批量处理多个区域,或者根据...

    ansible-lab

    在IT行业中,Ansible是一款非常流行的自动化工具,尤其在配置管理、应用部署和任务执行等领域。"ansible-lab"很显然指向一个与...如果你进一步探索其中的Python内容,还可以增强对Ansible自定义模块的理解和应用。

    ansible自动化运维全本

    此外,还可以自定义模块以满足特定需求。学习如何选择和使用合适的模块,能有效提高自动化工作的效率和准确性。 除此之外,书中还会涉及Ansible的角色(Roles)和Galaxy平台。角色是一种组织和重用Playbook的最佳...

    奔跑吧ansible

    书中可能提到了编写自定义模块的方法,以及如何利用Ansible Galaxy分享和导入社区贡献的角色。这有助于读者根据自身需求定制自动化流程。 错误处理和最佳实践也是书中的重要部分。书中可能教导读者如何设置适当的...

    ansible中文手册

    用户可以自定义模块,也可以使用Ansible自带的核心模块。插件则用于增强模块的功能,例如连接插件负责与被管理节点的通信,邮件插件用于发送邮件通知等。 剧本(Playbooks)是Ansible中用于定义多任务配置的文件,...

    Ansible-content.zip

    通过结合使用`scap-workbench`和`ansible`,你可以创建自定义的检查任务,以验证主机是否符合NIST、DISA等机构发布的安全基准。 至于`bash`,在Ansible中,你可以使用`shell`或`command`模块执行bash命令,虽然这不...

    Ansible使用介绍

    ansible是新出现的自动化运维工具,基于...(3)、各种模块核心模块、command模块、自定义模块; (4)、借助于插件完成记录日志邮件等功能; (5)、playbook:剧本执行多个任务时,非必需可以让节点一次性运行多个任务

Global site tag (gtag.js) - Google Analytics