Jenkins运行节点上实现集群操作

有集群192.168.150.51和192.168.142.122,每个集群中都运行着一个数据库pod;
jenkins从服务节点node1工作区中有一个sql文件;
现在想在jenkins上新建一个工程实现如下设计:
1、将sql文件复制到每个集群指定目录下
2、每个集群(在复制了sql文件的节点)都执行将sql文件复制到数据库pod里,然后让pod执行连接数据库实例,执行sql文件。

要实现在 Jenkins 中将 SQL 文件分别复制到两个集群并将其加载到数据库 pod,可以使用如下步骤:
1、安装必要插件
首先,需要安装 Jenkins 中用于文件传输的插件,例如 SSH 插件和 Pipeline SSH 插件。

2、创建 Pipeline 项目
创建一个新的 Pipeline 项目,并在项目中创建 Jenkinsfile 以编写部署脚本。

3、编写 Jenkinsfile
在 Jenkinsfile 中,按照以下步骤编写将 SQL 文件复制到集群中并将其加载到数据库 pod 的脚本:
a. 在 Jenkinsfile 中定义需要使用的服务器信息和登录凭据。例: 

environment {
    DATABASE_USERNAME = credentials('database_username')
    DATABASE_PASSWORD = credentials('database_password')
    NODE1_IP = '192.168.150.51'
    NODE2_IP = '192.168.142.122'
}

密码 database_username 和 database_password 是在 Jenkins 的凭据存储中定义的。


b. 在 Jenkinsfile 中定义复制 SQL 文件的目的地路径。例:

def REMOTE_PATH_1 = "/path/to/remote/folder/on/node1"
def REMOTE_PATH_2 = "/path/to/remote/folder/on/node2"

c. 写一个复制 SQL 文件的脚本(例如,使用 SSH 插件和 scp 命令)。
在 Jenkinsfile 中,使用下面的脚本将 SQL 文件复制到两个集群的指定路径下:

// copy SQL file to node1
sshCommand remote: [
        allowAnyHosts: true,
        hostname: env.NODE1_IP,
        port: 22,
        credentialsId: 'ssh-login-creds',
        user: 'username'
 ], command: "sudo mkdir -p ${REMOTE_PATH_1} && sudo chown -R username:username ${REMOTE_PATH_1}"
 
scp remote: [
        allowAnyHosts: true,
        hostname: env.NODE1_IP,
        port: 22,
        credentialsId: 'ssh-login-creds',
        user: 'username'
], from: "/path/to/local/sql/file.sql",
   into: "${REMOTE_PATH_1}/file.sql"
   
// copy SQL file to node2
sshCommand remote: [
        allowAnyHosts: true,
        hostname: env.NODE2_IP,
        port: 22,
        credentialsId: 'ssh-login-creds',
        user: 'username'
 ], command: "sudo mkdir -p ${REMOTE_PATH_2} && sudo chown -R username:username ${REMOTE_PATH_2}"
 
scp remote: [
        allowAnyHosts: true,
        hostname: env.NODE2_IP,
        port: 22,
        credentialsId: 'ssh-login-creds',
        user: 'username'
], from: "/path/to/local/sql/file.sql",
   into: "${REMOTE_PATH_2}/file.sql"

注意:在上面的示例脚本中,需要更换以下参数:
ssh-login-creds : SSH 登录的凭据 ID
username : SSH 连接第一个和第二个节点的用户名
/path/to/local/sql/file.sql : 要复制到两个文件夹中的 SQL 文件的本地路径

d. 编写部署数据库的脚本
在 Jenkinsfile 中,用以下脚本部署 SQL 文件并连接数据库实例:

// deploy to node1
sshCommand remote: [
        allowAnyHosts: true,
        hostname: env.NODE1_IP,
        port: 22,
        credentialsId: 'ssh-login-creds',
        user: 'username'
], command: "kubectl cp ${REMOTE_PATH_1}/file.sql postgresql-0:/tmp/file.sql -c postgresql && kubectl -n db exec -it postgresql-0 -- psql -U${env.DATABASE_USERNAME} -d${env.DATABASE_PASSWORD} -f /tmp/file.sql"

