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  
  

Получилась объемная, но насыщенная статья. Для себя я сделал заметку)

Если есть какие-то советы, пожелания, критика - комментарии открыты!