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