В предыдущих статьях мы уже рассмотрели установку Ansible и подготовку шаблонов для автоматизации работы с управляемыми узлами. В этой статье мы продолжим обсуждать те возможности, которые есть у Ansible, и рассмотрим развертывание Docker.

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

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

Далее перейдем к подготовке плейбука для установки и базовой настройки Docker. И начнем мы со списка задач, которые необходимо выполнить.

У любой задачи в Ansible есть имя, выполняемое действие, например apt, service или ansible.builtin.group, и в некоторых случаях циклы. Также действия содержат необходимые для их работы параметры.

Установка зависимостей

Начинать процесс развертывания мы будем с установки необходимых зависимостей, и в частности, нам потребуются следующие пакеты:

  • apt-transport-https

  • ca-certificates

  • curl

  • gnupg-agent

  • software-properties-common

Для их установки, создадим задачу install dependencies следующего вида в блоке tasks:

tasks:
  - name: install dependencies
      apt:
        name: "{{item}}"
        state: present
        update_cache: yes
      loop:
        - apt-transport-https
        - ca-certificates
        - curl
        - gnupg-agent
        - software-properties-common

Обратите внимание на параметр state, которое имеет значение present. Это состояние, в которое требуется привести модуль. То есть, Ansible должен убедиться, что этот пакет есть, либо доустановить его.

Ключи и репозитории

Далее нам необходимо добавить ключ APT в систему. Это необходимо для установки определенных репозиториев Ubuntu. Для этого создадим следующую задачу:

      - name: add GPG key
          apt_key:
            url: https://download.docker.com/linux/ubuntu/gpg
            state: present

Затем нам необходимо добавить репозиторий docker в apt. Это потребуется для установки компонентов Docker на сервер. Задача будет иметь следующий вид:

    - name: add docker repository to apt
        apt_repository:
          repo: deb https://download.docker.com/linux/ubuntu bionic stable
          state: present

Установка Docker

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

    - name: install docker
        apt:
          name: "{{item}}"
          state: latest
          update_cache: yes
        loop:
          - docker-ce
          - docker-ce-cli
          - containerd.io

Проверка установки

Если все предыдущие действия мы могли реализовать с помощью скриптов, вообще не прибегая к помощи Ansible, и при этом количество строк кода увеличилось бы не сильно, то следующие действия по проверке корректности установки показывают наглядно удобство использования плейбуков Ansible.

В первой задаче мы проверяем запущен ли Docker:

    - name: check docker is active
        service:
          name: docker
          state: started
          enabled: yes

Далее проверяем наличие группы docker в системе:

    - name: Ensure group "docker" exists
        ansible.builtin.group:
          name: docker
          state: present

На данный момент у нас уже должен быть установлен Docker. Но сейчас мы можем запускать команды только с помощью sudo, что нежелательно. Поэтому мы создаем следующую задачу добавления ubuntu в группу docker, которая добавляет пользователя ubuntu - нашего запущенного пользователя - в группу docker:

    - name: adding ubuntu to docker group
        user:
          name: ubuntu
          groups: docker
          append: yes

Теперь Docker установлен и мы можем выполнять команды без sudo. Но для полноты картины нам не хватает еще одного компонента – Docker Composer. Для его установки необходимо выполнить следующие задачи:

    - name: Install docker-compose
        get_url:
            url: https://github.com/docker/compose/releases/download/1.29.2/docker-compose-Linux-x86_64
            dest: /usr/local/bin/docker-compose
            mode: 'u+x,g+x'

Сначала мы скачали нужные файлы и теперь нам необходимо сменить владельца, группу и права доступа:

    - name: Change file ownership, group and permissions
        ansible.builtin.file:
          path: /usr/local/bin/docker-compose
          owner: ubuntu
          group: ubuntu

На этом тему настройки задач можно считать завершенной.

Но для того, чтобы наш плейбук был полностью работоспособен, необходимо в его начало добавить параметр hosts, значение которого равно all, означает, что playbook будет выполняться на всех доступных хостах.

Затем у нас есть параметр remote_user: это пользователь, которого мы используем для подключения к компьютеру по SSH, скажем, ubuntu, но это может быть любой пользователь с доступом по SSH и надлежащими разрешениями. И в третьей строке у нас будет параметр become со значением true. Это означает что мы собираемся выполнять различные команды с помощью sudo. Это необходимо для установки пакетов, изменения разрешений, групп и т.д.

    - hosts: all
        remote_user: ubuntu
        become: true

Теперь давайте посмотрим, что же у нас получилось в итоге. Далее приводится все содержимое файла main.yaml с плейбуком для установки Docker.

