SaltStack源码分析之使用MongoDB模块
MongoDB模块/usr/lib/python2.6/site-packages/salt/modules/mongodb.py
MongoDB模块会先去检查是否安装有PyMongo模块
#-*-coding:utf-8-*-'''ModuletoprovideMongoDBfunctionalitytoSalt:configuration:ThismoduleusesPyMongo,andacceptsconfigurationdetailsasparametersaswellasconfigurationsettings::mongodb.host:'localhost'mongodb.port:27017mongodb.user:''mongodb.password:''Thisdatacanalsobepassedintopillar.Optionspassedintooptswilloverwriteoptionspassedintopillar.'''
#Importpythonlibsimportlogging#Importsaltlibsfromsalt._compatimportstring_types#Importthirdpartylibstry:importpymongoHAS_MONGODB=TrueexceptImportError:HAS_MONGODB=Falselog=logging.getLogger(__name__)
引入logging模块处理日志,再引入salt._compat.string_types
对检查pymongo进行异常处理,如果导入pymongo成功,设置HAS_MONGODB变量为True,导入失败设置为False
def__virtual__():'''Onlyloadthismoduleifpymongoisinstalled'''ifHAS_MONGODB:return'mongodb'else:returnFalse
如果定义一个__virtual__函数,可以控制是否允许这个模块可见。如果返回False,SaltStack将会忽略这个模块,如果返回一个字符串,SaltStack将使用这个字符串。
def_connect(user=None,password=None,host=None,port=None,database='admin'):'''Returnsatupleof(user,host,port)withconfig,pillar,ordefaultvaluesassignedtomissingvalues.'''ifnotuser:user=__salt__['config.option']('mongodb.user')ifnotpassword:password=__salt__['config.option']('mongodb.password')ifnothost:host=__salt__['config.option']('mongodb.host')ifnotport:port=__salt__['config.option']('mongodb.port')try:conn=pymongo.connection.Connection(host=host,port=port)mdb=pymongo.database.Database(conn,database)ifuserandpassword:mdb.authenticate(user,password)exceptpymongo.errors.PyMongoError:log.error('Errorconnectingtodatabase{0}'.format(database))returnFalsereturnconn
pymongo.connection.Connection
这个方法PyMongo已经弃用,使用新的MongoClient代替。
defdb_list(user=None,password=None,host=None,port=None):'''ListallMongodbdatabasesCLIExample:..code-block::bashsalt'*'mongodb.db_list<user><password><host><port>'''conn=_connect(user,password,host,port)ifnotconn:return'Failedtoconnecttomongodatabase'try:log.info('Listingdatabases')returnconn.database_names()exceptpymongo.errors.PyMongoErroraserr:log.error(err)returnstr(err)
列出所有的MongoDB数据库
$sudosalt'*'mongodb.db_list''''10.10.41.1728018localhost.localdomain:'mongodb.db_list'isnotavailable.gintama-qa-server:-pay-clan-test-game1-admin-gam_server_1
SaltStack会先去检测是否包含有PyMongo模块,如果有就执行没有就不执行。
defdb_exists(name,user=None,password=None,host=None,port=None):'''ChecksifadatabaseexistsinMongodbCLIExample:..code-block::bashsalt'*'mongodb.db_exists<name><user><password><host><port>'''dbs=db_list(user,password,host,port)ifisinstance(dbs,string_types):returnFalsereturnnameindbs
检查一个库是否存在
$sudosalt'gintama-qa-server'mongodb.db_existspay''''10.10.41.1728018gintama-qa-server:True$sudosalt'gintama-qa-server'mongodb.db_existspay3''''10.10.41.1728018gintama-qa-server:False
defdb_remove(name,user=None,password=None,host=None,port=None):'''RemoveaMongodbdatabaseCLIExample:..code-block::bashsalt'*'mongodb.db_remove<name><user><password><host><port>'''conn=_connect(user,password,host,port)ifnotconn:return'Failedtoconnecttomongodatabase'try:log.info('Removingdatabase{0}'.format(name))conn.drop_database(name)exceptpymongo.errors.PyMongoErroraserr:log.error('Removingdatabase{0}failedwitherror:{1}'.format(name,str(err)))returnstr(err)returnTrue
删除一个库
defuser_list(user=None,password=None,host=None,port=None,database='admin'):'''ListusersofaMongodbdatabaseCLIExample:..code-block::bashsalt'*'mongodb.user_list<name><user><password><host><port><database>'''conn=_connect(user,password,host,port)ifnotconn:return'Failedtoconnecttomongodatabase'try:log.info('Listingusers')mdb=pymongo.database.Database(conn,database)output=[]foruserinmdb.system.users.find():output.append([('user',user['user']),('readOnly',user.get('readOnly','None'))])returnoutputexceptpymongo.errors.PyMongoErroraserr:log.error('Listingusersfailedwitherror:{0}'.format(str(err)))returnstr(err)
列出账号
defuser_exists(name,user=None,password=None,host=None,port=None,database='admin'):'''ChecksifauserexistsinMongodbCLIExample:..code-block::bashsalt'*'mongodb.user_exists<name><user><password><host><port><database>'''users=user_list(user,password,host,port,database)foruserinusers:ifname==dict(user).get('user'):returnTruereturnFalse
查看账号是否存在
defuser_create(name,passwd,user=None,password=None,host=None,port=None,database='admin'):'''CreateaMongodbuserCLIExample:..code-block::bashsalt'*'mongodb.user_create<name><user><password><host><port><database>'''conn=_connect(user,password,host,port)ifnotconn:return'Failedtoconnecttomongodatabase'try:log.info('Creatinguser{0}'.format(name))mdb=pymongo.database.Database(conn,database)mdb.add_user(name,passwd)exceptpymongo.errors.PyMongoErroraserr:log.error('Creatingdatabase{0}failedwitherror:{1}'.format(name,str(err)))returnstr(err)returnTrue
创建账号
defuser_remove(name,user=None,password=None,host=None,port=None,database='admin'):'''RemoveaMongodbuserCLIExample:..code-block::bashsalt'*'mongodb.user_remove<name><user><password><host><port><database>'''conn=_connect(user,password,host,port)ifnotconn:return'Failedtoconnecttomongodatabase'try:log.info('Removinguser{0}'.format(name))mdb=pymongo.database.Database(conn,database)mdb.remove_user(name)exceptpymongo.errors.PyMongoErroraserr:log.error('Creatingdatabase{0}failedwitherror:{1}'.format(name,str(err)))returnstr(err)returnTrue
测试情况
$sudosalt'gintama-qa-server'mongodb.user_creategintamagintama123''''10.10.41.1728018taiwan_game1gintama-qa-server:True$sudosalt'gintama-qa-server'mongodb.user_existsgintama''''10.10.41.1728018taiwan_game1gintama-qa-server:True$sudosalt'gintama-qa-server'mongodb.user_list''''10.10.41.1728018taiwan_game1gintama-qa-server:|_|_-user-gintama|_-readOnly-None$sudosalt'gintama-qa-server'mongodb.user_removegintama''''10.10.41.1728018taiwan_game1gintama-qa-server:True$sudosalt'gintama-qa-server'mongodb.user_list''''10.10.41.1728018taiwan_game1gintama-qa-server:$sudosalt'gintama-qa-server'mongodb.user_existsgintama''''10.10.41.1728018taiwan_game1gintama-qa-server:False
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。