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  <[email protected]>
'''

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

猜你喜欢

转载自listen-raining.iteye.com/blog/2335157