Wazuh через Ansible - автоматизация развертывания
Ansible позволяет автоматизировать установку и настройку всех компонентов Wazuh 4.14 на произвольном количестве хостов. Официальный репозиторий wazuh-ansible содержит роли для индексатора, сервера, дашборда и агентов с поддержкой как одноузловой, так и многоузловой архитектуры.
Предварительные требования
Управляющий хост (Ansible controller)
- Ansible 2.12 или выше
- Python 3.9+
- SSH-доступ к целевым хостам
- Привилегии sudo на целевых хостах
Проверка версии Ansible:
ansible --versionЦелевые хосты
- 64-битная ОС из списка поддерживаемых
- Доступ в интернет для загрузки пакетов Wazuh (или офлайн-репозиторий )
- Открытые порты: 1514, 1515, 9200, 443, 55000
Установка коллекции
Установите официальные роли Wazuh через Ansible Galaxy:
ansible-galaxy collection install wazuh.wazuhИли клонируйте репозиторий:
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:
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:
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: truePlaybook для одноузловой установки
Файл playbooks/wazuh-single-node.yml:
- 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:
ansible-playbook -i inventory/single-node.yml playbooks/wazuh-single-node.ymlPlaybook для многоузловой установки
Файл playbooks/wazuh-multi-node.yml:
- 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"Запуск:
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:
- 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"Регистрация с авторизацией по паролю
На менеджере активируйте авторизацию агентов по паролю:
- 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"Проверка регистрации
ansible wazuh_manager -i inventory/multi-node.yml -m shell \
-a "/var/ossec/bin/agent_control -l"Пользовательская конфигурация
Добавление пользовательских правил
- 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Настройка интеграций
- 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 не может подключиться к целевому хосту.
Решение:
- Проверьте SSH-доступ вручную:
ssh deploy@192.168.1.10Убедитесь, что SSH-ключ добавлен в
authorized_keysна целевом хостеПроверьте конфигурацию в
ansible.cfg:
[defaults]
host_key_checking = False
timeout = 30Ошибка установки пакетов
Симптомы: роль завершается с ошибкой при установке пакетов Wazuh.
Решение:
- Проверьте доступность репозитория Wazuh с целевого хоста:
curl -s https://packages.wazuh.com/4.x/apt/ | head -5Убедитесь, что GPG-ключ репозитория установлен
Для изолированных сетей настройте офлайн-репозиторий
Кластер индексатора не формируется
Симптомы: узлы индексатора запускаются, но не объединяются в кластер.
Решение:
Проверьте корректность
indexer_discovery_seed_hosts- должны быть указаны IP-адреса всех узловУбедитесь, что порт 9300 открыт между узлами
Проверьте, что
indexer_cluster_initial_master_nodesсодержит имена всех узлов
Агент не регистрируется
Симптомы: агент установлен, но не отображается в списке.
Решение:
- Проверьте доступность менеджера с хоста агента:
telnet 192.168.1.20 1515Если используется авторизация по паролю, убедитесь, что пароли совпадают на менеджере и агенте
Проверьте логи агента:
tail -50 /var/ossec/logs/ossec.log