ssh - 如何自动创建 Jenkins SSH 凭据/将其分配给节点?

标签 ssh jenkins automation credentials slave

我正在编写一个自动创建 Jenkins 机器脚本,我遇到了 SSH 凭据问题,即:

在 Jenkins 中有一个名为 credentials.xml 的文件(在 /var/lib/jenkins 中),它存储了节点的凭证。我的看起来像这样:

<?xml version='1.0' encoding='UTF-8'?>
<com.cloudbees.plugins.credentials.SystemCredentialsProvider plugin="credentials@1.18">
  <domainCredentialsMap class="hudson.util.CopyOnWriteMap$Hash">
    <entry>
      <com.cloudbees.plugins.credentials.domains.Domain>
        <specifications/>
      </com.cloudbees.plugins.credentials.domains.Domain>
      <java.util.concurrent.CopyOnWriteArrayList>
        <com.cloudbees.plugins.credentials.impl.UsernamePasswordCredentialsImpl>
          <scope>GLOBAL</scope>
          <id>8743cc14-bc2c-44a6-b6bb-c121bef4ae2d</id>
          <description>root_with_secret</description>
          <username>root</username>
          <password>2Xd4i7+8tjVXg2RHP6ggl/ZtWJp177ajXNajJxsj80o=</password>
        </com.cloudbees.plugins.credentials.impl.UsernamePasswordCredentialsImpl>
      </java.util.concurrent.CopyOnWriteArrayList>
    </entry>
  </domainCredentialsMap>

还有节点(从属)配置文件(存储在 /var/lib/jenkins/nodes/HOSTNAME/config.xml 中,每个从属)看起来(s )像:

<?xml version='1.0' encoding='UTF-8'?>
<slave>
  <name>HOSTNAME_OF_MY_SECRET_MACHINE</name>
  <description>HOSTNAME_OF_MY_SECRET_MACHINE</description>
  <remoteFS>/root</remoteFS>
  <numExecutors>1</numExecutors>
  <mode>NORMAL</mode>
  <retentionStrategy class="hudson.slaves.RetentionStrategy$Always"/>
  <launcher class="hudson.plugins.sshslaves.SSHLauncher" plugin="ssh-slaves@1.9">
    <host>10.0.10.1</host>
    <port>22</port>
    <credentialsId>8743cc14-bc2c-44a6-b6bb-c121bef4ae2d</credentialsId>
    <maxNumRetries>0</maxNumRetries>
    <retryWaitTime>0</retryWaitTime>
  </launcher>
  <label></label>
  <nodeProperties/>
  <userId>anonymous</userId>
</slave>

问题是,在我创建 jenkins 机器后,为每个从站复制 credentials.xmlconfig.xml,然后凭据将不起作用。我明白了

[07/26/15 16:00:39] [SSH] Opening SSH connection to 10.0.10.1:22.
ERROR: Failed to authenticate as root. Wrong password. (credentialId:8743cc14-bc2c-44a6-b6bb-c121bef4ae2d/method:password)
[07/26/15 16:00:41] [SSH] Authentication failed.
hudson.AbortException: Authentication failed.
    at hudson.plugins.sshslaves.SSHLauncher.openConnection(SSHLauncher.java:1178)
    at hudson.plugins.sshslaves.SSHLauncher$2.call(SSHLauncher.java:701)
    at hudson.plugins.sshslaves.SSHLauncher$2.call(SSHLauncher.java:696)
    at java.util.concurrent.FutureTask.run(FutureTask.java:262)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
    at java.lang.Thread.run(Thread.java:745)
[07/26/15 16:00:41] Launch failed - cleaning up connection
[07/26/15 16:00:41] [SSH] Connection closed.

要解决此问题,我可以转到 Jenkins -> Credentials -> 然后使用我无论如何都会使用的相同密码更新凭据,它会起作用。

所以问题是 Jenkins 是否在每次安装时使用某种加盐/散列,以便 credentials.xml 如果复制到新机器将无法工作?

最佳答案

好的,我已经设法通过(我相信)一种变通方法解决了这个问题,即:

要在 credentials.xml 中以纯文本形式存储密码,请在安装并启动服务后将其复制到 Jenkins 机器上。然后 Jenkins 会用它的新 secret (或者它为此目的使用的任何东西)加密它并且它会起作用:)

编辑

第二个选项是安装 Jenkins,启动它,然后复制带有加密密码的 credentials.xml 以及 secrets 目录和 secret.xml 来自以前的安装。这将复制加密主 key 和使用该主 key 创建的加密凭据。

关于ssh - 如何自动创建 Jenkins SSH 凭据/将其分配给节点?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31637279/

相关文章:

java - Jenkins 构建不同的环境

git - 将 Jenkins 与私有(private) BitBucket Git 存储库一起使用

bash - vim 如何插入文本、保存和退出 bash

java - 从电子商务网站中提取 Web 元素?

Powershell 网页自动化适用于 Internet,而非 Intranet

ssh - 如何修复 channel 0 上的请求失败

java - 如果我从多个线程使用 JSch,我应该如何使用它

ssh - 如何通过 SSH 使用 Sublime

powershell - 直接在jenkins管道中执行powershell命令

mercurial - 如何为单个 hg 存储库设置多个 ssh 身份?