【问题标题】:Execute shell sctipt in remote machine using jenkins使用 jenkins 在远程机器上执行 shell 脚本
【发布时间】:2018-04-18 06:48:01
【问题描述】:

我的要求是这样的: 詹金斯安装在一台服务器上(比如服务器 A)。 我在此服务器中有 3 个脚本,用于将战争部署到不同的服务器中,例如 B 和 C

有一个主脚本说 JenkinsMainScript.sh 。在此脚本中,我已根据执行 shell 时传递的参数将部署脚本(例如 serverB.sh/serverC.sh)从服务器 A 复制到相应的服务器 serverB 或 serverC,例如:

/root/Pictures/JenkinsTesting/JenkinsBuildMain.sh B

jenkins 的“Build”部分下的 jenkins 的“Execute shell”中 其中 B 是要部署的服务器名称。 即如果我在上述语句中再次将 C 作为参数传递,那么主脚本会将 serverC.sh 从服务器 A 复制到服务器 C 并将战争部署到该服务器 注意:-所有部署步骤都写在服务器 C 的 serverC.sh 和服务器 B 的 serverB.sh 中。

同样,我在 jenkins 中的部署分为两个步骤,Job1 和 Job2。

1.通过将源作为使用SSH访问的git存储库来创建war文件(例如服务器D) 2.Job1执行成功后会触发Job2。

在 Job2 中,我正在执行 Build 部分下的 JenkinsBuildMain.sh 文件。

问题是如果我在 jenkins 的 .ssh 目录中添加 id_rsa 和 id_rsa.pub 文件以访问 git 服务器(服务器 D),同时我无法通过 SSH 连接访问服务器 B 等其他服务器进行部署。 同样,如果我在 .ssh 中为部署服务器(服务器 B)添加 id_rsa 和 id_rsa.pub 文件,则 Git 服务器无法同时访问。 这意味着一次只能使用 SSH 连接访问一台服务器。

有没有办法使用相同的密钥或不同的密钥访问两个服务器?

或者我们可以为 ssh 连接添加多个密钥,以便它可以访问两个服务器,服务器 D 用于 git clone 和服务器 B 用于将脚本文件从 jenkins 服务器复制到 服务器 B

当我这样做时,我收到以下消息: "主机密钥验证失败。 失去连接”

当前我可以一次连接一台服务器。如果它连接到 Git 服务器,则 shell 脚本文件无法复制,如上述错误,如果我能够设置复制文件,则 git 服务器无法访问说

返回状态码 128。 权限被拒绝(PublicKey、gssapi-keyex、gssapi-mic、密码)....

有没有办法使用 Jenkins 为不同的服务器添加多个 ssh 连接密钥?

下面是我的脚本代码,用于将部署脚本复制到远程服务器。

JenkinsMainScript.sh:

if [ $serverId = 'B' ]
    then        
        scp $scriptSourcePath/serverB.sh $serverBPathToCopyTheFile/
        ssh -l $serverBUserName $IpAddr $serverBPathToExecuteTheFile/serverB.sh

else
        echo " No Matching condition found..."
fi

这是 Jenkins 中为 job2 配置的屏幕截图:

Jenkins Config for job2

谁能帮我解决这个问题。 提前致谢

【问题讨论】:

    标签: git shell jenkins


    【解决方案1】:

    您可以将此private key 作为参数传递,而不是直接使用默认的~/.ssh/id_rsa 私钥文件执行scp $scriptSourcePath/serverB.sh $serverBPathToCopyTheFile/

    scpssh 都接受私钥文件作为参数。为此目的使用参数-i <file path>。您可以通过man ssh 了解所有命令行选项。希望这对你有意义。

    ssh -i <private key file path> ...
    scp -i <private key file path> ...
    

    man ssh 显示选项i 的以下结果。

    -i identity_file
             Selects a file from which the identity (private key) for public key authenti-
             cation is read.  The default is ~/.ssh/id_dsa, ~/.ssh/id_ecdsa,
             ~/.ssh/id_ed25519 and ~/.ssh/id_rsa.  Identity files may also be specified on
             a per-host basis in the configuration file.  It is possible to have multiple
             -i options (and multiple identities specified in configuration files).  If no
             certificates have been explicitly specified by the CertificateFile directive,
             ssh will also try to load certificate information from the filename obtained
             by appending -cert.pub to identity filenames.
    

    man scp 显示选项i 的以下结果。

         -i identity_file
             Selects the file from which the identity (private key) for public key authen-
             tication is read.  This option is directly passed to ssh(1).
    

    【讨论】:

    • 对您有帮助吗?