3.ansible1.7.2 callback插件获取硬件信息并插入到数据库中

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
云数据库 RDS MySQL,高可用系列 2核4GB
简介:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
#url: http://www.shencan.net/index.php/2014/07/17/ansible-%E6%8F%92%E4%BB%B6%E4%B9%8Bcallback_plugins-%EF%BC%88%E5%AE%9E%E6%88%98%EF%BC%89/
 
cat  / etc / ansible / ansible.cfg|grep callback|grep  - "#"
callback_plugins    =  / usr / share / ansible / plugins / callback
bin_ansible_callbacks  =  True
 
 
cat  / usr / share / ansible / plugins / callback / log_plays.py
#!/usr/bin/env python
# coding:utf8
# 插入到数据库中
import  simplejson
import  sys
import  commands
import  MySQLdb
import  os
import  json
import  time
# import sqlite3
#import redis
import  datetime
from  pymongo  import  MongoClient
 
 
mongoinfo  =  { "host" : "127.0.0.1" , "port" : "27408" , "user" : "root" , "password" : "root" , "dbname" : "ansible_log" }  
 
 
dbname  =  '/tmp/setup.db'
TIME_FORMAT = '%Y-%m-%d %H:%M:%S'
 
'''
try:
     con = sqlite3.connect(dbname)
     cur = con.cursor()
except:
     pass
'''
 
def  InsertMDB(values):
     global  mongoinfo
     dbhost  =  mongoinfo[ 'host' ]
     dbport  =  mongoinfo[ 'port' ]
     dbuser  =  mongoinfo[ 'user' ]
     dbpwd   =  mongoinfo[ 'password' ]
     dbname  =  mongoinfo[ 'dbname' ]
     uri  =  'mongodb://%s:%s@%s/%s' % (dbuser,dbpwd,dbhost,dbname)
     #client = MongoClient(uri,safe=False)
     client  =  MongoClient(uri)
     db  =  client.ansible_log
     db.callback.insert(values)
 
