【问题标题】:Jenkins unable to create directory '/var/lib/jenkins/.ssh' when ssh into EC2当 ssh 进入 EC2 时,Jenkins 无法创建目录“/var/lib/jenkins/.ssh”
【发布时间】:2019-09-11 19:49:40
【问题描述】:

问题:在我的 Jenkins 过程中,我能够与要复制文件的 EC2 实例建立连接,但我不断收到以下错误:

Could not create directory '/var/lib/jenkins/.ssh'

Failed to add the host to the list of known hosts (/var/lib/jenkins/.ssh/known_hosts).

Host key verification failed.

背景:在我将代码推送到“主”分支后,我的 Jenkins 作业由 github webhook 触发。 Jenkins 读取 repo 的 Jenkinsfile 并创建一个 Docker 代理来构建应用程序,然后将构建的文件部署到 EC2 容器。在部署阶段,我使用 Jenkins 的 sshagent 建立连接,然后使用命令删除旧文件,然后将新文件复制到 EC2。

pipeline {
  agent {
    docker {
      image 'node:buster'
      args '-p 20001-20100:3000'
      args '-v /etc/passwd:/etc/passwd'
    }
  }
   environment {
    CI = 'true'
    HOME = '.'
    npm_config_cache = 'npm-cache'
  }
  stages {
    stage('Install') {
      ...install code... <<<<<<<[works, no issues]   
    stage('Build') {
      ...build code... <<<<<<<[works, no issues]   
    }
    stage('Deploy') {
      parallel {
        stage('Deploy frontend') {
        ...deploy frontend code to S3 bucket... <<<<<<<[works, no issues]   
        }

        stage('Deploy backend') {
          steps {
            dir('backend') {
               sshagent(['code_commit_key']) {
                 sh 'ssh -o StrictHostKeyChecking=no ec2-user@ecx-xx-xx-x-xx.compute-1.amazonaws.com "whoami"' <<<<<[this return ec2-user after list of errors]
                 sh 'ssh -o StrictHostKeyChecking=no ec2-user@ecx-xx-xx-x-xx.compute-1.amazonaws.com "sudo su -; pm2 delete -s order-form-nestjs; rm -rf ./dist"' <<<<<[this returns list of errors]
                 sh 'scp -r ./dist/* ec2-user@ecx-xx-xx-x-xx.compute-1.amazonaws.com:/home/ec2-user' [this returns list of errors]
                 sh 'ssh -o StrictHostKeyChecking=no  ec2-user@ecx-xx-xx-x-xx.compute-1.amazonaws.com "sudo su -; pm2 start dist/main.js --name=backend-app-nestjs"' <<<<<[this returns list of errors]
                 echo 'Ssh successful'
               }
            }
          }
        }
      }
    }
  }
}```

【问题讨论】:

  • less /etc/passwd | grep jenkins检查是否有任何jenkins用户存在?
  • 在两台服务器上返回:[ec2-user@ip-xxx-xx-xx-xx ~]$ less /etc/passwd | grep jenkins jenkins:x:1001:1001::/var/lib/jenkins:/bin/bash。 (我已经删除了 ip)

标签: amazon-web-services docker jenkins amazon-ec2 ssh


【解决方案1】:

你能从你的 jenkins 服务器 ssh 你的 EC2 吗?你能检查一下吗

【讨论】:

  • 我现在可以了。我将 RSA 密钥从我的 Jenkins 服务器(服务器 a)复制到我要部署到的服务器(服务器 b)。不确定这是否是最佳做法,但它确实有效。 (设置此连接的最佳做法是什么?)
  • 尽管我可以通过 ssh 登录,但在运行 Jenkins 构建时仍然会遇到同样的错误。
  • 我相信您将公钥从 [服务器 a] 复制到 [服务器 b] 中的授权文件,不是吗?你能发布这些错误吗?
  • 将服务器 A 连接到服务器 B 时,我没有收到任何错误。一位朋友确实告诉我,我上面遇到的错误来自服务器 A(服务器 Jenkins 已打开),而 Jenkins 没有拥有该路径的权限,但是当我检查我对 var/lib/jenkins 的詹金斯权限时,drwxrwxrwx 21 jenkins jenkins 8192 Sep 16 15:35 jenkins
【解决方案2】:

找到我的答案here:

默认情况下,当未指定用户时,docker 会启动 [sic] dockerfile 中定义的用户的容器,如果未指定,则为 root。

我在我的 docker 代理代码中添加了args '-u root:root -v /var/lib/jenkins/workspace/myworkspace:/tmp/' + ' -v /var/lib/jenkins/.ssh:/root/.ssh',中提琴,成功!:

agent {
    docker {
      image 'node:buster'
      args '-p 20001-20100:3000'
      args '-v /etc/passwd:/etc/passwd -v /etc/group:/etc/group'
      args '-u root:root -v /var/lib/jenkins/workspace/myworkspace:/tmp/' + ' -v /var/lib/jenkins/.ssh:/root/.ssh'
    }
  }

【讨论】:

    猜你喜欢
    • 2018-12-04
    • 1970-01-01
    • 2019-07-11
    • 2016-06-07
    • 1970-01-01
    • 2018-10-21
    • 2021-01-24
    • 1970-01-01
    • 2019-10-31
    相关资源
    最近更新 更多