Ansible & Docker: необходимо установить сессию ssh из контейнера Ansible на хост-машину Docker - PullRequest
0 голосов
/ 08 мая 2019

У меня есть файл YAML для создания Docker, созданный для построения контейнера Ansible на alpine: 3.7 образ и 3 других контейнера Docker, которые будут управляться контейнером Ansible. Мне удалось настроить инвентаризацию для сервера Ansible таким образом, чтобы использовать ansible_connection=docker для других контейнеров, но я не могу подключиться к базовому хост-компьютеру Docker из контейнера Ansible. (MacOS)

Проблема в том, что нам нужно иметь возможность общаться с хостом для передачи файлов, которую контейнер Ansible будет запрашивать как часть выполняемых там пьес, но я не уверен, как настроить хост и / или контейнер добиться правильного соединения. Это для среды разработки, поэтому она не должна быть сверхбезопасной, хотя я обычно предпочитаю лучшие практики, даже если среда не обязательно требует этого.

Я пытался использовать локальный тип соединения, но понял, что Ansible разрешает это как машину, на которой он работает, которая является контейнером. Я также попытался выяснить, как создать и совместно использовать ключ SSH между хостом и контейнером, но я не понимаю концепцию, лежащую в его основе, и не уверен, что статьи, с которыми я сталкивался, способствуют лучшей практике для обмена ключами и установление связи. Я избегал использования host.docker.internal для разрешения IP-адреса хоста в контейнере, поскольку он распознается только в Mac и Windows, а не в рабочем режиме (из того, что я нашел в Интернете).

докер-compose.yml

version: '3'
services:
  ansible:
    container_name: ansible
    build:
      context: ./ansible/
    volumes:
      - ${DOCKERBUILD}/ansible:/ansible
      - /var/run/docker.sock:/var/run/docker.sock
    networks:
      - project-network
    extra_hosts:
      # Tried setting the gateway address for the subnet in the custom network as a host 
      # on the Ansible container, but still cannot connect: Connection refused on port 22.
      - dockerhost:172.55.0.1

  oracle11g:
    container_name: oracle11g
    build:
      context: ./oracle11g/
    environment:
      - ORACLE_PWD=oracle
    ports:
      - 1521:1521
    volumes:
      - ${DOCKERSHARE}/oracle11g/tmp:/tmp
    networks:
      - project-network

# OTHER CONTAINERS OMITTED FOR BREVITY.

networks:
  project-network:
    driver: bridge
    ipam:
      driver: default
      config:
        - subnet: 172.55.0.0/16

Dockerfile (ответный контейнер)

FROM alpine:3.7

ENV ANSIBLE_VERSION 2.7.0
ARG ANSIBLE_SETUP_DIR=./setup
ARG ANSIBLE_ETC=/etc/ansible

 # Install missing dependencies
 # --------------------------------------------------------------------
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 \
  docker

# Copy host file
# --------------------------------------------------------------------

RUN mkdir -p /etc/ansible/

COPY $ANSIBLE_SETUP_DIR/hosts $ANSIBLE_SETUP_DIR/ssh.config $ANSIBLE_ETC/


# Install Ansible
# --------------------------------------------------------------------

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 && \
    \
    echo "==> Installing Ansible..."  && \
    pip install ansible==${ANSIBLE_VERSION} && \
    \
    echo "==> Cleaning up..."  && \
    apk del build-dependencies && \
    rm -rf /var/cache/apk/* && \
    echo "==> Appending SSH config for host..." && \
    cat $ANSIBLE_ETC/ssh.config >> /root/.ssh/ssh_config && \
    rm -rf $ANSIBLE_ETC/ssh.config

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
ENV ANSIBLE_HOME=/ansible/
# In milliseconds, represents 9800+ years.
ENV INFINITY=2147483647d

WORKDIR ${ANSIBLE_HOME}
EXPOSE 22

# Keep container alive by issuing default entrypoint of "infinite" sleep.
ENTRYPOINT ["sleep", "2147483647d"]

инвентарь ($ ANSIBLE_SETUP_DIR / hosts)

[host]
dockerhost

[docker-containers]
ansible ansible_connection=local
oracle11g ansible_connection=docker

Я видел несколько статей о стековом потоке, касающихся связи от хоста до контейнера, но относительно немного наоборот, и ни одна из них, казалось, не решала эту конкретную проблему ( в любом случае). Надеюсь, у кого-то есть ответ. Спасибо!

1 Ответ

0 голосов
/ 08 мая 2019

... и 3 других контейнера Docker, которые будут управляться Ansible контейнер.

Контейнеры Docker не предназначены для управления таким образом, ожидаемые образы контейнеров должны быть неизменными , то есть они не должны изменяться после развертывания.

Все, что вам нужно внутри вашего работающего образа докера, должно управляться процессом сборки образа контейнера, переменными среды, подключенными томами и приложением, работающим внутри.

Если вам нужно что-то изменить в работающем контейнере, необходимо создать и развернуть новый образ.

...