class  DB():
     def  __init__( self ):
         self .db  =  MySQLdb.connect( "localhost" "root" "root" "cmdb" )
         self .cursor  =  self .db.cursor()
     def  insert_hosts( self ,ipdict):
             ip  =  ipdict[ 'ip' ]
             hostname  =  ipdict[ 'hostname' ]
             vcpus  =  ipdict[ 'cpu_core' ]
             mem  =  ipdict[ 'memory' ]
             disk_total  =  ipdict[ 'disk' ]
             check_host  =  "select * from hosts_copy where IP = '%s' "  %  (ip)
             flag  =  self .cursor.execute(check_host)
             if  flag ! =  0L :
                 sql  =  "update hosts_copy set hostname = '%s',vcpus = '%s',mem = '%s',disk_total ='%s' where ip = '%s' "  %  (
                     hostname, vcpus, mem, disk_total, ip)
                 try :
                     print  (sql,  '******************' )
                     self .cursor.execute(sql)
                     # 提交到数据库执行
                     self .db.commit()
                     print  ( " '%s' update successfully !" %  (ip)
                 except :
                     # 发生错误时回滚
                     self .db.rollback()
                     print  'Something is wrong !!! '
             else :
                 sql  =  "INSERT INTO hosts_copy(ip,hostname,vcpus,mem,disk_total) VALUES('%s','%s','%s','%s','%s')"  %  (
                     ip, hostname, vcpus, mem, disk_total)
                 print  sql
                 self .cursor.execute(sql)
                 self .db.commit()
 
 
 
 
 
def  log(host, data):
     pass
#    if type(data) == dict:
#        invocation = data.pop('invocation', None)
#        if invocation.get('module_name', None) != 'setup':
#            return
#
#    facts = data.get('ansible_facts', None)
#
#    now = time.strftime(TIME_FORMAT, time.localtime())
#
#    try:
#        # `host` is a unique index
#        cur.execute("REPLACE INTO inventory (now, host, arch, dist, distvers, sys,kernel) VALUES(?,?,?,?,?,?,?);",
#        (
#            now,
#            facts.get('ansible_hostname', None),
#            facts.get('ansible_architecture', None),
#            facts.get('ansible_distribution', None),
#            facts.get('ansible_distribution_version', None),
#            facts.get('ansible_system', None),
#            facts.get('ansible_kernel', None)
#        ))
#        con.commit()
#    except:
#        pass
#
class  CallbackModule( object ):
     def  runner_on_ok( self , host, res):
         if  'stdout'  in  res.keys()  and  res[ 'stdout' ]:
             #print eval(res['stdout'].encode("utf-8"))
             #res_stdout = res['stdout'].encode("utf-8")
             res_stdout  =  res[ 'stdout' ].strip( '\r\n' ).split( '\n' )[ - 1 ]
             try :
                             res_dict  =  eval (res_stdout)
                             db  =  DB()
                             db.insert_hosts(res_dict)
                         except :
                             pass
             
         #host=host=res._host.get_name()
         #r = redis.Redis(host='127.0.0.1', port=6379, db=0) 
         #r.set(host,str(res))
         #f = open('/tmp/11','a')
         #f.write(str(host))
         #f.write(str(res))
         #f.close()
         #log(host, res)
         '''
         now = datetime.datetime.now()
         result = res
         result['time'] = now.strftime(TIME_FORMAT)
         result['status'] = 'ok'
         InsertMDB(result)
         '''
     def  runner_on_failed( self , host, res, ignore_errors = False ):
         =  open ( '/tmp/12' , 'a' )
         f.write( str (host))
         f.write( str (res))
         f.close()
         log(host, res)
 
 
 
说明
1. 插入mongodb
2. 插入mysql
在插入mysql的时候,最基本的log(host, data),可以获取setup的信息,所以在做机器初始化,可以通过setup模块获取,额外的需要自己写脚本,然后得到res


使用ansible-playbook -i hosts main.yml



最后附一张大神做的图片

QQ20140718-1@2x1.png



本文转自 liqius 51CTO博客,原文链接:http://blog.51cto.com/szgb17/2049678,如需转载请自行联系原作者

相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
6月前
|
关系型数据库 API 数据库
盘点Flask与数据库的交互插件——Flask-Sqlalchemy
盘点Flask与数据库的交互插件——Flask-Sqlalchemy
93 0
|
26天前
|
自然语言处理 关系型数据库 MySQL
MySQL数据库使用Match语法需要安装什么插件吗?
【10月更文挑战第1天】MySQL数据库使用Match语法需要安装什么插件吗?
46 0
|
5月前
|
PHP 数据库 数据安全/隐私保护
Duplicator插件如何进行数据库备份?
【6月更文挑战第4天】Duplicator插件如何进行数据库备份?
89 1
|
5月前
|
XML 关系型数据库 数据库
使用mybatis-generator插件生成postgresql数据库model、mapper、xml
使用mybatis-generator插件生成postgresql数据库model、mapper、xml
458 0
|
5月前
|
存储 安全 关系型数据库
安全开发-PHP应用&留言板功能&超全局变量&数据库操作&第三方插件引用&后台模块&Session&Cookie&Token&身份验证&唯一性
安全开发-PHP应用&留言板功能&超全局变量&数据库操作&第三方插件引用&后台模块&Session&Cookie&Token&身份验证&唯一性
|
6月前
|
SQL JSON 关系型数据库
[UE虚幻引擎插件DTPostgreSQL] PostgreSQL Connector 使用蓝图连接操作 PostgreSQL 数据库说明
本插件主要是支持在UE蓝图中连接和操作PostgreSQL 数据库。
58 2
|
6月前
|
关系型数据库 数据库 PostgreSQL
Docker【应用 03】给Docker部署的PostgreSQL数据库安装PostGIS插件(安装流程及问题说明)
Docker【应用 03】给Docker部署的PostgreSQL数据库安装PostGIS插件(安装流程及问题说明)
352 0
|
17天前
|
存储 关系型数据库 MySQL
Mysql(4)—数据库索引
数据库索引是用于提高数据检索效率的数据结构,类似于书籍中的索引。它允许用户快速找到数据,而无需扫描整个表。MySQL中的索引可以显著提升查询速度,使数据库操作更加高效。索引的发展经历了从无索引、简单索引到B-树、哈希索引、位图索引、全文索引等多个阶段。
52 3
Mysql(4)—数据库索引
|
2天前
|
关系型数据库 MySQL Linux
在 CentOS 7 中通过编译源码方式安装 MySQL 数据库的详细步骤,包括准备工作、下载源码、编译安装、配置 MySQL 服务、登录设置等。
本文介绍了在 CentOS 7 中通过编译源码方式安装 MySQL 数据库的详细步骤,包括准备工作、下载源码、编译安装、配置 MySQL 服务、登录设置等。同时,文章还对比了编译源码安装与使用 RPM 包安装的优缺点,帮助读者根据需求选择最合适的方法。通过具体案例,展示了编译源码安装的灵活性和定制性。
20 2
|
5天前
|
存储 关系型数据库 MySQL
MySQL vs. PostgreSQL:选择适合你的开源数据库
在众多开源数据库中,MySQL和PostgreSQL无疑是最受欢迎的两个。它们都有着强大的功能、广泛的社区支持和丰富的生态系统。然而,它们在设计理念、性能特点、功能特性等方面存在着显著的差异。本文将从这三个方面对MySQL和PostgreSQL进行比较,以帮助您选择更适合您需求的开源数据库。
23 4