我正在尝试生成每个服务器安装的所有软件包的列表,而不必逐个使用rpm
。我认为 Satellite 应该能够以一种合适的(希望易于解析的)格式提供此信息。
答案1
这是最后一个脚本,它扩展了约翰答案提供完整的解决方案。
#!/usr/bin/python
import xmlrpclib
SAT_URL = "https://<SATELLITE_IP>/rpc/api"
SAT_USER = "<USERNAME>"
SAT_PASS = "<PASSWORD>"
client = xmlrpclib.Server(SAT_URL, verbose=0)
key = client.auth.login(SAT_USER, SAT_PASS)
syslist = client.system.listSystems(key)
systems = {}
for system in syslist:
systems[system['name']] = client.system.listPackages(key, system['id'])
# Print out list in a Markdown-like format.
for system in sorted(systems.keys()):
print '%s' % system
print '=' * len(system)
for package in systems[system]:
print '- %s %s' % (package['name'], package['version'])
print
答案2
简短的回答:是的。
更长的答案:您需要查看 Satellite API。Satellite 提供的文档对于非常基本的查询来说很不错,但您很快就会遇到(在我看来)文档不太完善的查询。从高层次上讲,您最终要做的是向 Satellite 查询所有已注册系统的列表,然后使用该列表对每个系统上安装的所有软件包发出查询。最终,这仅在每个系统上次更新 Satellite 上的软件包配置文件时有效,但它比通过 RPM 查询搜索每个单独的系统更为重要。
下面是我使用的代码(当然是经过清理的),列出注册到我的 Satellite 的系统:
/usr/bin/python 的 #! 导入 xmlrpclib SAT_URL = "https://<卫星主机名>/rpc/api" SAT_USER = "<卫星用户名>" SAT_PASS = "<上述登录 ID 的密码>" 客户端 = xmlrpclib.服务器(SAT_URL,详细=0) 密钥 = 客户端.auth.登录(SAT_USER,SAT_PASS) syslist = 客户端.系统.listSystems(键)
该syslist
变量是系统对象的简单 Python 列表 - 我尚不需要对其进行进一步解压缩:
对于 syslist 中的 sys: 打印“%s已在Satellite上注册”%(sys ['name'],)