← Назад к вопросам

Опиши структуру проекта Ansible

2.0 Middle🔥 181 комментариев
#Ansible и управление конфигурацией#CI/CD и автоматизация

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

🐱
deepseek-v3.2PrepBro AI6 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Структура проекта Ansible для крупных инфраструктур

Создание эффективной и масштабируемой структуры проекта Ansible является критически важным для управления сложными инфраструктурами. Правильная организация обеспечивает повторное использование кода, ясность, безопасность и легкость сопровождения. Ниже представлена детализированная структура, основанная на лучших практиках и реальном опыте.

1. Базовая организация (Top-Level Directory)

Проект обычно организуется как директория с контролем версий (например, Git), содержащая следующие ключевые элементы:

ansible-project/
├── ansible.cfg              # Локальная конфигурация Ansible
├── inventory/               # Директория для инвентаризации (динамической и статической)
├── group_vars/              # Переменные, специфичные для групп хостов
├── host_vars/               # Переменные, специфичные для отдельных хостов
├── playbooks/               # Основные плейбуки, выполняющие высокоуровневые задачи
├── roles/                   # Роли — основная единица повторного использования
├── collections/             # Коллекции Ansible (если используются)
├── plugins/                 # Кастомные плагины (module, inventory, filter)
├── files/                   # Статические файлы для передачи на управляемые узлы
├── templates/               # Jinja2 шаблоны для динамической генерации файлов
├── vars/                    # Глобальные переменные (альтернатива или дополнение к group_vars)
├── tasks/                   # Общие задачи, которые не являются полноценными ролями
├── handlers/                # Общие обработчики (handlers)
└── requirements.yml         # Файл зависимостей для ролей и коллекций

2. Ключевые компоненты и их назначение

ansible.cfg

Локальный файл конфигурации, который переопределяет глобальные настройки. Указывает пути к инвентаризации, ролям, библиотеке модулей.

[defaults]
inventory = ./inventory
roles_path = ./roles
library = ./plugins/modules
retry_files_enabled = False
host_key_checking = False

inventory/

Содержит информацию о управляемых узлах (хостах). Поддерживает статические файлы и динамические скрипты.

inventory/
├── production.yml           # Статический инвентарь для Production (в формате YAML)
├── staging.yml              # Статический инвентарь для Staging
├── dynamic/                 # Директория для динамических инвентарей
│   ├── ec2.py               # Скрипт для динамического получения хостов из AWS EC2
│   └── openstack.yml       # Конфигурация для динамического инвентаря OpenStack

Пример статического инвентаря в YAML (production.yml):

all:
  children:
    webservers:
      hosts:
        web01.prod.example.com:
          ansible_host: 192.168.1.10
        web02.prod.example.com:
          ansible_host: 192.168.1.11
    databases:
      hosts:
        db01.prod.example.com:
          ansible_host: общей 192.168.1.20

group_vars/ и host_vars/

Директории для определения переменных на уровне групп и отдельных хостов. Имена файлов должны соответствовать именам групп или хостов.

group_vars/
├── all.yml                  # Переменные для всех хостов (например, NTP серверы)
├── webservers.yml           # Переменные для группы webservers (nginx версия, порты)
├── databases.yml            # Переменные для группы databases (версия PostgreSQL)
host_vars/
├── web01.prod.example.com.yml # Специфичные переменные для хоста web01

Пример group_vars/webservers.yml:

http_port: 80
https_port: 443
nginx_version: "1.18"
server_templates:
  - main.conf
  - security.conf

roles/

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

roles/
├── nginx/                   # Роль для установки и конфигурации Nginx
│   ├── tasks/
│   │   └── main.yml         # Основные задачи роли
│   ├── handlers/
│   │   └── main.yml         # Обработчики (например, reload nginx)
│   ├── files/               # Статические файлы для этой роли
│   ├── templates/           # Jinja2 шаблоны для этой роли
│   ├── vars/
│   │   └── main.yml         # Переменные роли (с низким приоритетом)
│   ├── defaults/
│   │   └── main.yml         # Default переменные (с наименьшим приоритетом)
│   └── meta/
│       └── main.yml         # Метаинформация (зависимости от других ролей)
├── postgresql/              # Роль для управления PostgreSQL
└── common/                  # Общая роль для базовой конфигурации всех серверов

Пример roles/nginx/tasks/main.yml:

- name: Install Nginx package
  apt:
    name: nginx
    state: present
    update_cache: yes

- name: Deploy Nginx configuration template
  template:
    src: nginx.conf.j2
    dest: /etc/nginx/nginx.conf
    owner: root
    group: root
    mode: '0644'
  notify:
    - Reload Nginx service

playbooks/

Основные плейбуки, которые вызывают роли и выполняют комплексные задачи (например, развертывание всего приложения).

playbooks/
├── site.yml                 # Основной плейбук для всей инфраструктуры
├── deploy-web.yml           # Плейбук для развертывания веб-серверов
├── deploy-db.yml            # Плейбук для развертывания баз данных
├── maintenance.yml          # Плейбук для задач обслуживания (обновления, бэкапы)
└── provisioning.yml         # Плейбук для первоначальной подготовки серверов

Пример playbooks/deploy-web.yml:

- name: Deploy and configure web servers
  hosts: webservers
  become: yes
  vars_files:
    - ../group_vars/webservers.yml
  roles:
    - common               # Общая базовая конфигурация (SSH, users, monitoring)
    - nginx                # Установка и конфигурация Nginx

3. Дополнительные директории для расширения функциональности

collections/ и requirements.yml

Для работы с Ansible Collections — официальными и сторонними наборыми ролей, модулей и плагинов. requirements.yml определяет зависимости.

collections:
  - name: ansible.posix
    version: 1.4.0
  - name: community.general
    version: 5.8.0
roles:
  - src: https://github.com/geerlingguy/ansible-role-nginx
    version: master
    name: geerlingguy.nginx

plugins/

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

plugins/
├── modules/
│   └── custom_cloud_module.py  # Кастомный модуль для управления ресурсами облака
├── inventory/
│   └── custom_inventory.py     # Кастомный динамический инвентарь
└── filter/
    └── custom_filters.py       # Кастомные Jinja2 фильтры

4. Рекомендации по организации для масштабирования

  • Разделение по окружениям: Используйте разные инвентари (production, staging, development) и соответствующие group_vars (например, group_vars/production/webservers.yml).
  • Использование ролей: Максимально дробите логику на роли. Роли должны быть независимыми и повторно используемыми.
  • Контроль переменных: Определяйте переменные в правильных местах согласно приоритету: defaults в роли → vars в роли/плейбуке → group_varshost_varsextra_vars (при запуске).
  • Документация: Включите README.md в корень проекта и в каждую роль для описания назначения и использования.
  • Тестирование: Организуйте директории tests/ внутри ролей для Molecule или других тестовых сценариев.

Такая структура обеспечивает гибкость, читаемость и готовность к масштабированию, позволяя эффективно управлять инфраструктурами от десятков до тысяч узлов.