---
- hosts: all
  remote_user: ubuntu
  become: true
  tasks:
    - name: install dependencies
      apt:
        name: "{{item}}"
        state: present
        update_cache: yes
      loop:
        - apt-transport-https
        - ca-certificates
        - curl
        - gnupg-agent
        - software-properties-common
    - name: add GPG key
      apt_key:
        url: https://download.docker.com/linux/ubuntu/gpg
        state: present
    - name: add docker repository to apt
      apt_repository:
        repo: deb https://download.docker.com/linux/ubuntu bionic stable
        state: present
    - name: install docker
      apt:
        name: "{{item}}"
        state: latest
        update_cache: yes
      loop:
        - docker-ce
        - docker-ce-cli
        - containerd.io
    - name: check docker is active
      service:
        name: docker
        state: started
        enabled: yes
    - name: Ensure group "docker" exists
      ansible.builtin.group:
        name: docker
        state: present
    - name: adding ubuntu to docker group
      user:
        name: ubuntu
        groups: docker
        append: yes
    - name: Install docker-compose
      get_url:
        url: https://github.com/docker/compose/releases/download/1.29.2/docker-compose-Linux-x86_64
        dest: /usr/local/bin/docker-compose
        mode: 'u+x,g+x'
    - name: Change file ownership, group and permissions
      ansible.builtin.file:
        path: /usr/local/bin/docker-compose
        owner: ubuntu
        group: ubuntu 

Проверяем

Для проверки работы данного плейбука необходимо выполнить следующую команду:

ansible-playbook -i inventoгдry playbooks/main.yaml

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

Заключение

В этой небольшой статье рассмотрен пример развертывания полновесного приложения и необходимых компонентов средствами Ansible. В следующей статье мы поговорим о расширении возможностей Ansible c помощью Ansible Vault.

А прямо сейчас хочу порекомендовать вам бесплатный урок курса DevOps Практики и инструменты, где мы рассмотрим различные типы анализа исходного кода (SAST/SCA/DAST/IAST/RASP) и поговорим об инструментах, позволяющих внедрить их в ваш CI/CD пайплайн.

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


  1. corruptor
    00.00.0000 00:00
    +3

    При использовании ansible.builtin.apt можно (и нужно) сразу передавать список пакетов вместо использования loop. Это намного эффективнее (в случае loop каждый пакет по отдельности ставится) . И правильнее давать полный путь к модулю, как это делается везде в документации ansible.


  1. DpKrane
    00.00.0000 00:00
    +2

    По рекомендации с официального сайта docker-compose ставится как плагин докера.


    1. funca
      00.00.0000 00:00
      +1

      Конечно, docker-compose (v1) как в статье, уже давно не поддерживается. Может OTUS специально добавляют ляпы, чтобы запутать новичков и те шли получать актуальные знания на рекламируемых курсах? Либо уровень курсов и правда такой...


      1. mirwide
        00.00.0000 00:00
        +1

        Копипаста со старых статей, ubuntu bionic совсем древность же, v2 не так давно появился. До появления пакета docker-compose-plugin, способ как в статье вполне норм.


        1. funca
          00.00.0000 00:00
          +4

          Ubuntu bionic это 18.04, с поддержкой только cgroups v1. При попытке запустить что-то более-менее свежее будут не особо очевидные проблемы с правами. Зачем это предлагать в 2023?

          Вообще Docker Compose позиционируется как инструмент для локальной разработки. Именно поэтому он устанавливается лишь как опция. Отсюда связка с Ansible выглядит немного анекдотично. Зачем? Для продакшн у них Docker Stack в стандартной коробке - с конфигурацией в том же формате, но иными механизмами хранения secrets, масштабирования и т.п.

          Docker compose v2 выпустили в 2020. Примерно с тех же времён v1 они не рекомендуют к использованию. v1 не поддерживает многие опции, описанные в актуальной документации. Сейчас эти знания могут пригодиться лишь для работы с каким-то легаси на локалхосте.

          Если статья не про docker, а про Ansible, то невооружённым взглядом видно, что код из примеров не пройдет даже элементарные проверки ansible-lint. Разве это не показатель уровня материала?

          На мой взгляд, статья выглядит как калькуляция где-то устаревших, а где-то и вредных советов. Хотя для новичка, который только входит в тему, качество материала скорее всего будет не очевидным. Я бы мог понять, если бы такой материал опубликовал школьник или студент в личном блоге. Но как текст от компании, предлающей образовательные программы, вызывает разные вопросы.


          1. mirwide
            00.00.0000 00:00
            +2

            Это наверно автору статьи а не мне:)


            1. funca
              00.00.0000 00:00
              +1

              Лично вам - плюсик, остальное - тому кто прочитает.


  1. Kozoft
    00.00.0000 00:00
    +1

    Лучше не ставить docker-compose под судо юзером, под которым работает ansible, а создать для него отдельного. Тем более, что группа создаётся.


  1. TheScrepts
    00.00.0000 00:00

    В разделе "Проверка" допущена опечатка:

    ansible-playbook -i inventoгдry playbooks/main.yaml


  1. jingvar
    00.00.0000 00:00

    Что за школьный уровень? Вы точно понимаете для чего ансибл нужен? Идемпотентность слово встречалось?

    Докер ставится 4мя баш командами, по инструкции с сайта докера. Они немного разнятся для разных OS. И даже для убунты там есть переменные в зависимости от релиза.


  1. jingvar
    00.00.0000 00:00

    Оставляю для любителей велосипедов https://galaxy.ansible.com/geerlingguy/docker