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