Как протестировать Ansible playbook с помощью Docker
Я новичок в недоступном (и докер). Я хотел бы протестировать мою загружаемую книгу, прежде чем использовать ее на любом сервере постановки/производства.
Поскольку у меня нет доступа к пустующему удаленному серверу, я думал, что самый простой способ проверить - использовать контейнер Docker, а затем просто запустить мою игрушку с контейнером Docker в качестве хоста.
У меня есть базовый DockerFile, который создает стандартный контейнер ubuntu. Как настроить настраиваемые хосты, чтобы запустить его против контейнера докеров? Кроме того, я подозреваю, что мне нужно будет "запустить" контейнер докера, чтобы можно было подключиться к нему.
Ответы
Ответ 1
Запуск игровой книги в контейнере докера может быть не лучшим выбором, если только ваши сценические и производственные серверы также не являются контейнерами Docker. Изображение Docker ubuntu удаляется и будет иметь некоторые отличия от полной установки. Лучшим вариантом может быть запуск пьесы в виртуальной машине Ubuntu, которая соответствует настройкам вашей установки и производства.
Тем не менее, чтобы запустить загрузочную книгу в контейнере, вы должны написать файл Docker, который запускает вашу книгу. Здесь образец Dockerfile:
# Start with the ubuntu image
FROM ubuntu
# Update apt cache
RUN apt-get -y update
# Install ansible dependencies
RUN apt-get install -y python-yaml python-jinja2 git
# Clone ansible repo (could also add the ansible PPA and do an apt-get install instead)
RUN git clone http://github.com/ansible/ansible.git /tmp/ansible
# Set variables for ansible
WORKDIR /tmp/ansible
ENV PATH /tmp/ansible/bin:/sbin:/usr/sbin:/usr/bin
ENV ANSIBLE_LIBRARY /tmp/ansible/library
ENV PYTHONPATH /tmp/ansible/lib:$PYTHON_PATH
# add playbooks to the image. This might be a git repo instead
ADD playbooks/ /etc/ansible/
ADD inventory /etc/ansible/hosts
WORKDIR /etc/ansible
# Run ansible using the site.yml playbook
RUN ansible-playbook /etc/ansible/site.yml -c local
Файл незаменимой инвентаризации будет выглядеть как
[local]
localhost
Тогда вы можете просто docker build .
(где .
- корень каталога, в котором находятся ваши плейеры и файл Dockerfile), а затем docker run
на полученном изображении.
Майкл ДеХаан, технический директор Ansible, имеет информативное сообщение в этом блоге.
Ответ 2
Здесь есть рабочий пример: https://github.com/William-Yeh/docker-ansible
Сначала выберите базовое изображение, которое вы хотите начать, из следующего списка:
-
williamyeh/ansible:debian8-onbuild
-
williamyeh/ansible:debian7-onbuild
-
williamyeh/ansible:ubuntu14.04-onbuild
-
williamyeh/ansible:ubuntu12.04-onbuild
-
williamyeh/ansible:centos7-onbuild
-
williamyeh/ansible:centos6-onbuild
Во-вторых, добавьте следующий Dockerfile
вместе с каталогом вашей книги:
FROM williamyeh/ansible:ubuntu14.04-onbuild
# ==> Specify playbook filename; default = "playbook.yml"
#ENV PLAYBOOK playbook.yml
# ==> Specify inventory filename; default = "/etc/ansible/hosts"
#ENV INVENTORY inventory.ini
# ==> Executing Ansible...
RUN ansible-playbook-wrapper
В-третьих, docker build .
Для более продвинутого использования роль в Ansible Galaxy williamyeh/nginx
также демонстрирует, как сделать простой тест интеграции для различных дистрибутивов Linux на Travis CI с Ubuntu 12.04 рабочих экземпляров.
Раскрытие информации: Я являюсь автором проектов docker-ansible
и wiliamyeh/nginx
.
Ответ 3
Я создал роль для этого различного сценария: https://github.com/chrismeyersfsu/provision_docker. Легко запускайте контейнеры Docker и используйте их в своей роли или playbook, как инвентарь, для тестирования.
Включает:
- Curated Dockerfile для Ubuntu 12.04 и 14.04, а также CentOS 6 и 7, которые возвращаются в системы инициализации distro-remove
- start ssh
Также обратите внимание, что все примеры имеют файл .travis.yml
для формирования конвейера CI с использованием Travis CI.
<сильные > Примеры:
Ответ 4
Помимо инициализации localhost (компьютера, на котором установлен Ansible), вы также можете указать Ansible:
- создайте новый докер-контейнер,
- предоставление этого контейнера,
- уничтожить этот контейнер.
Чтобы это работало, вам нужен такой файл hosts.yaml
:
all:
hosts:
mycontainer:
ansible_connection: docker
localhost:
ansible_connection: local
такой файл playbook.yaml
:
---
- name: Create a container to be provisioned later
hosts: localhost
tasks:
- name: create docker container
docker_container:
name: mycontainer
image: python:2.7.16-slim-stretch
command: ["sleep", "1d"]
- name: Provision the container created above
hosts: mycontainer
roles:
- simple
и другой файл playbook: destroy.yaml
используется для уничтожения контейнера:
---
- name: Destroy a container
hosts: localhost
tasks:
- name: destroy docker container
docker_container:
name: mycontainer
state: absent
Создайте также простую роль: roles/simple/taksks/main.yaml
---
- name: Create a file
copy:
content: "hi!!"
dest: /tmp/hello
force: yes
mode: 0555
А теперь, чтобы создать контейнер и подготовить его, запустите:
ansible-playbook -i ./hosts.yaml ./playbook.yml
Убедитесь, что контейнер был подготовлен (файл был создан):
docker exec mycontainer cat /tmp/hello
Чтобы уничтожить контейнер, выполните:
ansible-playbook -i ./hosts.yaml ./destroy.yml
Есть, конечно, недостатки:
- в контейнере должен быть установлен питон
- некоторые модули Ansible могут не работать, поскольку необходимо установить дополнительные пакеты Python. Например. если вы хотите развернуть Docker-контейнеры (в Docker-контейнере), вам необходимо установить Docker Python SDK (
pip3 install docker
)
Я был вдохновлен этим сообщением в блоге: https://medium.com/@andreilhicas/provision-docker-containers-with-ansible-30cc5ee6d950