Ansible在从Jenkins管道中的docker代理运行时失败



我试图使用agentdocker和Ansible剧本通过Jenkins管道部署构建,但在Gathering Facts阶段失败,如下所示:

TASK [Gathering Facts] *********************************************************
fatal: [destination.box.local]: UNREACHABLE! => {"changed": false, "msg": "argument must be an int, or have a fileno() method.", "unreachable": true}

类似的Jenkins管道使用agentany和Ansible,而不是来自docker(本地安装(,将在没有任何问题的情况下完成工作。

詹金斯管道的代理部分看起来像:

agent {
docker {
image 'artifactory.devbox.local/docker-local/myrepo/jdk8:latest'
args '-v $HOME/.m2:/root/.m2 -v /etc/ansible:/etc/ansible -v $HOME/.ansible/tmp:/.ansible/tmp -v $HOME/.ssh:/root/.ssh'
}
}

有没有想过我需要添加什么才能让Ansible运行剧本?

PS。

在将ansible_ssh_common_args='-o StrictHostKeyChecking=no'添加到Ansible库存(或在配置中设置host_key_checking = False(后,我得到了错误:

TASK [Gathering Facts] *********************************************************
fatal: [destination.box.local]: UNREACHABLE! => {"changed": false, "msg": "'getpwuid(): uid not found: 700'", "unreachable": true}
fatal: [ansible_ssh_common_args=-o StrictHostKeyChecking=no]: UNREACHABLE! => {"changed": false, "msg": "[Errno -3] Try again", "unreachable": true}

在我的案例中,Jenkins使用特定的UID和GID运行docker代理。为了解决这个问题,需要通过创建具有相同UID和GID 的内部Jenkins用户来重建docker映像

为此,在Jenkinsfile的顶部,我添加了一个docker图像:

def user_id
def group_id
node {
user_id = sh(returnStdout: true, script: 'id -u').trim()
group_id = sh(returnStdout: true, script: 'id -g').trim()
}

然后在构建阶段,我将额外的参数作为传递给docker

--build-arg JenkinsUserId=${user_id} --build-arg JenkinsGroupId=${group_id}

然后在该构建的Dockerfile中:

FROM alpine:latest
#pick up provided ARGs for the bild
ARG JenkinsUserId
ARG JenkinsGroupId
//do your stuff here
#create Ansible config directory
RUN set -xe 
&& mkdir -p /etc/ansible
#create Ansible tmp directory
RUN set -xe 
&& mkdir -p /.ansible/tmp
#set ANSIBLE_LOCAL_TEMP
ENV ANSIBLE_LOCAL_TEMP /.ansible/tmp
#create Ansible cp directory
RUN set -xe 
&& mkdir -p /.ansible/cp
#set ANSIBLE_SSH_CONTROL_PATH_DIR
ENV ANSIBLE_SSH_CONTROL_PATH_DIR /.ansible/cp
# Create Jenkins group and user
RUN if ! id $JenkinsUserId; then 
groupadd -g ${JenkinsGroupId} jenkins; 
useradd jenkins -u ${JenkinsUserId} -g jenkins --shell /bin/bash --create-home; 
else 
addgroup --gid 1000 -S jenkins && adduser --uid 1000 -S jenkins -G jenkins; 
fi
RUN addgroup jenkins root
# Tell docker that all future commands should run as the appuser user
USER jenkins

并最终为出现问题的主管道更新dockeragent

agent {
docker {
image 'artifactory.devbox.local/docker-local/myrepo/jdk8:latest'
args '-v $HOME/.m2:/root/.m2 -v $HOME/.ssh:/home/jenkins/.ssh  -v /etc/ansible:/etc/ansible -v $HOME/.ansible/tmp:/.ansible/tmp -v $HOME/.ansible/cp:/.ansible/cp'
}
}

最新更新