【问题标题】:Run ansible-playbook in Jenkins container在 Jenkins 容器中运行 ansible-playbook
【发布时间】:2020-02-21 21:26:03
【问题描述】:

问题:是否可以有一个 docker-compose 文件在 Jenkins 容器中运行 ansible-playbook?

总结: 我有一个想要运行 ansible-playbook 的 Jenkins 容器(containerA)。但是,由于容器在执行后停止,我不知道如何在 docker-compose 中定义一个非运行容器。

我已经发布了docker ps -adocker-composeansible-playbook 的 Dockerfile 的输出

如果我的问题不清楚,请告诉我。 PG

root@jenkins1:~# docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                    PORTS                                                                   NAMES
c47a4ee06d71        jenkins/jenkins     "/sbin/tini -- /usr/…"   2 months ago        Up 2 months               0.0.0.0:50000->50000/tcp, 0.0.0.0:80->8080/tcp, 0.0.0.0:443->8443/tcp   jenkins1
956309ae7370        foo/ansible       "ansible-playbook"       2 months ago        Exited (2) 2 months ago                                                                           hopeful_hypatia

cat /opt/docker_jenkins/docker-compose.yml
version: '3.2'
services:
  jenkins:
    restart: always
    image: 'jenkins/jenkins'
    container_name: jenkins1
    ports:
      - '80:8080'
      - '443:8443'
      - '50000:50000'
    volumes:
      - type: volume
        source: jenkins_home
        target: /var/jenkins_home
        volume:
          nocopy: true
      - type: bind
        source: /var/lib/bin
        target: /root/.local/bin

volumes:
  jenkins_home:
FROM alpine:3.7

ENV ANSIBLE_VERSION 2.8.6

ENV BUILD_PACKAGES \
  bash \
  curl \
  tar \
  openssh-client \
  sshpass \
  git \
  python \
  py-boto \
  py-dateutil \
  py-httplib2 \
  py-jinja2 \
  py-paramiko \
  py-pip \
  py-yaml \
  ca-certificates

# If installing ansible@testing
#RUN \
#   echo "@testing http://nl.alpinelinux.org/alpine/edge/testing" >> #/etc/apk/repositories

RUN set -x && \
    \
    echo "==> Adding build-dependencies..."  && \
    apk --update add --virtual build-dependencies \
      gcc \
      musl-dev \
      libffi-dev \
      openssl-dev \
      python-dev && \
    \
    echo "==> Upgrading apk and system..."  && \
    apk update && apk upgrade && \
    \
    echo "==> Adding Python runtime..."  && \
    apk add --no-cache ${BUILD_PACKAGES} && \
    pip install --upgrade pip && \
    pip install python-keyczar docker-py && \
    \
    echo "==> Installing Ansible..."  && \
    pip install ansible==${ANSIBLE_VERSION} && \
    \
    echo "==> Cleaning up..."  && \
    apk del build-dependencies && \
    rm -rf /var/cache/apk/* && \
    \
    echo "==> Adding hosts for convenience..."  && \
    mkdir -p /etc/ansible /ansible && \
    echo "[local]" >> /etc/ansible/hosts && \
    echo "localhost" >> /etc/ansible/hosts

ENV ANSIBLE_GATHERING smart
ENV ANSIBLE_HOST_KEY_CHECKING false
ENV ANSIBLE_RETRY_FILES_ENABLED false
ENV ANSIBLE_ROLES_PATH /ansible/playbooks/roles
ENV ANSIBLE_SSH_PIPELINING True
ENV PYTHONPATH /ansible/lib
ENV PATH /ansible/bin:$PATH
ENV ANSIBLE_LIBRARY /ansible/library

WORKDIR /ansible/playbooks

ENTRYPOINT ["ansible-playbook"]

【问题讨论】:

    标签: docker jenkins docker-compose ansible


    【解决方案1】:

    仅当有任何进程或服务保持该容器运行时,docker 容器才会启动。

    在您的 docker 文件中,您正在执行 ansible-playbook 命令,这将错误地指出 ERROR! You must specify a playbook file to run 以及帮助选项。

    如果你想执行 ansible playbook,你必须传递更多参数

    一个成功的剧本执行是这样发生的。

    ansible-playbook -i <inventory_file> <playbook_name> 
    

    【讨论】:

    • 即使成功运行,它最终也会退出。这不会改变将退出的事实。让下一次运行失败,因为容器不再运行......
    • 是的...这不是您需要的...执行任务并退出?为什么您需要容器始终处于启动状态?
    • 你应该从 jenkins 执行 ansible 的方式应该是通过动态 slaves..而不是总是运行 ansible..slave 的工作应该只是执行然后终止
    • 如果 ansible 容器退出 - Jenkins 容器将如何通信或引用它?这是我难以理解的部分。
    • 这就是您在 jenkins 中使用动态从属配置的本质。由于您将 jenkins 作为容器运行,因此您可以在 docker 中使用 docker 来获取动态从站... devopscube.com/docker-containers-as-build-slaves-jenkins github.com/tehranian/dind-jenkins-slave 以上链接可能会有所帮助
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-09-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多