使用Foreman API更新主机的Python脚本

5 投票
2 回答
6699 浏览
提问于 2025-04-18 13:26

我想写一个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 个回答

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

3

抱歉,我找到了实现这个功能的方法,但我忘了发出来。下面的代码可以解决这个问题:

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())

撰写回答