巨聚数据库自省
项目描述
提供自省工具以了解系统状态,包括通常不透明的关系数据。
这旨在作为高级用户诊断或检查环境状态的取证工具。
*使用风险自负。这可以在任何 juju 版本之间中断*
这对于任何给定 juju 版本的底层数据库结构都是非常具体的,这是一个实现细节,如有更改,恕不另行通知。
也就是说,这里的实现适用于所有现有的 juju 核心版本。然而,过去的成功并不能保证未来的兼容性。
* 不要写入数据库 *
不要尝试写入任何这些结构,否则会发生坏事,并且您可以保留所有损坏的东西。如果您需要修改某些内容,请使用 juju api。Juju 使用 mongodb 客户端事务库,它以原子方式执行多文档 mods,并且依赖于使用相同 txn 库的所有编写器。更多细节在这里为好奇
http://blog.labix.org/2012/08/22/multi-doc-transactions-for-mongodb
安装
可通过 pypi 获得,依赖项是 pymongo 和 pyyaml:
$ pip install juju-dbinspect
根据您的提供者和 juju 版本,您可能需要打开对状态服务器上端口 37017 的访问(如果没有,则为机器 0)。
命令行简介
CLI 用法通过内置帮助记录:
$ juju db --help
juju db --help
usage: juju-db [-h] [-e ENVIRONMENT] [-v] targets [targets ...]
Juju database introspection
Drop into an interactive python shell.
$ juju db shell
Get the last n transactions (default 100) that have modified the
environment.
$ juju db history [n]
Get the names of all the services in the system.
$ juju db services
Get the names of all the units in the system.
$ juju db units
Get the details on machine 0.
$ juju db 0
Get the details on the unit mysql/0.
$ juju db mysql/0
Get the details on the mysql service::
$ juju db mysql
Get the relation settings for the mysql/0 unit in the wordpress relation::
$ juju db mysql/0 wordpress
positional arguments:
targets
optional arguments:
-h, --help show this help message and exit
-e ENVIRONMENT, --environment ENVIRONMENT
Juju environment to operate on
-v, --verbose Verbose output
DB 交互式外壳
具有相同核心功能的还有一个可以访问 db 的 python 交互式 shell。shell 可以用以下命令启动:
kapil@realms-slice:~$ juju db shell -e syracuse Juju DB Shell >>>
基础实体迭代命令:
>>> units() [u'message/0', u'db/0', u'identity/0', u'meter/0'] >>> machines() [u'0', u'230', u'232', u'233', u'231'] >>> services() [u'db', u'identity', u'message', u'meter'] >>> pprint(relations()) [u'db:cluster', u'message:cluster', u'identity:cluster', u'meter:identity-service identity:identity-service', u'identity:shared-db db:shared-db', u'meter:amqp message:amqp']
让我们检查机器 0 的约束:
>> machine('0').constraints
{u'cpupower': None, u'container': None, u'cpucores': None,
u'mem': None, u'arch': None, u'rootdisk': None}
机器 230 上有哪些单元:
>> machine('230').units
米/0 单位发生了什么:
>>> pprint(unit('meter/0'))
{u'_id': u'meter/0',
u'charmurl': u'local:precise/ceilometer-52',
u'life': 0,
u'machineid': u'233',
u'ports': [{u'number': 8777, u'protocol': u'tcp'}],
u'principal': u'',
u'privateaddress': u'10.0.3.103',
u'publicaddress': u'10.0.3.103',
u'resolved': u'',
u'series': u'precise',
u'service': u'meter',
u'subordinates': [],
u'tools': {u'sha256': u'',
u'size': 0L,
u'url': u'',
u'version': u'1.17.3.1-precise-amd64'}}
>>> unit('meter/0').status
{u'status': u'started', u'statusinfo': u'', u'statusdata': {}}
让我们检查身份与计量服务的关系,并查看其单位的关系数据:
>>> unit('meter/0').relation_data('identity')
{u'_id': u'r#190#requirer#meter/0',
u'admin_url': u'http://10.0.3.103:8777',
u'internal_url': u'http://10.0.3.103:8777',
u'private-address': u'10.0.3.103',
u'public_url': u'http://10.0.3.103:8777',
u'region': u'RegionOne',
u'requested_roles': u'ResellerAdmin',
u'service': u'ceilometer'}
>>> unit('identity/0').relation_data('meter')
{u'_id': u'r#190#provider#identity/0',
u'admin_token': u'witieweithoinaiwuojeFiepuneiseye',
u'auth_host': u'10.0.3.27',
u'auth_port': u'35357',
u'auth_protocol': u'https',
u'ca_cert': u'omitted for brevity',
u'https_keystone': u'True',
u'private-address': u'10.0.3.27',
u'service_host': u'10.0.3.27',
u'service_password': u'eingahVeehivaiHahnohngahTooYizei',
u'service_port': u'5000',
u'service_protocol': u'https',
u'service_tenant': u'services',
u'service_username': u'ceilometer',
u'ssl_cert': u'omitted for brevity',
u'ssl_key': u'omitted for brevity'}
>>>
我们还可以通过事务日志的自省来检查环境的历史:
>>> history()
2014/03/06-19:31:39 applied
units:message/0 update {u'$set': {u'privateaddress': u'10.0.3.215'}}
2014/03/06-19:31:39 applied
units:message/0 update {u'$set': {u'publicaddress': u'10.0.3.215'}}
2014/03/06-19:31:40 applied
settingsrefs:s#message#local:precise/rabbitmq-server-146 update {u'$inc': {u'refcount': 1}}
units:message/0 update {u'$set': {u'charmurl': u'local:precise/rabbitmq-server-146'}}
2014/03/06-19:33:07 applied
units:message/0 update {u'$addToSet': {u'ports': {u'protocol': u'tcp', u'number': 5672}}}
2014/03/06-19:33:08 applied
units:message/0 cond {u'life': {u'$ne': 2}}
statuses:u#message/0 update {u'$set': {u'status': u'installed', u'statusdata': {}, u'statusinfo': u''}}
2014/03/06-19:33:08 applied
units:message/0 update {u'$pull': {u'ports': {u'protocol': u'tcp', u'number': 55672}}}
2014/03/06-19:33:09 applied
units:message/0 update {u'$addToSet': {u'ports': {u'protocol': u'tcp', u'number': 5671}}}
2014/03/06-19:33:13 applied
units:message/0 cond {u'life': {u'$ne': 2}}
statuses:u#message/0 update {u'$set': {u'status': u'started', u'statusdata': {}, u'statusinfo': u''}}
2014/03/06-19:33:13 applied
units:message/0 cond {u'life': 0}
relations:message:cluster update {u'$inc': {u'unitcount': 1}}
settings:r#198#peer#message/0 create {u'private-address': u'10.0.3.215'}
relationscopes:r#198#peer#message/0 create {u'_id': u'r#198#peer#message/0'}
2014/03/06-19:33:43 applied
units:identity/0 cond {u'life': 0}
relations:identity:cluster update {u'$inc': {u'unitcount': 1}}
settings:r#197#peer#identity/0 create {u'private-address': u'10.0.3.80'}
relationscopes:r#197#peer#identity/0 create {u'_id': u'r#197#peer#identity/0'}
2014/03/06-19:33:52 applied
units:identity/0 cond {u'life': 0}
relations:identity:shared-db db:shared-db update {u'$inc': {u'unitcount': 1}}
settings:r#200#requirer#identity/0 create {u'private-address': u'10.0.3.80'}
relationscopes:r#200#requirer#identity/0 create {u'_id': u'r#200#requirer#identity/0'}
2014/03/06-19:33:52 applied
units:db/0 cond {u'life': 0}
relations:identity:shared-db db:shared-db update {u'$inc': {u'unitcount': 1}}
settings:r#200#provider#db/0 create {u'private-address': u'10.0.3.225'}
relationscopes:r#200#provider#db/0 create {u'_id': u'r#200#provider#db/0'}
2014/03/06-19:33:52 applied
units:message/0 cond {u'life': 0}
relations:meter:amqp message:amqp update {u'$inc': {u'unitcount': 1}}
settings:r#199#provider#message/0 create {u'private-address': u'10.0.3.215'}
relationscopes:r#199#provider#message/0 create {u'_id': u'r#199#provider#message/0'}
2014/03/06-19:33:53 applied
settings:r#199#provider#message/0 update {u'$set': {u'hostname':
u'10.0.3.215', u'ssl_port': u'5671', u'ssl_ca':'value_omitted'}
u'$unset': {}}
可用的辅助命令
单位
单元
服务
服务
机器
机器
关系
关系
魅力