Как протестировать Ansible playbook с помощью Docker

Я новичок в анзибле (и докере). Я хотел бы протестировать свой доступный playbook, прежде чем использовать его на любых промежуточных / производственных серверах.

Поскольку у меня нет доступа к пустому удаленному серверу, я подумал, что самый простой способ протестировать - использовать контейнер Docker, а затем просто запустить мою playbook с контейнером Docker в качестве хоста.

У меня есть базовый файл DockerFile, который создает стандартный контейнер ubuntu. Как мне настроить доступные хосты, чтобы запускать их против контейнера докеров? Кроме того, я подозреваю, что мне нужно будет «запустить» контейнер докеров, чтобы позволить ansible подключиться к нему.


person Andre    schedule 14.07.2014    source источник
comment
Molecule - это официальная среда тестирования: jeffgeerling.com/blog/2018 / testing-your-ansible-ролевые-молекулы   -  person sajjadG    schedule 19.02.2019


Ответы (4)


Запуск playbook в контейнере докеров может быть не лучшим подходом, если ваши этапы и производственные серверы также не являются контейнерами Docker. Образ Docker ubuntu урезан и будет иметь некоторые отличия от полной установки. Лучшим вариантом может быть запуск playbook на виртуальной машине Ubuntu, которая соответствует вашим промежуточным и производственным установкам.

Тем не менее, чтобы запустить доступный playbook в контейнере, вы должны написать Dockerfile, который запускает вашу playbook. Вот пример 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 . (где . - корень каталога, в котором находятся ваши playbooks и Dockerfile), а затем docker run на получившемся образе.

Майкл ДеХаан, технический директор Ansible, опубликовал информативную запись в блоге на эту тему.

person Ben Whaley    schedule 14.07.2014
comment
Спасибо. Таким образом, в основном вы развертываете локально из контейнера докеров, а не из контейнера, который является хостом. Я не думал об этом. Я проверю его завтра вечером, чтобы увидеть, как он подходит для моего варианта использования. Также спасибо за внимание, что это может быть не лучший подход! Примет это во внимание. - person Andre; 15.07.2014
comment
@Andre Получил ли ты от этого какие-то результаты? - person Tuukka Mustonen; 06.08.2014


Я создал роль для этого разнообразного сценария: https://github.com/chrismeyersfsu/provision_docker . С легкостью запускайте контейнеры Docker и используйте их в своей роли или учебнике в качестве инвентаря для тестирования.

Включает в себя:

  • Курируемый файл Dockerfile для Ubuntu 12.04 и 14.04, а также CentOS 6 и 7, которые возвращаются в системы инициализации, удаленные из дистрибутива.
  • запустить ssh

Также обратите внимание, что во всех примерах есть .travis.yml файл для формирования конвейера CI с использованием Travis CI.

Примеры:

person chrism    schedule 20.12.2015

Помимо предоставления 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.

person Ewa    schedule 29.09.2019