【问题标题】:Jenkins slave in docker is denying SSH keysdocker 中的 Jenkins slave 拒绝 SSH 密钥
【发布时间】:2017-04-14 04:58:25
【问题描述】:

我在 docker 容器中运行 Jenkins。在另一个 docker 容器中关闭节点时,我收到以下消息:

[11/18/16 20:46:21] [SSH] Opening SSH connection to 192.168.99.100:32826.
ERROR: Server rejected the 1 private key(s) for Jenkins (credentialId:528bbe19-eb26-4c9f-bae3-82cd1247d50a/method:publickey)
[11/18/16 20:46:22] [SSH] Authentication failed.
hudson.AbortException: Authentication failed.
    at hudson.plugins.sshslaves.SSHLauncher.openConnection(SSHLauncher.java:1217)
    at hudson.plugins.sshslaves.SSHLauncher$2.call(SSHLauncher.java:711)
    at hudson.plugins.sshslaves.SSHLauncher$2.call(SSHLauncher.java:706)
    at java.util.concurrent.FutureTask.run(FutureTask.java:266)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
    at java.lang.Thread.run(Thread.java:745)
[11/18/16 20:46:22] Launch failed - cleaning up connection
[11/18/16 20:46:22] [SSH] Connection closed.

使用docker exec -i -t slave_name /bin/bash 命令,我可以进入 home/jenkins/.ssh 目录以确认 ssh 密钥在预期的位置。

在我的配置页面上的 CLOUD 标题下,测试连接返回

版本 = 1.12.3,API 版本 = 1.24

.

我正在运行 OSX Sierra 并尝试遵循 RIOT Games Jenkins-Docker 教程http://engineering.riotgames.com/news/building-jenkins-inside-ephemeral-docker-container。

Jenkins Master Docker 文件:

FROM debian:jessie

# Create the jenkins user
RUN useradd -d "/var/jenkins_home" -u 1000 -m -s /bin/bash jenkins

# Create the folders and volume mount points
RUN mkdir -p /var/log/jenkins
RUN chown -R jenkins:jenkins /var/log/jenkins
VOLUME ["/var/log/jenkins", "/var/jenkins_home"]

USER jenkins
CMD ["echo", "Data container for Jenkins"]

Jenkins 从属 Dockerfile

FROM centos:7

# Install Essentials
RUN yum update -y && yum clean all

# Install Packages
RUN yum install -y git \
    && yum install -y wget \
    && yum install -y openssh-server \
    && yum install -y java-1.8.0-openjdk \
    && yum install -y sudo \
    && yum clean all

# gen dummy keys, centos doesn't autogen them.
RUN /usr/bin/ssh-keygen -A

# Set SSH Configuration to allow remote logins without /proc write access
RUN sed -ri 's/^session\s+required\s+pam_loginuid.so$/session optional \
    pam_loginuid.so/' /etc/pam.d/sshd

# Create Jenkins User
RUN useradd jenkins -m -s /bin/bash

# Add public key for Jenkins login
RUN mkdir /home/jenkins/.ssh
COPY /files/authorized_keys /home/jenkins/.ssh/authorized_keys
RUN chown -R jenkins /home/jenkins
RUN chgrp -R jenkins /home/jenkins
RUN chmod 600 /home/jenkins/.ssh/authorized_keys
RUN chmod 700 /home/jenkins/.ssh

# Add the jenkins user to sudoers
RUN echo "jenkins  ALL=(ALL)  ALL" >> etc/sudoers

# Set Name Servers to avoid Docker containers struggling to route or resolve DNS names.
COPY /files/resolv.conf /etc/resolv.conf

# Expose SSH port and run SSHD
EXPOSE 22
CMD ["/usr/sbin/sshd","-D"]

我一直在与另一个人一起在 Linux 机器上做同样的教程,他被困在同一个地方。任何帮助,将不胜感激。

【问题讨论】:

    标签: jenkins docker ssh jenkins-docker


    【解决方案1】:

    您遇到的问题可能与主机的交互式授权有关。尝试将以下命令添加到您的奴隶的Dockerfile

    RUN ssh-keyscan -H 192.168.99.100 >> /home/jenkins/.ssh/known_hosts
    

    一定要在创建jenkins用户之后添加,最好是在

    之后
    USER jenkins
    

    以避免错误的文件所有权。

    还要确保在主控主机在线时执行此操作,否则它会告诉您主机无法访问。如果不能,则在手动完成后从从站获取known_hosts 文件并将其复制到您的从站中。

    您可以验证这一点。如果您将控制台连接到 docker 从站并通过 ssh 连接到主站,它会要求您信任服务器并将其添加到已知主机。

    【讨论】:

    • 我正在使用 RUN useradd jenkins -m -s /bin/bash 创建 Jenkins 用户。在此命令之后,我尝试添加ssh-keyscan -H 192.168.99.100 >> /home/jenkins/.ssh/known_hosts,然后添加RUN ssh-keyscan -H 192.168.99.100 >> /home/jenkins/.ssh/known_hosts。两者都无法构建。带有The command '/bin/sh -c ssh-keyscan -H 192.168.99.100 >> /home/jenkins/.ssh/known_hosts' returned a non-zero code: 1 的RUN 版本和不带RUN 版本Unknown instruction: SSH-KEYSCAN。如果我遗漏了一些众所周知的东西,我深表歉意。
    • 您是否收到错误消息(最好以 jenkins 身份运行命令或添加 known_hosts)。你能从奴隶ssh到主人吗?如果是,它不应该要求您将主机添加到 known_hosts
    • 您确实应该使用RUN ssh-keyscan...,但它实际上会扫描网址。所以如果主人不在线,它就不会工作。你可以做的是,在master和slave运行之后,ssh从slave到master,然后将known_hosts文件复制到dockerfile中
    • 但是要检查这是否能解决您最初的问题,请将主从联机和从 dlave 到 master 的 ssh 一次。那么你不应该再在jenkins中得到错误了
    • 您也可以尝试ssh-keyscan ... > /home/jenkins/.ssh/known_hosts,因为>> 尝试附加到文件可能导致命令失败。如果文件不存在,它也会失败
    猜你喜欢
    • 1970-01-01
    • 2016-10-15
    • 2012-10-19
    • 2021-08-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-02
    • 1970-01-01
    相关资源
    最近更新 更多