使用Foreman API更新主机的Python脚本
我想写一个Python脚本,给定两个参数,主机(host)和主机组(hostgroup),通过Foreman API来更改主机的主机组(http://theforeman.org/api/apidoc/v1/hosts/update.html)。
要做到这一点的cURL命令如下(这个是有效的!):
curl -s -H "Accept:application/json" -X PUT --insecure --negotiate -u : -d "host[hostgroup_id]=ZZZZZ" https://foreman.mydomain.com:443/api/hosts/XXXX
但是现在,我想用Python脚本来实现这个功能。
我在使用Python的request库时没有问题,直到我到达需要传递参数的部分。
我在参考这个信息 http://docs.python-requests.org/en/latest/user/quickstart/#passing-parameters-in-urls,但显然这样做不行,因为Foreman的API并不期望以这种方式接收参数。
所以,有没有什么办法可以让我以Foreman能理解的方式传递参数呢?
提前感谢任何帮助!
2 个回答
首先,你需要确认你是在使用Foreman API的第一个版本(v1)还是第二个版本(v2)。如果有可能的话,你也可以考虑使用Hammer这个工具。
如果你想通过API在Foreman上创建一个新主机,可以使用CURL这个命令行工具。下面是一个示例语法(使用RHOS):
curl -i -X POST -H "Content-Type: application/json" -d "{\"host\": {\"operatingsystem_id\": \"2\", \"ip\": \"10.0.0.20\", \"mac\": \"52:53:00:1e:69:69\", \"domain_id\": \"1\", \"puppet_proxy_id\": \"1\", \"name\": \"testhost1\", \"medium_id\": \"7\", \"architecture_id\": \"1\", \"ptable_id\": \"12\"}}" --user youradminuser:youradminpassword http://yourhostname.openhealthmodel.com/api/hosts
你可以查看Foreman的API v2文档。
特别是关于GET和POST请求在主机(HOST)和主机组(HOSTGROUP)之间的区别。你可以像这样查看你现有的主机:
curl -X GET -H "Content-Type:application/json" -H "Accept: application/json" --user youradminuser:youradminpassword http://yourhostname.openhealthmodel.com/api/hosts
抱歉,我找到了实现这个功能的方法,但我忘了发出来。下面的代码可以解决这个问题:
def updateHost(host_id, new_hostgroup_id):
url = "https://foreman.mydomain.com:443/api/hosts/" + host_id
payload = {'host[hostgroup_id]': new_hostgroup_id}
headers = {'Accept': 'application/json'}
r = requests.put(url, data=payload, headers=headers, verify=False, uth=HTTPKerberosAuth())
if (r.status_code != requests.codes.ok):
raise BadStatusCodeRequest("HTTP Request status code error: " + r.raise_for_status())