jenkins 节点的创建与管理的自动化

683 阅读3分钟

Jenkins的节点创建是一个比较重要的工作,专栏前面的文章里我已经将创建什么样的节点,如何创建节点做了总结。这篇文章将教会大家如何通过python代码来批量处理节点。

(前面的文章juejin.cn/post/722250…

基本环境配置需求与准备工作

插件安装

我们选择远程登录Via SSH,所以需要先安装ssh agent插件,插件全名为SSH Build Agents plugin

这次是在一个windows版本的jenkins进行操作,使用的时候直接安装msi,依赖java11或者17,需要提前安装。安装完后是个服务,并且默认是启动的。

如果在安装插件过程中出现ssl连接问题,可以尝试将/manage/pluginManager/advanced下的Update Site值https改成http,还不行的话在Jenkins服务属性里将其停止,并增加启动参数-Dhudson.model.DownloadService.noSignatureCheck=true进行启动。要是一直不行,那就只能下载文件手动安装了。

 

image.png

 

凭证配置

增加一个SSH Username with private key的凭证,将一个私钥放进去,用户名就是后面要用的Jenkins登录用户名。

机器认证配置

在对应的机器相关用户下的.ssh文件夹里authorized_keys中,将这个私钥对应的公钥放进去。

建立第一个结点

进入/computer/new,输入名称后照此法填写,在登录方法里一定要选择via SSH

  image.png

如果上面的步骤都是正确的话,创建成功的时候机器已经链接上了。

image.png

 

生产api token

进入到自己的用户界面进行生成,保存到本地备用,用于代码连接Jenkins。

image.png

使用python代码操作节点

连接Jenkins

这里使用jenkinsapi库进行操作

from jenkinsapi.jenkins import Jenkins

jks = Jenkins('http://127.0.0.1:8080/', username='admin', password='11597987c28c751f1750b4b4b0d4694551', use_crumb=True)

获取已定义的节点

批量加载节点需要有个模板,这个是前面我们创建的节点,也就是定义好的模板。

node = jks.get_node('test')

解析配置

这里通过xml库来解析xml格式的配置字符串,打印配置可以看到一个结构化的文档。

from xml.dom.minidom import parseString

node_config = node.get_config()

print(node_config)

通过parseString转换后,字符串变成了一个结构化的对象,对其每个节点的操作都会应用于整个对象。

dt = parseString(node_config)

collection = dt.documentElement

 

名称节点是必须要修改的,一个Jenkins不能有两个同名的节点,在已经解析的对象里取得这个节点信息是通过getElementsByTagName方法得到的列表第一个。其第一子结点的数据就是这个名称内容。同理远程目录、描述、主机ip、端口信息和其他参数都可以通过这个方式进行修改。

 

name_node = collection.getElementsByTagName("name")[0]

print(name_node.firstChild.data)

name_node.firstChild.data = 'test_12'

    image.png

 

创建一个新的节点,这里节点的名称不要和已有的冲突。这里创建的是一个JNLP类型的节点,这是这个库里可以实现的默认功能,不是我们的ssh类型的节点,配置会被后续修改,所以这里只需要填一个名称。

node_new = jks.create_node('test_1')

加载前一个节点修改后的配置

node_new.upload_config(dt.toxml())

这样一个新的节点就创建完成了,加入循环后可以批量创建节点了。

节点的启动

尝试去连接,不是所有的节点配置完都会自己连接的,所以需要这一个步骤。 node_new.poll()

删除节点

删除节点直接通过jks实例进行操作。

比如我们要删除node2和node3

转存失败,建议直接上传图片文件 

只需要执行:

image.png

 

注意事项

加载配置的功能可能会受到Jenkins版本的影响变得不一样,需要对不同版本进行尝试观察结果。