# Установка OpenSearch + OpenSearch Dashboards на Rocky Linux 8 и доставка логов с удалённого хоста (Fluent Bit) - Одноузловой OpenSearch (3.x) на Rocky Linux 8. - OpenSearch Dashboards. - Отправка логов со стороннего сервера через Fluent Bit. - Частые ошибки и их исправление (из практики выше). > Все команды ниже выполняются от `root` (или с `sudo`). --- ## 0) Подготовка ОС и сетевых портов Обновите пакеты и задайте системный лимит VMA для OpenSearch: ```bash dnf -y update # Без этого OpenSearch может не пройти bootstrap-checks echo "vm.max_map_count=262144" > /etc/sysctl.d/99-opensearch.conf sysctl --system ``` Откройте порты в firewalld: ```bash # API OpenSearch firewall-cmd --add-port=9200/tcp --permanent # Web-интерфейс Dashboards firewall-cmd --add-port=5601/tcp --permanent firewall-cmd --reload ``` **Что такое `vm.max_map_count`?** — лимит на число областей виртуальной памяти для одного процесса (VMA). Lucene/OpenSearch используют много `mmap()`, поэтому значение должно быть ≥ `262144`. --- ## 1) Установка OpenSearch (3.x, RPM-репозиторий) Подключите официальный репозиторий и установите пакет: ```bash curl -SL https://artifacts.opensearch.org/releases/bundle/opensearch/3.x/opensearch-3.x.repo \ -o /etc/yum.repos.d/opensearch-3.x.repo dnf clean all dnf -y install opensearch ``` Базовая конфигурация `/etc/opensearch/opensearch.yml` для **одного узла**: ```yaml cluster.name: os-cluster node.name: node-1 path.data: /var/lib/opensearch path.logs: /var/log/opensearch network.host: 0.0.0.0 discovery.type: single-node ``` > (Опционально) Настройте heap: создайте `/etc/opensearch/jvm.options.d/heap.options` с: > ``` > -Xms2g > -Xmx2g > ``` > Выберите значение по памяти сервера (обычно ~½ RAM, но не более 32 ГБ на JVM). ### 1.1 Безопасность и пароль администратора Для OpenSearch ≥ 2.12/3.x требуется инициализация плагина безопасности. В лабораторной среде проще включить **demo-конфигурацию** (самоподписанные TLS-сертификаты, пользователи/роли): ```bash export OPENSEARCH_INITIAL_ADMIN_PASSWORD='S0lid-Admin-Password!' bash /usr/share/opensearch/plugins/opensearch-security/tools/install_demo_configuration.sh -y ``` Альтернатива — задать пароль через **override** systemd, без demo-конфига: ```bash # создаст drop-in файл /etc/systemd/system/opensearch.service.d/override.conf systemctl edit opensearch # вставьте в открывшийся файл: # [Service] # Environment="OPENSEARCH_INITIAL_ADMIN_PASSWORD=S0lid-Admin-Password!" # TimeoutStartSec=300s # сохраните, затем: systemctl daemon-reload ``` > `TimeoutStartSec=300s` полезен на первом запуске: инициализация индексов безопасности может занять >90с. ### 1.2 Запуск и проверка ```bash systemctl enable --now opensearch systemctl status opensearch --no-pager ``` Проверка API (самоподписанный TLS → `-k`): ```bash curl -k -u admin:'S0lid-Admin-Password!' https://127.0.0.1:9200 ``` --- ## 2) Установка OpenSearch Dashboards Подключите репозиторий и установите: ```bash curl -SL https://artifacts.opensearch.org/releases/bundle/opensearch-dashboards/3.x/opensearch-dashboards-3.x.repo \ -o /etc/yum.repos.d/opensearch-dashboards-3.x.repo dnf clean all dnf -y install opensearch-dashboards ``` Минимальный корректный YAML `/etc/opensearch-dashboards/opensearch_dashboards.yml`: ```yaml server.host: "0.0.0.0" # ВАЖНО: URL в кавычках! opensearch.hosts: - "https://localhost:9200" # Пока используем самоподписанные сертификаты opensearch.ssl.verificationMode: none # Для первичной проверки можно войти админом (из шага 1.1) opensearch.username: "admin" opensearch.password: "S0lid-Admin-Password!" # Доп. параметры безопасности (необязательно, но удобно) opensearch.requestHeadersWhitelist: - "authorization" - "securitytenant" opensearch_security.multitenancy.enabled: true opensearch_security.multitenancy.tenants.preferred: - "Private" - "Global" opensearch_security.readonly_mode.roles: - "kibana_read_only" # Dashboards по умолчанию использует http — куки без флага secure opensearch_security.cookie.secure: false ``` > Частая ошибка: **дубли ключа** (`duplicated mapping key`) и **URL без кавычек** внутри квадратных скобок. Если видите YAMLException — проверьте дубли и кавычки. Запуск и проверка: ```bash systemctl enable --now opensearch-dashboards systemctl status opensearch-dashboards --no-pager ``` Откройте в браузере: `http://:5601/` и войдите `admin / S0lid-Admin-Password!` (или свой пароль). --- ## 3) Отправка логов со стороннего хоста (Fluent Bit → OpenSearch) ### 3.1 Установка Fluent Bit на удалённом хосте (Rocky/Alma) ```bash cat >/etc/yum.repos.d/fluent-bit.repo <<'REPO' [fluent-bit] name=Fluent Bit baseurl=https://packages.fluentbit.io/rockylinux/$releasever/ gpgcheck=1 gpgkey=https://packages.fluentbit.io/fluentbit.key repo_gpgcheck=1 enabled=1 REPO dnf -y install fluent-bit ``` ### 3.2 (Рекомендовано) Пользователь только для записи логов На сервере OpenSearch создайте роль и пользователя с правами только на индексы `fluentbit-*`: ```bash # Роль curl -k -u admin:'S0lid-Admin-Password!' -X PUT \ "https://:9200/_plugins/_security/api/roles/fluentbit_writer" \ -H 'Content-Type: application/json' -d '{ "index_permissions": [ { "index_patterns": ["fluentbit-*"], "allowed_actions": ["crud","create_index"] } ] }' # Пользователь curl -k -u admin:'S0lid-Admin-Password!' -X PUT \ "https://:9200/_plugins/_security/api/user/fluentbit_ingest" \ -H 'Content-Type: application/json' -d '{ "password": "Str0ng-Ingest-Password!", "attributes": {} }' # Привязка роли curl -k -u admin:'S0lid-Admin-Password!' -X PUT \ "https://:9200/_plugins/_security/api/rolesmapping/fluentbit_writer" \ -H 'Content-Type: application/json' -d '{ "users": ["fluentbit_ingest"] }' ``` ### 3.3 Конфиг Fluent Bit (без inline-комментариев!) Создайте/замените `/etc/fluent-bit/fluent-bit.conf` **строго в формате `ключ<пробелы>значение`**: ```ini [SERVICE] Flush 1 Daemon Off Log_Level info [INPUT] Name systemd Tag host.* Read_From_Tail On [FILTER] Name modify Match host.* Add host ${HOSTNAME} [OUTPUT] Name opensearch Match host.* Host Port 9200 HTTP_User fluentbit_ingest HTTP_Passwd Str0ng-Ingest-Password! tls On tls.verify Off Logstash_Format On Logstash_Prefix fluentbit Suppress_Type_Name On Generate_ID On ``` > Частая ошибка парсинга: **комментарий в конце строки** или знак `=` в конфиге Fluent Bit → `invalid value for boolean property`. Комментарии пишите **на отдельной строке**, начинающейся с `#`. Перезапустите и проверьте: ```bash systemctl restart fluent-bit journalctl -u fluent-bit -n 100 --no-pager ``` Сгенерируйте тестовую запись и убедитесь в доставке: ```bash # на отправляющем хосте: logger -t fbtest "hello from fluent-bit" # на узле OpenSearch (или удалённо): curl -k -u admin:'S0lid-Admin-Password!' \ "https://:9200/fluentbit-*/_search?q=fbtest&pretty" ``` ### 3.4 Настройка Data View в Dashboards 1. Откройте **Dashboards → Management → Data Views (Index Patterns)**. 2. Создайте Data View с шаблоном `fluentbit-*`. 3. В качестве поля времени выберите `@timestamp`. 4. Откройте **Discover** — логи должны отображаться. > Для одноузловой установки можно обнулить реплики по умолчанию, чтобы уйти от `yellow`-статуса индексов: > ```bash > curl -k -u admin:'S0lid-Admin-Password!' -X PUT https://:9200/_index_template/fluentbit \ > -H 'Content-Type: application/json' -d '{ > "index_patterns": ["fluentbit-*"], > "template": { "settings": { "index.number_of_replicas": 0 } } > }' > ``` --- ## 4) Частые проблемы и решения ### 4.1 OpenSearch: `start operation timed out` в systemd **Симптом:** сервис убивается по таймауту. - Задайте пароль админа или примените demo-конфиг (см. §1.1). - Увеличьте таймаут старта через drop-in: ```ini [Service] TimeoutStartSec=300s ``` и `systemctl daemon-reload`. - Проверьте права на каталоги: ```bash chown -R opensearch:opensearch /var/lib/opensearch /var/log/opensearch chmod 750 /var/lib/opensearch /var/log/opensearch ``` - Убедитесь, что `vm.max_map_count >= 262144`. - Проверьте, не занят ли порт 9200: `ss -ltnp | grep :9200`. - Посмотрите логи: `journalctl -u opensearch -n 300 --no-pager` и `tail -n 200 /var/log/opensearch/opensearch.log`. ### 4.2 Dashboards: `YAMLException: duplicated mapping key` **Симптом:** падение при старте, указание на строку с `opensearch.hosts`. - Удалите дубли ключей в `opensearch_dashboards.yml`. - URL **в кавычках**: ```yaml opensearch.hosts: - "https://localhost:9200" ``` - Не используйте табуляции. ### 4.3 Fluent Bit: `invalid value for boolean property` / падение при старте **Симптом:** ошибка в логе о невалидном значении опции (например, `Logstash_Format`). - В конфиге нет знака `=` — только `ключ<пробелы>значение`. - Не ставьте комментарий в той же строке, что и значение. - Для OpenSearch 2.x/3.x включите `Suppress_Type_Name On`. - Проверьте `HTTP_User`/`HTTP_Passwd` и доступность 9200/TLS. --- ## 5) Минимальные команды проверки ```bash # Состояние сервисов systemctl status opensearch --no-pager systemctl status opensearch-dashboards --no-pager systemctl status fluent-bit --no-pager # Быстрая проверка OpenSearch curl -k -u admin:'S0lid-Admin-Password!' https://127.0.0.1:9200 # Поиск тестовой записи из Fluent Bit curl -k -u admin:'S0lid-Admin-Password!' \ "https://:9200/fluentbit-*/_search?q=fbtest&pretty" ``` --- ## 6) Переход к прод-среде (кратко) - Замените demo-сертификаты на свои (CA/сервер/клиент), включите проверку TLS: ```yaml opensearch.ssl.verificationMode: full ``` - Используйте отдельные роли/пользователей вместо `admin`. - Включите и настройте ISM (policy) для индексов логов (`fluentbit-*`). - Уберите `discovery.type: single-node`, настройте кластер discovery и несколько узлов. - Проверьте SELinux/контексты и ограничьте доступ к 5601/9200 сетевыми ACL/файрволом. - Мониторинг JVM heap, дисков (watermarks), отказоустойчивость снапшотами. --- **Готово.** После выполнения шагов у вас будет одноузловой OpenSearch с веб-интерфейсом и приёмом логов с удалённого хоста через Fluent Bit. В случае ошибок — ориентируйтесь на раздел §4 и логи сервисов.