Сегодня я бы хотел рассказать, как создавать образы Docker с помощью Ansible.

Но для начала расскажу кратко что такое Docker. Docker – это софт для виртуализации и он позволяет вам упаковывать ваши приложения в контейнеры.

Что такое Ansible – это софт для управления конфигурациями, в частности управление конфигурациями операционных систем.

Для начала нам нужно установить Docker и Ansible, затем создадим Docker файл и соберем контейнер для Web-сервера. После этого мы создадим простой плейбук Ansible для создания образа Docker для другого Web-сервера.

Устанавливаем Docker

sudo apt-get install apt-transport-https ca-certificates curl gnupg-agent software-properties-common

curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -

sudo add-apt-repository “deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable”

sudo apt update

sudo apt install docker-ce docker-ce-cli containerd.io

sudo groupadd docker

sudo usermod -aG docker $USER

Теперь вам надо перелогиниться в операционной системе и проверяем версию установленного Docker:

docker --version

Устанавливаем Ansible

sudo apt install ansible

Всё.

Установка дополнительного софта

Выше мы установили основной софт, но для полноценной работы нам надо установить дополнительные пакеты.

sudo apt install python3-pip

pip3 install docker

Теперь давайте писать код

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

Создаем папку docker-build и в ней создаем файл Dockerfile, он будет использоваться для создания Docker image.

Содержимое файла:

FROM nginx:latest

# Default Nginx static file location
# Ideally, we would edit the nginx.conf for new configuration
WORKDIR /usr/share/nginx/html

# Add all local static files to image working directory
ADD ./ ./

# If there was a lot of ADD COPY and RUN Steps, Bash script file is common practice
# To bootstrap the image without additional layers
# RUN /bootstrap.sh

# Self explanatory
EXPOSE 8080

Теперь создадим рядом с папкой docker-build папку ansible-build. В ней создаем файл docker-image-playbook.yaml

Содержимое файла:

---
- name: Pull latest Nginx Image
  hosts: localhost
  tasks:
    - name: Pull Nginx Image
      docker_container:
        name: «nginx-ansible-base»
        image: «nginx:latest»
        state: started
        command: tail -f /dev/null
    - name: Add Nginx Image to Ansible Hosts
      add_host:
        name: «nginx-ansible-base»
        ansible_connection: docker
        ansible_ssh_user: root
- name: Configure Nginx Base Image for deploying Webserver
  hosts: «nginx-ansible-base»
  gather_facts: false
  tasks:
    - name: Install Python3
      raw: apt update && apt upgrade -y && apt install python3 -y
    - name: Install Rsync
      apt:
        name: rsync
    - name: Copy local configuration Files to Nginx Conf
      synchronize:
        src: ./website/
        dest: /usr/share/nginx/html/
    - name: Ensure NGINX Is enabled
      service:
        name: nginx
        enabled: yes
    - name: Clean up Python 3 and Prerequisites
      raw: apt purge python3 rsync -y
- name: Snapshot base image to create newly configured Image
  hosts: localhost
  tasks:
    - name: Commit Docker image
      command: docker commit «nginx-ansible-base» «nginx-ansible-build-demo»
- name: Clean Up Docker Containers
  hosts: localhost
  tasks:
    - name: Remove Running Base Image
      docker_container:
        name: nginx-ansible-base
        state: absent
        force_kill: yes

В этом файле описываются команды, которые будет выполнять Ansible.

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

Чтобы собрать образ на основании только что созданного файла docker-image-playbook.yaml вводим в консоли команду ansible-playbook docker-image-playbook.yaml

В репозитории вы найдете еще файлы от двух html шаблонов сайтов. Они добавлены чтобы при запуске контейнера Docker через Dockerfile и через файл docker-image-playbook.yaml вы могли увидеть разницу (шаблоны отличаются друг от друга).

Комментарии (9)


  1. osipov_dv
    18.06.2022 17:15
    +9

    Во-первых - зачем?

    Во-вторых, это bashible...


    1. ajijiadduh
      18.06.2022 18:03

      bashsible*


  1. Meklon
    18.06.2022 18:07
    +1

    С идемпотентностью тут сложности


    1. osipov_dv
      18.06.2022 18:53
      +2

      не, ее просто нет :)


  1. edo1h
    18.06.2022 18:36
    +4

    sudo apt install ansible

    почему бы вместо всего идущего перед этим не сделать так же


    sudo apt install docker.io

    ?


    sudo apt install python3-pip
    pip3 install docker

    почему не


    sudo apt install python3-docker

    ?


    итого всю установку можно сократить до


    sudo apt install docker.io ansible python3-docker rsync

    (да, не мешает убедиться, что rsync есть на хосте)


    Создаем папку docker-build и в ней создаем файл Dockerfile, он будет использоваться для создания Docker image.

    зачем? не увидел нигде использования


    ну и главный вопрос вам задали в первом же комментарии: что побудило вас написать эту статью? зачем вносить изменения в контейнер docker через ansible?


  1. Exclipt
    18.06.2022 21:45
    +3

    а можно узнать, зачем тут ансибл? Вот с практической точки зрения, допустим на этом простом примере не видно (тут и Dockerfile-то не нужен), но расскажите, с какого момента в принципе ансибл будет полезен?


  1. viciousrage
    18.06.2022 22:39

    Зачем такие сложности?


  1. tvi
    18.06.2022 22:39

    Мне кажется вы не в себе, сходите к специалистам.


  1. Martsial
    18.06.2022 22:39
    +3

    Docker – это НЕ софт для виртуализации [аппаратного обеспечения]. Этим занимаются гипервизоры.