# Wazuh через Ansible - автоматизация развертывания

> Развертывание Wazuh 4.14 с Ansible - официальные роли, playbooks для одноузловой и многоузловой установки, регистрация агентов и переменные

Source: https://opennix.org/docs/wazuh/deployment/wazuh-ansible-deployment/


Ansible позволяет автоматизировать установку и настройку всех компонентов Wazuh 4.14 на произвольном количестве хостов. Официальный репозиторий [wazuh-ansible](https://github.com/wazuh/wazuh-ansible) содержит роли для индексатора, сервера, дашборда и агентов с поддержкой как одноузловой, так и многоузловой архитектуры.

## Предварительные требования

### Управляющий хост (Ansible controller)

- Ansible 2.12 или выше
- Python 3.9+
- SSH-доступ к целевым хостам
- Привилегии sudo на целевых хостах

Проверка версии Ansible:

```bash
ansible --version
```

### Целевые хосты

- 64-битная ОС из [списка поддерживаемых](/docs/wazuh/installation/)
- Доступ в интернет для загрузки пакетов Wazuh (или [офлайн-репозиторий](/docs/wazuh/deployment/wazuh-offline-installation/))
- Открытые порты: 1514, 1515, 9200, 443, 55000

### Установка коллекции

Установите официальные роли Wazuh через Ansible Galaxy:

```bash
ansible-galaxy collection install wazuh.wazuh
```

Или клонируйте репозиторий:

```bash
git clone https://github.com/wazuh/wazuh-ansible.git -b v4.14.3
cd wazuh-ansible
```

## Структура ролей

Коллекция `wazuh.wazuh` содержит следующие роли:

| Роль | Назначение |
|---|---|
| `wazuh.wazuh.wazuh_indexer` | Установка и настройка Wazuh Indexer (OpenSearch) |
| `wazuh.wazuh.wazuh_manager` | Установка и настройка Wazuh Manager |
| `wazuh.wazuh.wazuh_dashboard` | Установка и настройка Wazuh Dashboard |
| `wazuh.wazuh.wazuh_agent` | Установка и настройка Wazuh Agent |

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

## Inventory

### Одноузловая конфигурация

Файл `inventory/single-node.yml`:

```yaml
all:
  children:
    wazuh_indexer:
      hosts:
        wazuh-node1:
          ansible_host: 192.168.1.10
          ansible_user: deploy
          ansible_become: true
          indexer_node_name: wazuh-indexer-1

    wazuh_manager:
      hosts:
        wazuh-node1:
          manager_type: master

    wazuh_dashboard:
      hosts:
        wazuh-node1:

    wazuh_agent:
      hosts:
        web-server-1:
          ansible_host: 192.168.1.20
          ansible_user: deploy
          ansible_become: true
        db-server-1:
          ansible_host: 192.168.1.21
          ansible_user: deploy
          ansible_become: true
```

### Многоузловая конфигурация

Файл `inventory/multi-node.yml`:

```yaml
all:
  children:
    wazuh_indexer:
      hosts:
        indexer-1:
          ansible_host: 192.168.1.10
          indexer_node_name: wazuh-indexer-1
        indexer-2:
          ansible_host: 192.168.1.11
          indexer_node_name: wazuh-indexer-2
        indexer-3:
          ansible_host: 192.168.1.12
          indexer_node_name: wazuh-indexer-3
      vars:
        ansible_user: deploy
        ansible_become: true

    wazuh_manager:
      hosts:
        manager-master:
          ansible_host: 192.168.1.20
          manager_type: master
        manager-worker:
          ansible_host: 192.168.1.21
          manager_type: worker
      vars:
        ansible_user: deploy
        ansible_become: true

    wazuh_dashboard:
      hosts:
        dashboard-1:
          ansible_host: 192.168.1.30
      vars:
        ansible_user: deploy
        ansible_become: true

    wazuh_agent:
      hosts:
        app-server-[1:10]:
          ansible_user: deploy
          ansible_become: true
```

## Playbook для одноузловой установки

Файл `playbooks/wazuh-single-node.yml`:

```yaml
- name: Install Wazuh Indexer
  hosts: wazuh_indexer
  roles:
    - role: wazuh.wazuh.wazuh_indexer
      vars:
        indexer_cluster_name: wazuh-cluster
        indexer_node_master: true
        indexer_node_data: true
        indexer_network_host: "0.0.0.0"
        indexer_admin_password: "ChangeMe!SecureP@ss1"

- name: Install Wazuh Manager
  hosts: wazuh_manager
  roles:
    - role: wazuh.wazuh.wazuh_manager
      vars:
        wazuh_manager_config:
          cluster:
            disabled: true
          api:
            bind_addr: "0.0.0.0"

- name: Install Wazuh Dashboard
  hosts: wazuh_dashboard
  roles:
    - role: wazuh.wazuh.wazuh_dashboard
      vars:
        dashboard_server_host: "0.0.0.0"
        dashboard_server_port: 443
        indexer_url: "https://{{ hostvars[groups['wazuh_indexer'][0]]['ansible_host'] }}:9200"
```

Запуск playbook:

```bash
ansible-playbook -i inventory/single-node.yml playbooks/wazuh-single-node.yml
```

## Playbook для многоузловой установки

Файл `playbooks/wazuh-multi-node.yml`:

```yaml
- name: Install Wazuh Indexer cluster
  hosts: wazuh_indexer
  roles:
    - role: wazuh.wazuh.wazuh_indexer
      vars:
        indexer_cluster_name: wazuh-cluster
        indexer_cluster_initial_master_nodes:
          - wazuh-indexer-1
          - wazuh-indexer-2
          - wazuh-indexer-3
        indexer_discovery_seed_hosts:
          - "{{ hostvars['indexer-1']['ansible_host'] }}"
          - "{{ hostvars['indexer-2']['ansible_host'] }}"
          - "{{ hostvars['indexer-3']['ansible_host'] }}"
        indexer_admin_password: "ChangeMe!SecureP@ss1"

- name: Install Wazuh Manager cluster
  hosts: wazuh_manager
  roles:
    - role: wazuh.wazuh.wazuh_manager
      vars:
        wazuh_manager_config:
          cluster:
            disabled: false
            name: wazuh-manager-cluster
            node_name: "{{ inventory_hostname }}"
            node_type: "{{ manager_type }}"
            key: "ChangeThisClusterKey123"
            nodes:
              - "{{ hostvars['manager-master']['ansible_host'] }}"
            port: 1516
            bind_addr: "0.0.0.0"
            hidden: false

- name: Install Wazuh Dashboard
  hosts: wazuh_dashboard
  roles:
    - role: wazuh.wazuh.wazuh_dashboard
      vars:
        dashboard_server_host: "0.0.0.0"
        indexer_url: "https://{{ hostvars[groups['wazuh_indexer'][0]]['ansible_host'] }}:9200"

- name: Install Wazuh Agents
  hosts: wazuh_agent
  roles:
    - role: wazuh.wazuh.wazuh_agent
      vars:
        wazuh_manager_address: "{{ hostvars['manager-master']['ansible_host'] }}"
        wazuh_agent_group: "default"
```

Запуск:

```bash
ansible-playbook -i inventory/multi-node.yml playbooks/wazuh-multi-node.yml
```

## Справочник переменных

### Переменные индексатора

| Переменная | Описание | Значение по умолчанию |
|---|---|---|
| `indexer_cluster_name` | Имя кластера | `wazuh-cluster` |
| `indexer_node_name` | Имя узла | `wazuh-indexer-1` |
| `indexer_node_master` | Роль master | `true` |
| `indexer_node_data` | Роль data | `true` |
| `indexer_network_host` | Адрес привязки | `0.0.0.0` |
| `indexer_http_port` | HTTP-порт | `9200` |
| `indexer_transport_port` | Transport-порт | `9300` |
| `indexer_admin_password` | Пароль admin | `SecretPassword` |
| `indexer_jvm_xms` | JVM Heap min | `1g` |
| `indexer_jvm_xmx` | JVM Heap max | `1g` |

### Переменные менеджера

| Переменная | Описание | Значение по умолчанию |
|---|---|---|
| `wazuh_manager_config.cluster.disabled` | Отключить кластер | `true` |
| `wazuh_manager_config.cluster.name` | Имя кластера | `wazuh` |
| `wazuh_manager_config.cluster.node_type` | Тип узла (master/worker) | `master` |
| `wazuh_manager_config.cluster.key` | Ключ кластера | - |
| `wazuh_manager_config.api.bind_addr` | Адрес привязки API | `0.0.0.0` |
| `wazuh_manager_config.api.port` | Порт API | `55000` |
| `wazuh_manager_authd.enabled` | Включить authd | `true` |
| `wazuh_manager_authd.use_password` | Пароль регистрации | `false` |

### Переменные агента

| Переменная | Описание | Значение по умолчанию |
|---|---|---|
| `wazuh_manager_address` | IP/DNS менеджера | - |
| `wazuh_agent_group` | Группа агента | `default` |
| `wazuh_agent_name` | Имя агента | `{{ inventory_hostname }}` |
| `wazuh_agent_enrollment.enabled` | Авторегистрация | `true` |
| `wazuh_agent_enrollment.auth_pass` | Пароль регистрации | - |

## Регистрация агентов через Ansible

### Массовое развертывание агентов

Для развертывания агентов на группу хостов создайте отдельный playbook:

```yaml
- name: Deploy Wazuh agents
  hosts: wazuh_agent
  roles:
    - role: wazuh.wazuh.wazuh_agent
      vars:
        wazuh_manager_address: 192.168.1.20
        wazuh_agent_group: "{{ group_names | join(',') }}"
        wazuh_agent_enrollment:
          enabled: true
          auth_pass: "AgentEnrollmentPassword"
```

### Регистрация с авторизацией по паролю

На менеджере активируйте авторизацию агентов по паролю:

```yaml
- name: Configure manager for password-based enrollment
  hosts: wazuh_manager
  roles:
    - role: wazuh.wazuh.wazuh_manager
      vars:
        wazuh_manager_authd:
          enabled: true
          use_password: true
          password: "AgentEnrollmentPassword"
```

### Проверка регистрации

```bash
ansible wazuh_manager -i inventory/multi-node.yml -m shell \
  -a "/var/ossec/bin/agent_control -l"
```

## Пользовательская конфигурация

### Добавление пользовательских правил

```yaml
- name: Deploy custom rules
  hosts: wazuh_manager
  tasks:
    - name: Copy custom rules
      copy:
        src: files/local_rules.xml
        dest: /var/ossec/etc/rules/local_rules.xml
        owner: wazuh
        group: wazuh
        mode: "0640"
      notify: restart wazuh-manager

  handlers:
    - name: restart wazuh-manager
      service:
        name: wazuh-manager
        state: restarted
```

### Настройка интеграций

```yaml
- name: Configure Slack integration
  hosts: wazuh_manager
  roles:
    - role: wazuh.wazuh.wazuh_manager
      vars:
        wazuh_manager_config:
          integration:
            - name: slack
              hook_url: "https://hooks.slack.com/services/xxx/yyy/zzz"
              level: 10
              alert_format: json
```

## Решение проблем

### Ошибка подключения SSH

**Симптомы:** Ansible не может подключиться к целевому хосту.

**Решение:**

1. Проверьте SSH-доступ вручную:

```bash
ssh deploy@192.168.1.10
```

2. Убедитесь, что SSH-ключ добавлен в `authorized_keys` на целевом хосте

3. Проверьте конфигурацию в `ansible.cfg`:

```ini
[defaults]
host_key_checking = False
timeout = 30
```

### Ошибка установки пакетов

**Симптомы:** роль завершается с ошибкой при установке пакетов Wazuh.

**Решение:**

1. Проверьте доступность репозитория Wazuh с целевого хоста:

```bash
curl -s https://packages.wazuh.com/4.x/apt/ | head -5
```

2. Убедитесь, что GPG-ключ репозитория установлен

3. Для изолированных сетей настройте [офлайн-репозиторий](/docs/wazuh/deployment/wazuh-offline-installation/)

### Кластер индексатора не формируется

**Симптомы:** узлы индексатора запускаются, но не объединяются в кластер.

**Решение:**

1. Проверьте корректность `indexer_discovery_seed_hosts` - должны быть указаны IP-адреса всех узлов

2. Убедитесь, что порт 9300 открыт между узлами

3. Проверьте, что `indexer_cluster_initial_master_nodes` содержит имена всех узлов

### Агент не регистрируется

**Симптомы:** агент установлен, но не отображается в списке.

**Решение:**

1. Проверьте доступность менеджера с хоста агента:

```bash
telnet 192.168.1.20 1515
```

2. Если используется авторизация по паролю, убедитесь, что пароли совпадают на менеджере и агенте

3. Проверьте логи агента:

```bash
tail -50 /var/ossec/logs/ossec.log
```

## Дополнительные материалы

- [Обзор вариантов развертывания](/docs/wazuh/deployment/)
- [Установка Wazuh](/docs/wazuh/installation/)
- [Развертывание Wazuh через Puppet](/docs/wazuh/deployment/wazuh-puppet-deployment/)
- [Официальный репозиторий wazuh-ansible](https://github.com/wazuh/wazuh-ansible)

