用于命令行 MaaS 询问的实用程序
项目描述
用于 1.8 maas 区域安装的 maas 实用程序
概括
为 maas 提供 misc 命令行的东西。我需要的第一个是在给定机器名称的情况下确定 system_id 的能力。
用法
usage: maasutil.py [-h] [-u URL] [-k KEY] [-f FILENAME] [-t TEMPLATE]
[-c COMMAND] [-v] [-l {DEBUG,INFO,WARNING,ERROR,CRITICAL}]
[-s]
MaaS utility cli
optional arguments:
-h, --help show this help message and exit
-u URL, --url URL This is the maas url to connect to, default :
http://localhost/MAAS/api/1.0
-k KEY, --key KEY This is the maas admin api key, default :null
-f FILENAME, --file FILENAME
This is the jinja2 template file :
-t TEMPLATE, --template TEMPLATE
This is the jinja2 template text :
-c COMMAND, --command COMMAND
This is the maas uri, e.g. /nodes/?op=list :
-v, --version this switch will just return the version and exit,
current version is : 0.0.19
-l {DEBUG,INFO,WARNING,ERROR,CRITICAL}, --loglevel {DEBUG,INFO,WARNING,ERROR,CRITICAL}
Log level (DEBUG,INFO,WARNING,ERROR,CRITICAL) default
is: INFO
-s, --save save select command line arguments (default is never)
in "/home/gfausak/.maasutil.conf" file
-t or -f MUST be specified, not both.
论据
–url,连接到 MaaS 服务器的 url。如果它与 MaaS 服务器在同一台机器上运行,那么默认的“ http://localhost/MAAS/api/1.0 ”就足够了。
–key,这可以在 MaaS gui 控制台上找到,下拉右侧,用户帐户,该页面包含密钥。您也可以创建新密钥。
–command,要执行的实际MaaS api。该命令将返回模板使用的 json(因此它们必须配对)。
–file,其中包含 jinja2模板的文件。或者..
--template,实际的jinja2 模板文本
--help,打印使用信息。
--version,打印版本并退出
--loglevel,用于调试,默认 INFO。
-save,将当前参数保存到主目录中的持久文件中,该文件将被读取,就好像它来自该程序的后续调用中的命令行一样。要删除它,您必须手动删除 ~/.maasutil.conf 文件。默认是不保存。顺便说一句,保存是不安全的!它可以将命令行 'KEY' 指向文件。你被警告了!
基本原理
我需要 MaaS api 返回的数据和 Ansible 之间的通用接口。例如,我希望能够用 Ansible 做几件事。* 动态库存(来自 maas) * 部署机器(来自 maas)
为了在 Ansible 中实现这些类型的游戏,我需要一种简单的方法来访问 MaaS api,最好是在命令行上,以便从 Ansible 剧本访问。我决定为模板程序编写一个通用的 REST api,而不是为我需要的每条数据编写一个脚本。REST api 必须返回 json。模板是一个jinja2模板,可以任意取json转换成任意格式。它也可以进行过滤。因此,虽然这是专门为 MaaS 编写的,但它适用于任何返回 json 的 REST 接口。
笔记
这使用了jinja2模板系统。运行的 url/命令应返回 json。您的 jinja2 模板应该将该 json 作为输入,并相应地格式化输出。模板可以在命令行中使用 -t 参数传递,或者模板可以存储在一个文件中,该文件使用 -f 引用。
安装
最简单的方法是使用 pypi。
pip install maasutil
例子
在大多数示例中,我省略了 –key 参数。该参数使命令变得混乱!要设置一次参数,请执行以下操作:
maasutil --save --key 'FbVzEwU4sKaD68cadK:W7L9xm9LgycyfrmdYD:DbSW7fhnYMj4qtMxE5tzHUnw7AtAg5NM' --url 'http://www.myspecial.com/MAAS/api/1.0'
这将设置默认的 –key 和 –url,因此后续命令将使用它们,就好像它们是在命令行中输入的一样。这在做临时工作时非常方便,您不必继续重新输入它。但是,它是不安全的。密钥被写入执行程序主目录中的一个文件,名为 .maasutil.conf。搞砸后删除此文件是个好主意。
显示主机名、systemid 和状态
maasutil --command '/nodes/?op=list' --template '{% for h in src %}{{ h.hostname }}, {{ h.system_id }}, {{ h.status }}^M{% endfor %}'
和一个示例结果:
hp-bottom.maas, node-01077d56-4cb9-11e5-ab4d-0800274e4167, 4 hp-top.maas, node-9d269970-4ff6-11e5-8444-0800274e4167, 4 hp-right.maas, node-3b57d712-4ff7-11e5-8444-0800274e4167, 6 hp-left.maas, node-3eb98f90-4ff7-11e5-8c49-0800274e4167, 4
您将需要知道该命令返回的 json。MaaS api文档将对此 有所帮助。为了完整起见,我将展示上面的命令返回的内容,因此模板会更有意义。这是一个非常基本的示例,模板可以任意复杂。
[
{
"ip_addresses": [
"10.20.30.54"
],
"cpu_count": 8,
"power_type": "amt",
"tag_names": [
"juju2"
],
"swap_size": null,
"owner": null,
"macaddress_set": [
{
"resource_uri": "/MAAS/api/1.0/nodes/node-01077d56-4cb9-11e5-ab4d-0800274e4167/macs/cc%3A3d%3A82%3A67%3Afe%3A3f/",
"mac_address": "cc:3d:82:67:fe:3f"
},
{
"resource_uri": "/MAAS/api/1.0/nodes/node-01077d56-4cb9-11e5-ab4d-0800274e4167/macs/ec%3Ab1%3Ad7%3A46%3Ad7%3Afb/",
"mac_address": "ec:b1:d7:46:d7:fb"
}
],
"zone": {
"resource_uri": "/MAAS/api/1.0/zones/default/",
"name": "default",
"description": ""
},
"hostname": "hp-bottom.maas",
"storage": 500107,
"system_id": "node-01077d56-4cb9-11e5-ab4d-0800274e4167",
"boot_type": "fastpath",
"memory": 16384,
"disable_ipv4": false,
"status": 4,
"power_state": "off",
"routers": [],
"physicalblockdevice_set": [
{
"name": "sda",
"tags": [
"rotary",
"sata",
"7200rpm"
],
"id": 20,
"id_path": "/dev/disk/by-id/wwn-0x5000cca85ec51c83",
"path": "/dev/sda",
"model": "HGST HTS725050A7",
"block_size": 4096,
"serial": "RC250ACE0B7KTM",
"size": 500107862016
}
],
"pxe_mac": {
"resource_uri": "/MAAS/api/1.0/nodes/node-01077d56-4cb9-11e5-ab4d-0800274e4167/macs/ec%3Ab1%3Ad7%3A46%3Ad7%3Afb/",
"mac_address": "ec:b1:d7:46:d7:fb"
},
"netboot": true,
"osystem": "",
"substatus": 4,
"architecture": "amd64/generic",
"distro_series": "",
"resource_uri": "/MAAS/api/1.0/nodes/node-01077d56-4cb9-11e5-ab4d-0800274e4167/"
},
...and this repeats for each one...
]