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