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
分享到:
相关推荐
Ansible模块,用于在mysql表中设置值或插入记录。 对于将配置存储在数据库中的Web应用程序很有用。 例如,icingaweb2需要将初始用户插入数据库。 install-wizard可以做到,但是Ansible想要自动安装;) 在Ansible ...
Ansible-ansible-mysql-query.zip,ansible自定义模块,允许您在mysql databasesansible role:mysql\u query中设置值,ansible是一个简单而强大的自动化引擎。它用于帮助配置管理、应用程序部署和任务自动化。
- **library**:可能包含一些Ansible自定义模块,用于执行特定的Ceph操作。 在实际使用中,你需要根据自己的网络环境修改inventory文件,定义各个节点的IP地址,并根据需求调整配置变量。然后,运行Ansible ...
Ansible模块分为三种类型:核心模块、附加模块和用户自定义模块。核心模块是由Ansible官方团队提供的,附加模块是由各个社区提供的,用户自定义模块是由用户自己定义的。 六、联机帮助 Ansible提供了联机帮助,...
然后,你可以将 `ansible-nodetool-master` 文件夹导入到你的 Ansible 自定义模块路径中。 2. **配置**:在 Ansible 的 inventory 文件中指定目标 Erlang 节点,并设置必要的认证信息,如用户名、密码和 SSH 密钥。...
在这个名为 "ansibleExamples" 的压缩包中,我们很显然看到是关于 Ansible 的开发实例,特别是针对 FTP 功能的自定义模块(modules)和回调插件(callback plugins)。 **Ansible 模块开发** 在 Ansible 中,模块是...
Ansible模块:差异一些尚未由提交或接受的自定义ansible模块。用法Ansible模块,用于对字符串,文件和命令输出进行通用差异。争论名称必需的默认描述来源是的diff的源输入。 可以是字符串,文件内容或命令的输出,...
Modules是Ansible的核心模块和自定义模块,核心模块可以使远程节点执行特定任务或匹配一个特定的状态,自定义模块可以添加新的功能。Plugins是完成模块功能的补充,包括连接插件、邮件插件等。Playbooks是Ansible...
5. **Go语言编写Ansible模块**:创建自定义模块时,可以使用Go语言。首先,需要了解Ansible模块的输入/输出约定,然后编写Go代码实现这些功能。最后,编译为可执行文件并放置在Ansible的模块目录下。 6. **...
8. Ansible变量之自定义变量 9. Ansible变量之fact 10. Ansible魔法变量及变量优先级 11. 使用lookup生成变量 12. Ansible Vault配置加密 13. Ansible文件管理模块及Jinja2过滤器 14. Ansible Playbook with_X循环...
在这个“Ansible的健康检查模块 - Python - 下载”主题中,我们将深入探讨如何使用Python编写自定义的Ansible模块来进行系统健康检查。 首先,让我们理解Ansible模块是什么。Ansible模块是可重用的代码单元,用于...
Ansible模块和插件:介绍Ansible的核心模块和插件,以及如何编写自定义模块和插件。 Ansible任务和剧本:解释如何编写Ansible任务和剧本以实现特定的自动化任务。 Ansible角色和Playbooks:讲解如何组织和管理...
Python是Ansible的编程语言基础,因此,了解Python编程对于自定义模块和处理复杂逻辑是非常有用的。通过Python脚本,你可以扩展`ansible-zone`模块的功能,实现更高级的自动化任务,比如批量处理多个区域,或者根据...
在IT行业中,Ansible是一款非常流行的自动化工具,尤其在配置管理、应用部署和任务执行等领域。"ansible-lab"很显然指向一个与...如果你进一步探索其中的Python内容,还可以增强对Ansible自定义模块的理解和应用。
此外,还可以自定义模块以满足特定需求。学习如何选择和使用合适的模块,能有效提高自动化工作的效率和准确性。 除此之外,书中还会涉及Ansible的角色(Roles)和Galaxy平台。角色是一种组织和重用Playbook的最佳...
书中可能提到了编写自定义模块的方法,以及如何利用Ansible Galaxy分享和导入社区贡献的角色。这有助于读者根据自身需求定制自动化流程。 错误处理和最佳实践也是书中的重要部分。书中可能教导读者如何设置适当的...
用户可以自定义模块,也可以使用Ansible自带的核心模块。插件则用于增强模块的功能,例如连接插件负责与被管理节点的通信,邮件插件用于发送邮件通知等。 剧本(Playbooks)是Ansible中用于定义多任务配置的文件,...
通过结合使用`scap-workbench`和`ansible`,你可以创建自定义的检查任务,以验证主机是否符合NIST、DISA等机构发布的安全基准。 至于`bash`,在Ansible中,你可以使用`shell`或`command`模块执行bash命令,虽然这不...
ansible是新出现的自动化运维工具,基于...(3)、各种模块核心模块、command模块、自定义模块; (4)、借助于插件完成记录日志邮件等功能; (5)、playbook:剧本执行多个任务时,非必需可以让节点一次性运行多个任务