Ansible — это инструмент, который помогает автоматизировать настройку и управление множеством компьютеров (серверов) сразу. Проще говоря, это такой «пульт дистанционного управления».
Он упрощает жизнь системным администраторам и DevOPS-инженерам. Позволяя централизованно управлять ландшафтом.
В данной статье, приведен пример создания playbook'a, с помощью которого можно установить MongoDB на сервер с Ubuntu. А так как я приемущественно работаю с ELMA365, захардкодим версию Mongo. Инструкция по установки MongoDB для ELMA365.
Кода в этой статье будет много, так что весь проект продублирую в GitHub.
Введение
В данной статье я не буду описывать процесс установки и настройки ansible на хост, так как в интернете можно найти большое количество инструкций. Да и установка, сама по себе, простая. Сосредоточимся на разработке playbook'a.
Подготовка
Первым делом создадим директорию нашего "проекта" и подготовим структуру. Как правило, она стандартная. Внутри нее также создадим директории. Не все будут использованы в данной статье.
# mkdir -p ansible_playbook_mongo/{group_vars, host_vars, inventory, roles}
Далее, определим хосты (серверы) на которые будем устанавливать MongoDB. Для этого создадим файл inventory/hosts.ini
[webservers]
server1 ansible_host=192.168.0.32 ansible_user=username
В нем мы определяем группу узлов (webservers) и сам сервер. Указываем его ip-адрес и имя пользователя, от имени которого будут выполняться дальнейшие инструкции. Важно, чтоб на конечном узле был установлен ваш ssh-ключ.
Чтоб убедиться в том, что узел доступен, создадим задачу ping.yml в корне проекта.
---
- name: Test connectivity
hosts: all
tasks:
- name: Test ping
ansible.builtin.ping:
И выполним команду
$ ansible-playbook -i inventory/hosts.ini ping.yml
###ВЫВОД###
PLAY [Test connectivity] ***************************
TASK [Gathering Facts] ***************************
ok: [server1]
TASK [Test ping] ***************************
ok: [server1]
PLAY RECAP ***************************
server1 : ok=2 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
По результатам видно, что и первичная проверка ansible (Gathering Facts) и наша задача Test ping прошли успешно. Можно приступать к разработке самого playbook'a.
Пишем Playbook
Можно сделать все в одном файле, но если есть возможность разделять - надо пользоваться. В этом есть свои плюсы. Например, при реализации IaC-подхода (Infrastructure As Code), в git-репозитории сможете видеть в каком именно файле были изменения. Исходя из этого понимать какого рода изменения были применены.
Для этого создадим в директории roles следующие поддиректории
$ mkdir -p roles/mongo/{handlers, tasks, templates}
Кратко пройдемся по директориям.
tasks - в ней хранятся конфиги, описывающие задачи (шаги, выполняющиеся плейбуком).
handlers - вспомогательные конфиги.
templates - шаблоны. Шаблоны создаются шаблонизатором jinja и как правило, определяю конфигурационные файлы устанавливаемого софта.
Конфигурационные файлы представляют собой декларативную структуру на языке YAML. Он прост в понимании, но крайне коварен из-за чувствительности к отступам.
Создадим первый конфиг **roles/mongo/tasks/main.yml
---
- name: Install prerequisites ###Устанавливаем необходимые утилиты
apt:
name:
- gnupg
- ca-certificates
- curl
state: present
update_cache: yes ##выполняется apt update
- name: Create keyrings directory ##Создаем директорию для хранения ключей
file:
path: /usr/share/keyrings
state: directory
mode: '0755'
- name: Download MongoDB GPG key ##Загружаем asc-ключ
get_url:
url: "https://pgp.mongodb.com/server-6.0.asc"
dest: /tmp/mongodb-key.asc
mode: '0644'
- name: Convert key to gpg format ##Конвертируем asc-ключ в формат GPG и сохраняем в /usr/share/keyrings
command: gpg --dearmor -o /usr/share/keyrings/mongodb-server-6.0.gpg /tmp/mongodb-key.asc
args:
creates: /usr/share/keyrings/mongodb-server-6.0.gpg
- name: Clean up temporary key ##Подчищаем хвосты =)
file:
path: /tmp/mongodb-key.asc
state: absent
- name: Add MongoDB repository ##Добавляем репозиторий в наше хранилище
apt_repository:
repo: "deb [ arch=amd64,arm64 signed-by=/usr/share/keyrings/mongodb-server-6.0.gpg ] https://repo.mongodb.org/apt/ubuntu jammy/mongodb-org/6.0 multiverse"
state: present
filename: "mongodb-org-6.0"
- name: Update package cache ##Обновляем списки репозиториев (apt update)
apt:
update_cache: yes
cache_valid_time: 3600
- name: Install MongoDB ##Скачиваем и устанавливаем MongoDB 6.0
apt:
name: mongodb-org
state: present
- name: Create MongoDB data directory ##Создаем директорию MongoDB и наделяем ее правами
file:
path: /var/lib/mongodb
state: directory
owner: mongodb
group: mongodb
mode: '0755'
- name: Create MongoDB log directory ##Создаем директорию для логов MongoDB
file:
path: /var/log/mongodb
state: directory
owner: mongodb
group: mongodb
mode: '0755'
- name: Configure MongoDB ##Конфигурируем MongoDB, в конфиг кидаем наш шаблон (определим далее)
template:
src: mongod.conf.j2
dest: /etc/mongod.conf
owner: root
group: root
mode: '0644'
notify: restart mongodb ## Вызываем ХЭЛПЕР
- name: Enable and start MongoDB service ##Включаем автозапуск демона и стартуем
systemd:
name: mongod
enabled: yes
state: started
Теперь, определим наш хэлпер roles/mongo/handlers/main.yml
---
- name: restart mongodb
systemd:
name: mongod
state: restarted
Данный хэлпер мы вызываем в задаче Configure MongoDB, в файле roles/mongo/tasks/mongod.conf.j2.
Шаблон конфигурационного файла roles/mongo/templates/main.yml.
# MongoDB configuration file
# Where to store the data.
storage:
dbPath: /var/lib/mongodb
journal:
enabled: true
# Where to write logging data.
systemLog:
destination: file
logAppend: true
path: /var/log/mongodb/mongod.log
# network interfaces
net:
port: {{ mongodb_port }} ##Переменная, которую укажем далее
bindIp: 127.0.0.1
# How the process runs
processManagement:
timeZoneInfo: /usr/share/zoneinfo
В этом конфиге указываются минимальные настройки для работы с ELMA365. Безопасность не настраиваем.
И теперь финал, создаем в корне проекта файл install_mongo.yml
---
- name: Install MongoDB
hosts: webservers ##Указываем группу хостов
become: yes
vars:
mongodb_port: 27017 ##Переменная, которую мы указали в шаболоне
roles:
- mongo ##Говорим ansible, что ставим монго и смотрим на конфиги в директории roles
Запуск
Запускаем наш playbook командой
$ ansible-playbook -i inventory/hosts.ini install_mongo.yml -K ##Ключ -К необходим для ввода пароля sudo
В финале получаем большой вывод, в конце которого видим, что Mongo успешно установлена
PLAY [Install MongoDB] ***************************
TASK [Gathering Facts] ***************************
ok: [server1]
TASK [mongo : Install prerequisites] ***************************
ok: [server1]
TASK [mongo : Create keyrings directory] ***************************
ok: [server1]
TASK [mongo : Download MongoDB GPG key] ***************************
changed: [server1]
TASK [mongo : Convert key to gpg format] ***************************
ok: [server1]
TASK [mongo : Clean up temporary key] ***************************
changed: [server1]
TASK [mongo : Add MongoDB repository] ***************************
ok: [server1]
TASK [mongo : Update package cache] ***************************
ok: [server1]
TASK [mongo : Install MongoDB] ***************************
ok: [server1]
TASK [mongo : Create MongoDB data directory] ***************************
ok: [server1]
TASK [mongo : Create MongoDB log directory] ***************************
ok: [server1]
TASK [mongo : Configure MongoDB] ***************************
ok: [server1]
TASK [mongo : Enable and start MongoDB service] ***************************
ok: [server1]
PLAY RECAP ***************************
server1 : ok=13 changed=2 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
Получилась объемная, но насыщенная статья. Для себя я сделал заметку)
Если есть какие-то советы, пожелания, критика - комментарии открыты!