SaltStack源码分析之使用MongoDB模块
发表于:2026-11-01 作者:千家信息网编辑
千家信息网最后更新 2026年11月01日,MongoDB模块/usr/lib/python2.6/site-packages/salt/modules/mongodb.pyMongoDB模块会先去检查是否安装有PyMongo模块# -*- c
千家信息网最后更新 2026年11月01日SaltStack源码分析之使用MongoDB模块
MongoDB模块/usr/lib/python2.6/site-packages/salt/modules/mongodb.py
MongoDB模块会先去检查是否安装有PyMongo模块
# -*- coding: utf-8 -*-'''Module to provide MongoDB functionality to Salt:configuration: This module uses PyMongo, and accepts configuration details as parameters as well as configuration settings:: mongodb.host: 'localhost' mongodb.port: 27017 mongodb.user: '' mongodb.password: '' This data can also be passed into pillar. Options passed into opts will overwrite options passed into pillar.'''
# Import python libsimport logging# Import salt libsfrom salt._compat import string_types# Import third party libstry: import pymongo HAS_MONGODB = Trueexcept ImportError: HAS_MONGODB = Falselog = logging.getLogger(__name__)
引入logging模块处理日志,再引入salt._compat.string_types
对检查pymongo进行异常处理,如果导入pymongo成功,设置HAS_MONGODB变量为True,导入失败设置为False
def __virtual__(): ''' Only load this module if pymongo is installed ''' if HAS_MONGODB: return 'mongodb' else: return False
如果定义一个__virtual__函数,可以控制是否允许这个模块可见。如果返回False,SaltStack将会忽略这个模块,如果返回一个字符串,SaltStack将使用这个字符串。
def _connect(user=None, password=None, host=None, port=None, database='admin'): ''' Returns a tuple of (user, host, port) with config, pillar, or default values assigned to missing values. ''' if not user: user = __salt__['config.option']('mongodb.user') if not password: password = __salt__['config.option']('mongodb.password') if not host: host = __salt__['config.option']('mongodb.host') if not port: port = __salt__['config.option']('mongodb.port') try: conn = pymongo.connection.Connection(host=host, port=port) mdb = pymongo.database.Database(conn, database) if user and password: mdb.authenticate(user, password) except pymongo.errors.PyMongoError: log.error('Error connecting to database {0}'.format(database)) return False return connpymongo.connection.Connection
这个方法PyMongo已经弃用,使用新的MongoClient代替。
def db_list(user=None, password=None, host=None, port=None): ''' List all Mongodb databases CLI Example: .. code-block:: bash salt '*' mongodb.db_list''' conn = _connect(user, password, host, port) if not conn: return 'Failed to connect to mongo database' try: log.info('Listing databases') return conn.database_names() except pymongo.errors.PyMongoError as err: log.error(err) return str(err)
列出所有的MongoDB数据库
$ sudo salt '*' mongodb.db_list '' '' 10.10.41.17 28018localhost.localdomain: 'mongodb.db_list' is not available.gintama-qa-server: - pay - clan - test - game1 - admin - gam_server_1
SaltStack会先去检测是否包含有PyMongo模块,如果有就执行没有就不执行。
def db_exists(name, user=None, password=None, host=None, port=None): ''' Checks if a database exists in Mongodb CLI Example: .. code-block:: bash salt '*' mongodb.db_exists''' dbs = db_list(user, password, host, port) if isinstance(dbs, string_types): return False return name in dbs
检查一个库是否存在
$ sudo salt 'gintama-qa-server' mongodb.db_exists pay '' '' 10.10.41.17 28018gintama-qa-server: True$ sudo salt 'gintama-qa-server' mongodb.db_exists pay3 '' '' 10.10.41.17 28018gintama-qa-server: False
def db_remove(name, user=None, password=None, host=None, port=None): ''' Remove a Mongodb database CLI Example: .. code-block:: bash salt '*' mongodb.db_remove''' conn = _connect(user, password, host, port) if not conn: return 'Failed to connect to mongo database' try: log.info('Removing database {0}'.format(name)) conn.drop_database(name) except pymongo.errors.PyMongoError as err: log.error( 'Removing database {0} failed with error: {1}'.format( name, str(err) ) ) return str(err) return True
删除一个库
def user_list(user=None, password=None, host=None, port=None, database='admin'): ''' List users of a Mongodb database CLI Example: .. code-block:: bash salt '*' mongodb.user_list''' conn = _connect(user, password, host, port) if not conn: return 'Failed to connect to mongo database' try: log.info('Listing users') mdb = pymongo.database.Database(conn, database) output = [] for user in mdb.system.users.find(): output.append([ ('user', user['user']), ('readOnly', user.get('readOnly', 'None')) ]) return output except pymongo.errors.PyMongoError as err: log.error( 'Listing users failed with error: {0}'.format( str(err) ) ) return str(err)
列出账号
def user_exists(name, user=None, password=None, host=None, port=None, database='admin'): ''' Checks if a user exists in Mongodb CLI Example: .. code-block:: bash salt '*' mongodb.user_exists''' users = user_list(user, password, host, port, database) for user in users: if name == dict(user).get('user'): return True return False
查看账号是否存在
def user_create(name, passwd, user=None, password=None, host=None, port=None, database='admin'): ''' Create a Mongodb user CLI Example: .. code-block:: bash salt '*' mongodb.user_create''' conn = _connect(user, password, host, port) if not conn: return 'Failed to connect to mongo database' try: log.info('Creating user {0}'.format(name)) mdb = pymongo.database.Database(conn, database) mdb.add_user(name, passwd) except pymongo.errors.PyMongoError as err: log.error( 'Creating database {0} failed with error: {1}'.format( name, str(err) ) ) return str(err) return True
创建账号
def user_remove(name, user=None, password=None, host=None, port=None, database='admin'): ''' Remove a Mongodb user CLI Example: .. code-block:: bash salt '*' mongodb.user_remove''' conn = _connect(user, password, host, port) if not conn: return 'Failed to connect to mongo database' try: log.info('Removing user {0}'.format(name)) mdb = pymongo.database.Database(conn, database) mdb.remove_user(name) except pymongo.errors.PyMongoError as err: log.error( 'Creating database {0} failed with error: {1}'.format( name, str(err) ) ) return str(err) return True
测试情况
$ sudo salt 'gintama-qa-server' mongodb.user_create gintama gintama123 '' '' 10.10.41.17 28018 taiwan_game1gintama-qa-server: True$ sudo salt 'gintama-qa-server' mongodb.user_exists gintama '' '' 10.10.41.17 28018 taiwan_game1gintama-qa-server: True$ sudo salt 'gintama-qa-server' mongodb.user_list '' '' 10.10.41.17 28018 taiwan_game1gintama-qa-server: |_ |_ - user - gintama |_ - readOnly - None$ sudo salt 'gintama-qa-server' mongodb.user_remove gintama '' '' 10.10.41.17 28018 taiwan_game1gintama-qa-server: True$ sudo salt 'gintama-qa-server' mongodb.user_list '' '' 10.10.41.17 28018 taiwan_game1gintama-qa-server:$ sudo salt 'gintama-qa-server' mongodb.user_exists gintama '' '' 10.10.41.17 28018 taiwan_game1gintama-qa-server: False
模块
账号
检查
字符
字符串
处理
成功
函数
变量
情况
数据
数据库
方法
日志
utf-8
控制
检测
测试
源码
分析
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
上海挚品互联网科技有限公司
博彦科技互联网金融
广东猪兼强互联网科技有限公司
苏州找大状互联网科技有限公司
互联网科技作文
互联网金融科技创新
壹账通互联网科技
苏州互联网科技贷款公司
互联网科技logo设计
互联网高科技企业
宁波青枫互联网科技有限公司
互联网企业和科技型企业
智腾互联网科技有限公司
苏州铭阳互联网科技有限公司
互联网保险科技创业
互联网科技新闻
福仕德教育科技互联网
玉溪新华互联网科技怎么选
科技互联网专业务虚会材料
高科技和互联网的现代国家
西安纸贵互联网科技有限公司
科技信息互联网
互联网 科技
苏州互联网科技贷款公司
互联网科技公司招聘
华中科技有哪些互联网大佬
互联网科技与管理
恒生互联网科技指数跳水
富国互联网科技002692
杭州融税互联网科技有限公司