// deploy to node2
sshCommand remote: [
        allowAnyHosts: true,
        hostname: env.NODE2_IP,
        port: 22,
        credentialsId: 'ssh-login-creds',
        user: 'username'
], command: "kubectl cp ${REMOTE_PATH_2}/file.sql postgresql-0:/tmp/file.sql -c postgresql && kubectl -n db exec -it postgresql-0 -- psql -U${env.DATABASE_USERNAME} -d${env.DATABASE_PASSWORD} -f /tmp/file.sql"

注意:在上面的示例脚本中,需要更换以下参数:
ssh-login-creds : SSH 登录的凭据 ID
username : SSH 连接第一个和第二个节点的用户名
postgresql : 在数据库 pod 内容器中使用的 container name, 可能需要根据实际情况进行调整
file.sql : SQL 文件名
/tmp/file.sql : SQL 文件在容器内的路径
${env.DATABASE_USERNAME} 和 ${env.DATABASE_PASSWORD} : 用于连接数据库的用户名/密码,可替换为实际的值

4、执行 Pipeline 项目
在 Pipeline 项目中,"Build Now" 执行命令以运行部署脚本和将 SQL 文件复制到集群的相应位置。


 

 优化:如果集群不是固定的两个,以后可能还会增加或者修改,想要让其更具有可变动性,使每次的改动最小,可以使用 Jenkins 中的参数化构建功能,以下是如何使用参数化构建:

1、在 Jenkinsfile 中添加变量
在代码的开头添加一些变量定义,包括可以存储可变配置的变量。例如: 

def nodes = [
    ['ip': '192.168.150.51', 'remotePath': '/path/on/node1'],
    ['ip': '192.168.142.122', 'remotePath': '/path/on/node2']
]

def rootNode = nodes[0]
def sqlFilePath = "/path/to/local/sql/file.sql"
def databaseCredentials = credentials('database_credentials')

上述代码定义了以下变量:
nodes : 集群 IP 和远程路径信息的列表
rootNode : 用于从列表中获取第一个节点
sqlFilePath : SQL 文件的路径
databaseCredentials : 数据库的凭据信息,以便在部署 SQL 文件时使用

2、添加构建参数
在 Jenkins 中,打开 Pipeline 项目的配置界面并单击 "This project is parameterized" 复选框,选择您需要的选项。
对于此示例,您可以从列表中选择要部署的集群,因此可以添加一个下拉列表形式的参数,如下:

Param Type : Choice Parameter
Name : NODE_IP
Choices : 192.168.150.51\n192.168.142.122
Default value : 192.168.150.51

添加两个参数以让用户选择在哪个节点上部署SQL文件:
Param Type : Choice Parameter
Name : REMOTE_PATH
Choices : path/on/node1\npath/on/node2
Default value : path/on/node1
Param Type : File Parameter
Name : SQL_FILE

3、使用 Pipeline 脚本中获取用户参数
在 Pipeline 脚本中添加以下代码段,以便在用户选择后获取参数: 

environment {
    NODE_IP = "${params.NODE_IP}"
    REMOTE_PATH = "${params.REMOTE_PATH}"
}

def node = nodes.find { it['ip'] == NODE_IP }
if (!node) {
    error "Unknown node IP ${NODE_IP}"
}

def remotePath = node['remotePath'] + '/' + REMOTE_PATH
if (!sshScript.remoteDirectoryExists(node['ip'], remotePath)) {
    sshScript.remoteCommand(node['ip'], "mkdir -p ${remotePath}")
}

该代码段可以在 Pipeline 执行时获取用户选择的参数,并使用这些参数来创建 SSH 会话并将 SQL 文件上传到远程服务器上的指定目录中。

4、更改其他代码以使用参数
在上述示例代码中,已经可以使用参数 NODEIP 和 REMOTEPATH ,取代之前硬编码的 IP 地址和远程路径。
SQL 文件的路径现在将从构建参数中的 sqlFilePath_id 取出,而不是原来硬编码的文件路径。
下面的示例展示了如何使用从文件参数中获取sql文件:

sshScript.scpCopy(fileServers[0], "./${params.SQL_FILE}", "${remotePath}/")

5、构建
现在,可以在构建时选择要部署 SQL 文件的节点和路径,以及以参数的方式定义集群 IP 和远程路径信息。这样,就不必每次更改集群配置时都更改 Jenkinsfile 了,而只需改动构建参数就可以了。 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值