Как протестировать 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:

  1. создайте новый докер-контейнер,
  2. предоставление этого контейнера,
  3. уничтожить этот контейнер.

Чтобы это работало, вам нужен такой файл 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