【问题标题】:Jenkins declarative pipeline ssh agent pluginJenkins 声明式管道 ssh 代理插件
【发布时间】:2021-06-24 00:44:19
【问题描述】:

我正在尝试使用 sshagent 插件部署到远程服务器。

当使用下面的语法时,我得到了

pipeline {
    agent any
    stages {
        stage('Deploy') {
            steps {
                sshagent(['nginx-ec2']) {
                    // some block
                    sh "ssh -o StrictHostKeyChecking=no ubuntu@<host_ip>"
                    sh "whoami"
                }
            }
        }
    }
}

得到输出:

[Pipeline] sh (hide)
+ whoami
jenkins

虽然我希望使用提供的凭据在远程服务器上运行脚本!!

所以,我不得不这样运行它

pipeline {
    agent any
    stages {
        stage('Deploy') {
            steps {
                sshagent(['nginx-ec2']) {
                    // some block
                    sh "ssh -o StrictHostKeyChecking=no -l ubuntu <host_ip> 'whoami && \
                    sudo apt update  && sudo apt install -y docker.io && \
                    sudo usermod -aG docker ubuntu && \
                    source .bashrc && \
                    docker run -d nginx'"
                }
            }
        }
    }
}

是否有任何“干净”的方法可以使用 ubuntu 而不是 jenkins 用户在远程服务器上运行脚本?

编辑:

我知道我需要在 ssh 命令下运行它而不是作为单独的 sh 脚本运行,否则它将作为 jenkins 运行,并且我能够以如下脚本方式执行它。

这就是为什么我要问是否有更好的方式来以声明方式编写它。

node {
   stage('Deploy'){
     def dockerRun = "whoami && \
            sudo apt update  && sudo apt install -y docker.io && \
            sudo usermod -aG docker ubuntu && \
            source .bashrc && \
            docker run -d nginx "
            
     sshagent(['nginx-ec2']) {
       sh "ssh -o StrictHostKeyChecking=no ubuntu@<host_ip> '${dockerRun}' "
     }
   }
}

谢谢,

【问题讨论】:

  • 您的第一个代码块似乎是两个命令,一个从代理到 的 ssh 远程无操作,然后是一个代理本地 whoami。尝试过语法生成器?
  • 为什么它运行 whoami 作为 jenkins 而不是 ubuntu,而它仍在 sshagent 块内?
  • 基本上,你已经将sshgent添加到jenkins master的代理中,我认为你应该删除sshagent,然后运行命令:ssh -I ubuntu并执行whoami命令
  • @nurhun,您正在从 SSH 代理到 运行 ssh。您的代理显然是作为“詹金斯”启动的。参考shhagent example,子unamewhomai

标签: jenkins ssh jenkins-pipeline jenkins-plugins sudo


【解决方案1】:

如前所述,您应该选择引用正确远程用户名的凭据,如 SSH Agent Jenkins plugin 中所示:

node {
  sshagent (credentials: ['deploy-dev']) {
    sh 'ssh -o StrictHostKeyChecking=no -l cloudbees 192.168.1.106 uname -a'
  }
}

另外,我将只执行一个脚本,其中包含您想要远程执行的所有命令序列。

【讨论】:

  • 这正是我得到样本 sn-p 的地方。
  • @Nurhun 为什么不包含来自同一个 sn-p 的 credentials: 部分?
  • 无论哪种方式都可以工作,顺便说一句,语法生成器不包括它。
【解决方案2】:

嗯,到目前为止,这是最好的方法,尽管有重复!

pipeline {
  agent any

  stages {
      stage('Deploy') {
          steps {

             sshagent(['nginx-ec2']) {
                 // some block
                 sh "ssh -o StrictHostKeyChecking=no -l ubuntu <remote_ip> 'whoami'"
                 sh "ssh -o StrictHostKeyChecking=no -l ubuntu <remote_ip> 'sudo apt update  && sudo apt install -y docker.io'"
                 sh "ssh -o StrictHostKeyChecking=no -l ubuntu <remote_ip> 'sudo usermod -aG docker ubuntu'"
                 sh "ssh -o StrictHostKeyChecking=no -l ubuntu <remote_ip> 'source .bashrc'"
                 sh "ssh -o StrictHostKeyChecking=no -l ubuntu <remote_ip> 'docker run -d -nginx'"
             }
         }
      }
   }
}

【讨论】:

  • 第一个 sh 是否有机会执行脚本的 scp(其中包含您的所有命令),而第二个 sh 是否有机会 ssh 执行您刚刚复制的脚本?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多