Jenkins声明性流水线SSH代理插件

5

我想使用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}' "
     }
   }
}

感谢您的选择,


1
你的第一个代码块似乎是两个命令,一个来自代理到<host-ip>的ssh远程无操作,然后是代理本地的whoami。尝试过语法生成器了吗? - Ian W
为什么它在sshagent块内部时作为Jenkins而不是Ubuntu运行“whoami”? - Nurhun
基本上,您已将sshgent添加到jenkins主服务器的代理中,我认为您应该删除sshagent,并只运行命令:ssh -I ubuntu并执行whoami命令。 - Thanh Nguyen Van
1
@nurhun,你正在从SSH代理器运行ssh连接到<host ip>。你的代理显然是以“jenkins”启动的。请参考shhagent example,将whomai替换为uname - Ian W
2个回答

2
如上所述,您应该选择一个凭据,参考正确的远程用户名,如 SSH Agent Jenkins 插件 中所示:

https://cdn.jsdelivr.net/gh/jenkinsci/ssh-agent-plugin@master/docs/images/Screen_Shot_2012-10-26_at_12.25.04.png

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

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

那正是我得到示例代码片段的地方。 - Nurhun
@Nurhun,为什么不在同一段代码中包括 credentials: 部分呢? - VonC
它可以双向工作,语法生成器不包括它。 - Nurhun

0

目前来看,这是最好的方式,尽管有重复!

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有没有机会将一个包含所有命令的脚本(script)进行scp,然后第二个sh通过ssh执行你刚刚复制的脚本? - VonC

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接