Расширяем возможности Ansible: развертывание Docker

от автора

В предыдущих статьях мы уже рассмотрели установку 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 пайплайн.


ссылка на оригинал статьи https://habr.com/ru/company/otus/blog/721166/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *