通过REST API修改Jenkins节点标签:curl命令修复及Python实现咨询
原curl命令错误原因
- 身份认证格式错误:
--user参数需要用用户名:密码格式,而非用户名@密码 - 接口调用逻辑错误:Jenkins的
/configure是页面接口,不支持直接通过query参数提交标签更新,需要向/configSubmit接口提交结构化参数,且默认需要携带CSRF校验头
修复后的curl实现
首先执行命令获取CSRF校验凭证(Jenkins默认开启CSRF防护,必须携带):
curl -k --user 你的用户名:你的密码 "https://jenkins-automation.itero.net/crumbIssuer/api/json"
返回结果示例:
{"_class":"hudson.security.csrf.DefaultCrumbIssuer","crumb":"xxxxxxxxxxxx","crumbRequestField":"Jenkins-Crumb"}
取返回结果中的crumb和crumbRequestField值,执行标签更新命令:
注意:提交的
json参数里的labelString是全量覆盖节点标签,如需新增/删除,要先获取当前节点的现有标签,修改后再提交
curl -k -X POST \ --user 你的用户名:你的密码 \ -H "Jenkins-Crumb: 上面拿到的crumb值" \ -H "Content-Type: application/x-www-form-urlencoded" \ -d "json={\"labelString\": \"现有标签 新标签lb\"}" \ "https://jenkins-automation.itero.net/computer/JL_private/configSubmit"
Python脚本实现方案
方案1:用requests原生调用接口(无需额外依赖功能库)
import requests from requests.auth import HTTPBasicAuth JENKINS_URL = "https://jenkins-automation.itero.net" USERNAME = "你的用户名" PASSWORD = "你的密码" NODE_NAME = "JL_private" # 要新增的标签 ADD_LABEL = "lb" # 要删除的标签示例:DEL_LABEL = "old_label" auth = HTTPBasicAuth(USERNAME, PASSWORD) # 1. 获取CSRF crumb crumb_resp = requests.get(f"{JENKINS_URL}/crumbIssuer/api/json", auth=auth, verify=False) crumb_info = crumb_resp.json() headers = { crumb_info["crumbRequestField"]: crumb_info["crumb"], "Content-Type": "application/x-www-form-urlencoded" } # 2. 获取节点当前标签 node_resp = requests.get(f"{JENKINS_URL}/computer/{NODE_NAME}/api/json", auth=auth, verify=False) current_labels = node_resp.json()["assignedLabels"] current_label_str = " ".join([lab["name"] for lab in current_labels if lab["name"] != NODE_NAME]) # 3. 生成新的标签字符串(新增逻辑,删除的话把对应标签从current_label_str移除即可) new_label_str = f"{current_label_str} {ADD_LABEL}".strip() # 4. 提交更新 update_resp = requests.post( f"{JENKINS_URL}/computer/{NODE_NAME}/configSubmit", auth=auth, headers=headers, data={"json": f'{{"labelString": "{new_label_str}"}}'}, verify=False ) update_resp.raise_for_status() print("标签更新成功")
方案2:用python-jenkins库实现(更简便)
先安装依赖:pip install python-jenkins
import jenkins JENKINS_URL = "https://jenkins-automation.itero.net" USERNAME = "你的用户名" PASSWORD = "你的密码" NODE_NAME = "JL_private" ADD_LABEL = "lb" # 初始化连接 server = jenkins.Jenkins(JENKINS_URL, username=USERNAME, password=PASSWORD) # 获取节点现有标签 old_label = server.get_node_info(NODE_NAME)["labelString"] new_label = f"{old_label} {ADD_LABEL}".strip() # 获取节点配置并更新标签字段 node_config = server.get_node_config(NODE_NAME) new_config = node_config.replace(f"<label>{old_label}</label>", f"<label>{new_label}</label>") # 提交配置更新 server.reconfig_node(NODE_NAME, new_config) print("标签更新成功")
注意:两种方案都是全量覆盖标签,操作前务必确认修改后的标签内容正确,避免误删原有业务标签
内容的提问来源于stack exchange,提问作者Julya Levin
相关产品推荐
相关产品推荐

