opensearch

trombik.opensearch

Роль ansible для управления opensearch.

Роль находится в бета-версии.

Для пользователей FreeBSD

В примере, а не в самой роли, требуется моя портация opensearch-dashboards для FreeBSD, которую можно найти на trombik/freebsd-ports-opensearch. Пример использует trombik.opensearch_dashboards. Однако, порт и роль зависят от www/node10, который больше не поддерживается и устарел.

Смотрите Issue 835 для плана обновления.

Для пользователей Debian и CentOS

Роль устанавливает opensearch из официального архива tar. Это является временным решением, пока Amazon или дистрибутивы не выпустят пакеты.

Переменные роли, относящиеся к установке из исходников, opensearch_src_*, намеренно не задокументированы.

Роль не устанавливает пакет JDK. Вместо этого используется встроенный JDK.

Роль импортирует PGP-ключ в ключевую систему root из основного проекта для проверки tar-файла. Если вы знаете, как проверить подписанный файл без импорта PGP-ключа, дайте мне знать.

Некоторые плагины еще не работают.

Изменения от значений по умолчанию включают:

  • файл журнала находится по пути /var/log/opensearch
  • приложение устанавливается в opensearch_root_dir. По умолчанию это /usr/local/opensearch-dashboards
  • пользователь для запуска приложения — opensearch

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

Роль загружает официальный tar-архив в opensearch_src_dir. По умолчанию это /var/dist. Директория не просто кэш. В добавок к tar-файлу, она содержит PGP-ключ, файл подписи и файлы для управления задачами ansible.

Роль устанавливает файл юнита systemd для opensearch. Автор не является экспертом по systemd.

Требования

По умолчанию роль использует trombik.x509_certificate для управления сертификатами X509. Роль не указывает trombik.x509_certificate как зависимость, так как TLS не является обязательным.

Переменные роли

Переменная Описание Значение по умолчанию
opensearch_user имя пользователя opensearch {{ __opensearch_user }}
opensearch_group имя группы opensearch {{ __opensearch_group }}
opensearch_log_dir путь к директории журнала {{ __opensearch_log_dir }}
opensearch_db_dir путь к директории данных {{ __opensearch_db_dir }}
opensearch_scripts_dir путь к директории скриптов {{ __opensearch_scripts_dir }}
opensearch_plugins_dir путь к директории плагинов {{ __opensearch_plugins_dir }}
opensearch_plugin_command путь к команде opensearch-plugin {{ __opensearch_plugin_command }}
opensearch_plugins список плагинов (см. ниже) []
opensearch_service имя службы opensearch {{ __opensearch_service }}
opensearch_package имя пакета opensearch {{ __opensearch_package }}
opensearch_conf_dir путь к директории конфигурации {{ __opensearch_conf_dir }}
opensearch_jvm_options опции JVM (см. пример playbook) ""
opensearch_conf_file путь к opensearch.yml {{ opensearch_conf_dir }}/opensearch.yml
opensearch_flags дополнительные флаги для скриптов запуска ""
opensearch_config содержание opensearch.yml ""
opensearch_config_log4j2_properties содержание log4j2.properties ""
opensearch_http_host адрес или hostname opensearch. этот адрес должен быть доступен с контроллера ansible. Значение используется для доступа к API, поэтому оно должно совпадать с common name сертификата при использовании TLS и включенной проверке удаленного хоста. В противном случае вызовы API в роли не будут выполнены. localhost
opensearch_http_port порт прослушивания opensearch. этот порт должен быть доступен с контроллера ansible 9200
opensearch_http_url URL интерфейса HTTP https://{{ opensearch_http_host }}:{{ opensearch_http_port }}
opensearch_http_auth детали аутентификации для доступа к API {}
opensearch_java_home переменная окружения JAVA_HOME {{ __opensearch_java_home }}
opensearch_extra_plugin_files список дополнительных файлов для плагинов []
opensearch_include_role_x509_certificate если true, включает trombik.x509_certificate во время выполнения (trombik.x509_certificate должен быть указан в requirements.yml) yes
opensearch_x509_certificate_vars переменная для передачи в trombik.x509_certificate {}
opensearch_wait_for_cluster_status ждать, пока статус кластера станет этим значением после запуска сервиса. допустимые значения: red, yellow, green, и false. установить значение false, чтобы отключить no
opensearch_wait_for_cluster_status_timeout тайм-аут при ожидании статуса кластера 10s
opensearch_wait_for_cluster_status_retry количество повторений при ожидании статуса кластера 3

opensearch_plugins

Список плагинов. Элемент списка — это словарь.

Ключ Описание Обязательно?
name имя плагина да
src источник плагина, обычно URL нет

opensearch_extra_plugin_files

Эта переменная представляет собой список файлов для плагинов. Элемент списка — это словарь.

Ключ Описание Обязательно?
path относительный путь к файлу в opensearch_plugins_dir да
type yaml или raw. когда тип yaml, значение content обрабатывается как YAML. когда тип raw, значение content используется как есть. когда значение state опущено или present, type должен быть указан. нет
mode режим файла нет
owner владелец файла нет
group группа файла нет
state present или absent. present создает файл, absent удаляет файл. значение по умолчанию — present нет
content содержание файла (см. также type выше) нет
post_command словарь для ansible.builtin.command нет

post_command — это словарь для выполнения команды после изменения статуса элемента. Переменная передается в ansible.builtin.command (не ansible.builtin.shell).

Он принимает следующие ключи:

Ключ Описание Обязательно?
cmd Команда для выполнения да
args Словарь для args. В настоящее время поддерживаются chdir, creates и removes. нет
enabled Либо yes, либо no. Когда yes, команда выполняется. да

post_command в основном предназначен для securityadmin.sh. Смотрите Применение изменений с помощью securityadmin.sh для получения дополнительных деталей. Используйте enabled, чтобы выполнить securityadmin.sh на определенном узле.

opensearch_http_auth

Эта переменная представляет собой словарь и используется как учетные данные пользователя при доступе к API-эндоинтам по opensearch_http_url.

Ключ Описание Обязательно?
client_cert Путь к открытому ключу клиента в формате PEM. Если это относительный путь, он относителен к рабочему каталогу контроллера ansible, а не к целевой машине. нет
client_key Путь к секретному ключу клиента в формате PEM. Если это относительный путь, он относителен к рабочему каталогу контроллера ansible, а не к целевой машине. нет
ca_path Путь к открытому ключу CA в формате PEM. Если это относительный путь, он относителен к рабочему каталогу контроллера ansible, а не к целевой машине. нет
url_username Имя пользователя для базовой аутентификации нет
url_password Пароль для базовой аутентификации нет
validate_certs проверять удаленный сертификат нет

Роль передает переменную в uri модуль.

ca_path был добавлен в ansible версии 2.11. client_cert и client_key были добавлены в ansible версии 2.4. Убедитесь, что ваша версия ansible поддерживает данные ключи. В результате вы не можете использовать validate_certs: yes, когда ваша версия ansible старше 2.11 и сертификат не подписан CA из стандартного пакета CA (в большинстве случаев вы хотите, чтобы у вас был собственный CA для подписания сертификатов из-за финансовых затрат).

Обратите внимание, что вызовы API выполняются с контроллера ansible. opensearch_http_url должен быть доступен с контроллера ansible.

Файлы, на которые указывают client_cert, client_key и ca_path, должны находиться на контроллере ansible.

Известные проблемы с opensearch_http_auth и TLS

opensearch поддерживает базовую аутентификацию и аутентификацию сертификата клиента TLS. Однако в некоторых конфигурациях вызовы API могут завершаться неудачей.

Краткий ответ: используйте базовую аутентификацию через TLS с ca_path. Это единственная конфигурация, которая работает безопасно, как ожидалось.

Чтобы использовать аутентификацию клиента TLS без имени пользователя и пароля, вам нужно установить validate_certs в no. Вот матрица тестирования и результаты.

Метод аутентификации значение validate_certs с ca_path? Результат
TLS клиентский сертификат no Да Успех
TLS клиентский сертификат no Нет Успех
TLS клиентский сертификат yes Да Ошибка
TLS клиентский сертификат yes Нет Ошибка (это ожидаемо, так как клиент не может проверить без сертификата CA)
Базовая no Да Успех
Базовая no Нет Успех
Базовая yes Да Успех
Базовая yes Нет Ошибка (это ожидаемо, так как клиент не может проверить без сертификата CA)

Это может быть ошибкой в ansible uri модуле, так как curl работает нормально как при аутентификации клиента TLS, так и при базовой аутентификации через TLS. Для записи использовались следующие команды.

curl -vv --cacert /usr/local/etc/opensearch/root-ca.pem \
    --cert /usr/local/etc/opensearch/admin.pem \
    --key /usr/local/etc/opensearch/admin-key.pem \
    https://localhost:9200
curl -vv --user admin:admin \
    --cacert /usr/local/etc/opensearch/root-ca.pem \
    https://localhost:9200

Debian

Переменная Значение по умолчанию
__opensearch_user opensearch
__opensearch_group opensearch
__opensearch_log_dir /var/log/opensearch
__opensearch_db_dir /var/lib/opensearch
__opensearch_package opensearch
__opensearch_conf_dir /usr/local/opensearch/config
__opensearch_root_dir /usr/local/opensearch
__opensearch_scripts_dir ""
__opensearch_plugins_dir /usr/local/opensearch/plugins
__opensearch_plugin_command /usr/local/opensearch/bin/opensearch-plugin
__opensearch_service opensearch
__opensearch_java_home /usr/local/opensearch/jdk

FreeBSD

Переменная Значение по умолчанию
__opensearch_user opensearch
__opensearch_group opensearch
__opensearch_log_dir /var/log/opensearch
__opensearch_db_dir /var/db/opensearch
__opensearch_package textproc/opensearch
__opensearch_conf_dir /usr/local/etc/opensearch
__opensearch_scripts_dir ""
__opensearch_plugins_dir /usr/local/lib/opensearch/plugins
__opensearch_plugin_command /usr/local/lib/opensearch/bin/opensearch-plugin
__opensearch_service opensearch
__opensearch_java_home /usr/local

RedHat

Переменная Значение по умолчанию
__opensearch_user opensearch
__opensearch_group opensearch
__opensearch_log_dir /var/log/opensearch
__opensearch_db_dir /var/lib/opensearch
__opensearch_package opensearch
__opensearch_conf_dir /usr/local/opensearch/config
__opensearch_root_dir /usr/local/opensearch
__opensearch_scripts_dir ""
__opensearch_plugins_dir /usr/local/opensearch/plugins
__opensearch_plugin_command /usr/local/opensearch/bin/opensearch-plugin
__opensearch_service opensearch
__opensearch_java_home /usr/local/opensearch/jdk

Зависимости

Пример Playbook

Пример для установки:

  • opensearch
  • opensearch-dashboards
  • haproxy
  • fluentd

haproxy представляет собой обратный прокси для opensearch-dashboards. Журналы от haproxy и демона syslog отправляются на локальный слушатель fluentd syslog. Затем fluentd обрабатывает журналы и отправляет их в opensearch. Шаблон индекса — logstash-*.

Обратите внимание, что выходной плагин fluentd для elasticsearch не поддерживает opensearch. Пример обходит эту проблему, установив:

  • конкретные версии fluentd-elasticsearch-plugin и связанные с elasticsearch гемы
  • установив verify_es_version_at_startup и default_elasticsearch_version в fluentd.conf

Смотрите Issue 915 для получения дополнительных сведений.

Используйте пользователя admin с паролем admin для входа в панели управления.

Для примера кластера смотрите tests/serverspec/cluster.yml.

---
- hosts: localhost
  pre_tasks:
    - name: Разрешить HTTP порт
      ansible.builtin.iptables:
        chain: INPUT
        destination_port: 80
        protocol: tcp
        jump: ACCEPT
      when: ansible_os_family == 'RedHat'

    - name: Включить переадресацию syslog от rsyslog
      ansible.builtin.copy:
        dest: /etc/rsyslog.d/fluentd.conf
        content: |
          *.*;syslog;auth,authpriv.none action(
            Target="127.0.0.1"
            type="omfwd"
            Port="1514"
            Protocol="udp"
            template="RSYSLOG_SyslogProtocol23Format"
          )
        mode: "0644"
      when:
        - ansible_os_family == 'Debian' or ansible_os_family == 'RedHat'
      register: __register_project_rsyslog_config

    - name: Перезапустить rsyslog
      ansible.builtin.service:
        name: rsyslog
        state: restarted
      when:
        - ansible_os_family == 'Debian' or ansible_os_family == 'RedHat'
        - __register_project_rsyslog_config['changed']

    - name: Включить переадресацию syslog от syslogd
      ansible.builtin.copy:
        dest: /etc/syslog.d/fluentd.conf
        content: |
          *.*						@127.0.0.1:1514
        mode: "0644"
      когда: ansible_os_family == 'FreeBSD'
      register: __register_project_syslog_config

    - name: Включить syslog rfc5424
      ansible.builtin.copy:
        dest: /etc/rc.conf.d/syslogd
        content: |
          syslogd_flags="-s -O rfc5424"
        mode: "0644"
      когда: ansible_os_family == 'FreeBSD'
      register: __register_project_syslog_flags

    - name: Перезапустить syslogd
      ansible.builtin.service:
        name: syslogd
        state: restarted
      when:
        - ansible_os_family == 'FreeBSD'
        - __register_project_syslog_config['changed'] or __register_project_syslog_flags['changed']
  roles:
    - role: trombik.freebsd_pkg_repo
      when: ansible_os_family == "FreeBSD"
    - name: trombik.apt_repo
      when: ansible_os_family == 'Debian'
    - name: trombik.redhat_repo
      when: ansible_os_family == 'RedHat'
    - role: trombik.java
      # XXX используется встроенный jdk на Ubuntu и CentOS
      when: ansible_os_family == "FreeBSD"
    - role: trombik.sysctl
    - ansible-role-opensearch
    - role: trombik.opensearch_dashboards
    - role: trombik.fluentd
    - role: trombik.haproxy
  vars:
    # XXX используйте мой собственный пакет, так как пакет в официальном дереве пакетов
    # сломан. обратите внимание, что пакет зависит от node10, который более не поддерживается и имеет
    # уязвимости.
    freebsd_pkg_repo:
      local:
        enabled: "true"
        url: "http://pkg.i.trombik.org/{{ ansible_distribution_version | regex_replace('\\.') }}{{ ansible_architecture }}-default-default"
        mirror_type: none
        priority: 100
        state: present
    os_opensearch_extra_packages:
      FreeBSD: []
      Debian:
        - unzip
      RedHat: []
    opensearch_extra_packages: "{{ os_opensearch_extra_packages[ansible_os_family] }}"
    os_java_packages:
      FreeBSD:
        - openjdk11
        - jq
        - vim
        - tmux
        - p5-ack
      Debian:
        - openjdk-11-jdk
      RedHat:
        - java-11-openjdk-devel
    java_packages: "{{ os_java_packages[ansible_os_family] }}"
    os_sysctl:
      FreeBSD:
        kern.maxfilesperproc: 65536
        security.bsd.unprivileged_mlock: 1
      Debian:
        # см. https://opensearch.org/docs/latest/opensearch/install/important-settings/
        vm.max_map_count: 262144
      RedHat:
        vm.max_map_count: 262144
    sysctl: "{{ os_sysctl[ansible_os_family] }}"
    opensearch_wait_for_cluster_status: yellow
    os_opensearch_package:
      FreeBSD: "{{ __opensearch_package }}"
      Debian: "{{ __opensearch_package }}"
      RedHat: opensearch-1.13.2
    opensearch_package: "{{ os_opensearch_package[ansible_os_family] }}"
    os_opensearch_flags:
      FreeBSD: ""
      Debian: |
        ES_PATH_CONF={{ opensearch_conf_dir }}
        ES_STARTUP_SLEEP_TIME=5
      RedHat: |
        ES_PATH_CONF={{ opensearch_conf_dir }}
        ES_STARTUP_SLEEP_TIME=5
    opensearch_flags: "{{ os_opensearch_flags[ansible_os_family] }}"
    os_opensearch_jvm_options:
      FreeBSD: ""
      Debian: |
        # см. opensearch-tar-install.sh
        # /usr/bin/getconf CLK_TCK`
        -Dclk.tck=100
        -Djdk.attach.allowAttachSelf=true
        -Djava.security.policy={{ opensearch_root_dir }}/plugins/opensearch-performance-analyzer/pa_config/opensearch_security.policy
      RedHat: |
        # /usr/bin/getconf CLK_TCK`
        -Dclk.tck=100
        -Djdk.attach.allowAttachSelf=true
        -Djava.security.policy={{ opensearch_root_dir }}/plugins/opensearch-performance-analyzer/pa_config/opensearch_security.policy

    os_opensearch_http_auth:
      FreeBSD:
        url_username: admin
        url_password: admin
        ca_path: "{{ role_path }}/files/test/certs/root-ca.pem"
        validate_certs: yes
      Debian:
        client_cert: "{{ role_path }}/files/test/certs/admin.pem"
        client_key: "{{ role_path }}/files/test/certs/admin-key.pem"
        # XXX версия ansible на Ubuntu 2.9.6. как таковой, ca_path
        # не может быть использован.
        validate_certs: no
      RedHat:
        client_cert: "{{ role_path }}/files/test/certs/admin.pem"
        client_key: "{{ role_path }}/files/test/certs/admin-key.pem"
        validate_certs: no
    opensearch_http_auth: "{{ os_opensearch_http_auth[ansible_os_family] }}"
    opensearch_jvm_options: "{{ lookup('file', 'test/jvm_options') + os_opensearch_jvm_options[ansible_os_family] }}"
    opensearch_config:
      discovery.type: single-node
      network.publish_host: ["10.0.2.15"]
      path.data: "{{ opensearch_db_dir }}"
      http.port: "{{ opensearch_http_port }}"
      path.logs: "{{ opensearch_log_dir }}"
      node.data: "true"
      http.compression: "true"
      network.host:
        - "{{ opensearch_http_host }}"
        - _site_
      cluster.name: testcluster
      node.name: testnode
      http.cors.enabled: "true"
      http.cors.allow-origin: "*"
      http.cors.max-age: 86400
      http.cors.allow-methods: "OPTIONS, HEAD, GET, POST, PUT, DELETE"
      http.cors.allow-headers: "X-Requested-With, Content-Type, Content-Length"
      http.cors.allow-credentials: "true"
      # _________________________TLS
      plugins.security.ssl.transport.pemcert_filepath: node.pem
      plugins.security.ssl.transport.pemkey_filepath: node-key.pem
      plugins.security.ssl.transport.pemtrustedcas_filepath: root-ca.pem
      plugins.security.ssl.transport.enforce_hostname_verification: false
      plugins.security.ssl.http.enabled: true
      plugins.security.ssl.http.pemcert_filepath: node.pem
      plugins.security.ssl.http.pemkey_filepath: node-key.pem
      plugins.security.ssl.http.pemtrustedcas_filepath: root-ca.pem
      plugins.security.allow_unsafe_democertificates: true
      plugins.security.allow_default_init_securityindex: true
      plugins.security.authcz.admin_dn:
        # XXX используйте другой CN для admin_dn и nodes_dn. когда admin_dn ==
        # nodes_dn, это ошибка.
        - CN=Admin,O=Internet Widgits Pty Ltd,ST=Some-State,C=AU
      plugins.security.nodes_dn:
        - CN=localhost,O=Internet Widgits Pty Ltd,ST=Some-State,C=AU

      plugins.security.advanced_modules_enabled: false
      plugins.security.audit.type: internal_opensearch
      plugins.security.enable_snapshot_restore_privilege: true
      plugins.security.check_snapshot_restore_write_privileges: true
      plugins.security.restapi.roles_enabled: ["all_access", "security_rest_api_access"]
      plugins.security.system_indices.enabled: true
      plugins.security.system_indices.indices: [".opendistro-alerting-config", ".opendistro-alerting-alert*", ".opendistro-anomaly-results*", ".opendistro-anomaly-detector*", ".opendistro-anomaly-checkpoints", ".opendistro-anomaly-detection-state", ".opendistro-reports-*", ".opendistro-notifications-*", ".opendistro-notebooks", ".opendistro-asynchronous-search-response*"]

      plugins.security.disabled: false
      cluster.routing.allocation.disk.threshold_enabled: false

    project_security_plugin_dir: "{{ opensearch_plugins_dir }}/opensearch-security"
    project_securityadmin_bin: "{{ project_security_plugin_dir }}/tools/securityadmin.sh"
    project_security_plugin_post_command:
      cmd: "{{ project_securityadmin_bin }} -icl -nhnv -cacert {{ opensearch_conf_dir }}/root-ca.pem -cert {{ opensearch_conf_dir }}/admin.pem -key {{ opensearch_conf_dir }}/admin-key.pem"
      args:
        chdir: "{{ project_security_plugin_dir }}/securityconfig"
      enabled: "{% if 1 == 1 %}yes{% else %}no{% endif %}"

    opensearch_plugins: []
    opensearch_extra_plugin_files:
      - path: opensearch-security/securityconfig/action_groups.yml
        type: yaml
        mode: "0640"
        group: "{{ opensearch_user }}"
        content: "{{ lookup('file', 'test/securityconfig/action_groups.yml') | from_yaml }}"
        post_command: "{{ project_security_plugin_post_command }}"
      - path: opensearch-security/securityconfig/audit.yml
        type: yaml
        mode: "0640"
        group: "{{ opensearch_user }}"
        content: "{{ lookup('file', 'test/securityconfig/audit.yml') | from_yaml }}"
        post_command: "{{ project_security_plugin_post_command }}"
      - path: opensearch-security/securityconfig/config.yml
        type: yaml
        mode: "0640"
        group: "{{ opensearch_user }}"
        content: "{{ lookup('file', 'test/securityconfig/config.yml') | from_yaml }}"
        post_command: "{{ project_security_plugin_post_command }}"
      - path: opensearch-security/securityconfig/internal_users.yml
        type: yaml
        mode: "0640"
        group: "{{ opensearch_user }}"
        content: "{{ lookup('file', 'test/securityconfig/internal_users.yml') | from_yaml }}"
        post_command: "{{ project_security_plugin_post_command }}"
      - path: opensearch-security/securityconfig/nodes_dn.yml
        type: yaml
        mode: "0640"
        group: "{{ opensearch_user }}"
        content: "{{ lookup('file', 'test/securityconfig/nodes_dn.yml') | from_yaml }}"
        post_command: "{{ project_security_plugin_post_command }}"
      - path: opensearch-security/securityconfig/roles.yml
        type: yaml
        mode: "0640"
        group: "{{ opensearch_user }}"
        content: "{{ lookup('file', 'test/securityconfig/roles.yml') | from_yaml }}"
        post_command: "{{ project_security_plugin_post_command }}"
      - path: opensearch-security/securityconfig/roles_mapping.yml
        type: yaml
        mode: "0640"
        group: "{{ opensearch_user }}"
        content: "{{ lookup('file', 'test/securityconfig/roles_mapping.yml') | from_yaml }}"
        post_command: "{{ project_security_plugin_post_command }}"
      - path: opensearch-security/securityconfig/tenants.yml
        type: yaml
        mode: "0640"
        group: "{{ opensearch_user }}"
        content: "{{ lookup('file', 'test/securityconfig/tenants.yml') | from_yaml }}"
        post_command: "{{ project_security_plugin_post_command }}"
      - path: opensearch-security/securityconfig/whitelist.yml
        type: yaml
        mode: "0640"
        group: "{{ opensearch_user }}"
        content: "{{ lookup('file', 'test/securityconfig/whitelist.yml') | from_yaml }}"
        post_command: "{{ project_security_plugin_post_command }}"

    opensearch_config_log4j2_properties: "{{ lookup('file', 'test/log4j2_properties') }}"

    x509_certificate_debug_log: yes
    # XXX эти ключи были созданы с помощью следующих шагов, описанных на:
    # https://opensearch.org/docs/latest/security-plugin/configuration/generate-certificates/
    #
    # вот копия шагов:
    #
    # Корневой CA
    # openssl genrsa -out root-ca-key.pem 2048
    # openssl req -new -x509 -sha256 -key root-ca-key.pem -out root-ca.pem
    #
    # Сертификат администратора
    # openssl genrsa -out admin-key-temp.pem 2048
    # openssl pkcs8 -inform PEM -outform PEM -in admin-key-temp.pem -topk8 -nocrypt -v1 PBE-SHA1-3DES -out admin-key.pem
    # openssl req -new -key admin-key.pem -out admin.csr
    # openssl x509 -req -in admin.csr -CA root-ca.pem -CAkey root-ca-key.pem -CAcreateserial -sha256 -out admin.pem
    #
    # Сертификат узла
    # openssl genrsa -out node-key-temp.pem 2048
    # openssl pkcs8 -inform PEM -outform PEM -in node-key-temp.pem -topk8 -nocrypt -v1 PBE-SHA1-3DES -out node-key.pem
    # openssl req -new -key node-key.pem -out node.csr
    # openssl x509 -req -in node.csr -CA root-ca.pem -CAkey root-ca-key.pem -CAcreateserial -sha256 -out node.pem
    #
    # Удаление временных файлов
    # rm admin-key-temp.pem admin.csr node-key-temp.pem node.csr
    #
    # смотрите файлы/test/certs/Makefile для автоматизации этих шагов.
    x509_certificate:
      - name: node
        state: present
        public:
          path: "{{ opensearch_conf_dir }}/node.pem"
          mode: "0444"
          key: "{{ lookup('file', 'test/certs/node.pem') }}"
        secret:
          path: "{{ opensearch_conf_dir }}/node-key.pem"
          owner: "{{ opensearch_user }}"
          group: "{{ opensearch_group }}"
          mode: "0600"
          key: "{{ lookup('file', 'test/certs/node-key.pem') }}"
      - name: root-ca
        state: present
        public:
          path: "{{ opensearch_conf_dir }}/root-ca.pem"
          key: "{{ lookup('file', 'test/certs/root-ca.pem') }}"
        secret:
          path: "{{ opensearch_conf_dir }}/root-ca-key.pem"
          owner: "{{ opensearch_user }}"
          group: "{{ opensearch_group }}"
          key: "{{ lookup('file', 'test/certs/root-ca-key.pem') }}"
      - name: admin
        state: present
        public:
          path: "{{ opensearch_conf_dir }}/admin.pem"
          key: "{{ lookup('file', 'test/certs/admin.pem') }}"
        secret:
          path: "{{ opensearch_conf_dir }}/admin-key.pem"
          owner: "{{ opensearch_user }}"
          group: "{{ opensearch_group }}"
          key: "{{ lookup('file', 'test/certs/admin-key.pem') }}"

    # _____________________________________________opensearch-dashboards
    opensearch_dashboards_config:
      server.host: "{{ opensearch_dashboards_bind_address }}"
      server.port: "{{ opensearch_dashboards_bind_port }}"
      server.name: "OpenSearch Dashboards"
      # XXX исправьте путь к журналу в пакете FreeBSD
      logging.dest: "{% if ansible_os_family == 'FreeBSD' %}/var/log/opensearch_dashboards.log{% else %}{{ opensearch_dashboards_log_file }}{% endif %}"
      logging.verbose: true
      opensearch.hosts: ["https://localhost:9200"]
      path.data: "{{ opensearch_dashboards_data_dir }}"
      opensearch.ssl.verificationMode: none
      opensearch.username: "kibanaserver"
      opensearch.password: "kibanaserver"
      opensearch_security.multitenancy.enabled: true
      opensearch_security.multitenancy.tenants.preferred: ["Private", "Global"]
      opensearch_security.readonly_mode.roles: ["kibana_read_only"]
      # Используйте эту настройку, если вы запускаете kibana без https
      opensearch_security.cookie.secure: false
    # _____________________________________________haproxy
    project_backend_host: 127.0.0.1
    project_backend_port: 5601
    os_haproxy_selinux_seport:
      FreeBSD: {}
      Debian: {}
      RedHat:
        ports:
          - 80
          - 5601
        proto: tcp
        setype: http_port_t
    haproxy_selinux_seport: "{{ os_haproxy_selinux_seport[ansible_os_family] }}"
    haproxy_config: |
      global
        daemon
      {% if ansible_os_family != 'RedHat' %}
        # увеличьте максимальную длину строки до 65535. это обрезает
        # журналы, когда они длиннее этого значения.
        log 127.0.0.1:5140 len 65535 format rfc3164 local0 info
      {% else %}
        # XXX haproxy 1.x не понимает `format`.
        log 127.0.0.1:5140 len 65535 local2
        log-send-hostname
      {% endif %}


      {% if ansible_os_family == 'FreeBSD' %}
      # Пакет FreeBSD по умолчанию не предоставляет
        maxconn 4096
        user {{ haproxy_user }}
        group {{ haproxy_group }}
      {% elif ansible_os_family == 'Debian' %}
        chroot {{ haproxy_chroot_dir }}
        stats socket /run/haproxy/admin.sock mode 660 level admin expose-fd listeners
        stats timeout 30s
        user {{ haproxy_user }}
        group {{ haproxy_group }}

        # Стандартные расположения материалов SSL
        ca-base /etc/ssl/certs
        crt-base /etc/ssl/private

        # См.: https://ssl-config.mozilla.org/#server=haproxy&server-version=2.0.3&config=intermediate
          ssl-default-bind-ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384
          ssl-default-bind-ciphersuites TLS_AES_128_GCM_SHA256:TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256
          ssl-default-bind-options ssl-min-ver TLSv1.2 no-tls-tickets
      {% elif ansible_os_family == 'OpenBSD' %}
        maxconn 1024
        chroot {{ haproxy_chroot_dir }}
        uid 604
        gid 604
        pidfile /var/run/haproxy.pid
      {% elif ansible_os_family == 'RedHat' %}
        chroot      /var/lib/haproxy
        pidfile     /var/run/haproxy.pid
        maxconn     4000
        user        haproxy
        group       haproxy
        daemon
      {% endif %}

      defaults
        log global
        mode http
        timeout connect 5s
        timeout client 10s
        timeout server 10s
        retries 3
        maxconn 2000
      {% if ansible_os_family == 'Debian' %}
        errorfile 400 /etc/haproxy/errors/400.http
        errorfile 403 /etc/haproxy/errors/403.http
        errorfile 408 /etc/haproxy/errors/408.http
        errorfile 500 /etc/haproxy/errors/500.http
        errorfile 502 /etc/haproxy/errors/502.http
        errorfile 503 /etc/haproxy/errors/503.http
        errorfile 504 /etc/haproxy/errors/504.http
      {% elif ansible_os_family == 'OpenBSD' %}
        option  redispatch
      {% endif %}

      frontend http-in
        bind *:80
        default_backend servers
        unique-id-format %{+X}o\ %ci:%cp_%fi:%fp_%Ts_%rt:%pid
      {% if ansible_os_family != 'RedHat' %}
        http-request capture req.fhdr(Host) len 128
        http-request capture req.fhdr(Referer) len 1024
        http-request capture req.fhdr(User-Agent) len 1024
        http-request capture req.fhdr(Accept) len 1024
      {% else %}
        capture request header Host len 128
        capture request header Referer len 1024
        capture request header User-Agent len 1024
        capture request header Accept len 1024
      {% endif %}
        # кастомный формат журнала в JSON.
      {% if ansible_os_family != 'RedHat' %}
        log-format '{"bytes_read":%B}'
      {% else %}
        # XXX haproxy для CentOS 1.x. эта версия не понимает
        # HM, `http-request capture` и другие. используйте упрощенную версию JSON
        # лога. формат лога 1.x не понимает одинарных кавычек.
        # пробелы необходимо экранировать.
        log-format {"bytes_read":%B,"hostname":"%H","unique-id":"%ID","status_code":%ST,"gmt_date_time":"%T","timestamp":%Ts,"bytes_uploaded":%U,"backend_name":"%b","beconn":%bc,"backend_queue":%bq,"client_ip":"%ci","client_port":%cp,"frontend_name":"%f","frontend_ip":"%fi","frontend_port":%fp,"ssl":{"ciphers":"%sslc","version":"%sslv"},"request":{"headers":"%hr"}}
      {% endif %}

      backend servers
        option forwardfor
        server server1 {{ project_backend_host }}:{{ project_backend_port }} maxconn 32 check

    os_haproxy_flags:
      FreeBSD: |
        haproxy_config="{{ haproxy_conf_file }}"
        #haproxy_flags="-q -f ${haproxy_config} -p ${pidfile}"
      Debian: |
        #CONFIG="/etc/haproxy/haproxy.cfg"
        #EXTRAOPTS="-de -m 16"
      OpenBSD: ""
      RedHat: |
        OPTIONS=""
    haproxy_flags: "{{ os_haproxy_flags[ansible_os_family] }}"

    # _____________________________________________fluentd
    fluentd_system_config: |
      log_level debug
      suppress_config_dump
    fluentd_configs:
      input_udp_1514:
        enabled: yes
        config: |
          <source>
            @type syslog
            @label @forward
            port 1514
            bind 127.0.0.1
            tag syslog
            severity_key severity
            <parse>
              message_format rfc5424
              with_priority true
            </parse>
          </source>

      input_udp_5140:
        enabled: true
        config: |
          <source>
            @type syslog
            @label @haproxy
            port 5140
            bind 127.0.0.1
            tag haproxy
            severity_key severity
            <parse>
              message_format rfc3164
            </parse>
          </source>

          <label @haproxy>
            <filter *.*.info>
              @type parser
              <parse>
                @type json
                json_parser json
                time_type string
                time_key gmt_date_time
                time_format %d/%b/%Y:%H:%M:%S %z
              </parse>
              key_name message
              reserve_data false
              replace_invalid_sequence true
            </filter>
            <match **>
              @type relabel
              @label @forward
            </match>
          </label>

      outout_default:
        enabled: yes
        config: |
          <label @forward>
            <match **>
              @type elasticsearch
              host localhost
              port 9200
              scheme https
              ssl_version TLSv1_2
              user "logstash"
              password "logstash"
              with_transporter_log true
              ca_file {{ opensearch_conf_dir }}/root-ca.pem
              ssl_verify true
              logstash_format true
              verify_es_version_at_startup false
              default_elasticsearch_version 7

              <buffer>
                timekey 1d
                timekey_use_utc true
                timekey_wait 10m
              </buffer>
            </match>
          </label>
    fluentd_gems:
      - name: elasticsearch-transport
        version: 7.13.3
        state: present
      - name: elasticsearch-api
        version: 7.13.3
        state: present
      - name: elasticsearch
        version: 7.13.3
        state: present
      - name: fluent-plugin-elasticsearch
        version: 5.1.0
        state: present

    os_fluentd_flags:
      FreeBSD: |
        fluentd_flags="-p {{ fluentd_plugin_dir }} --log {{ fluentd_log_file }}"
      Debian: |
        TD_AGENT_LOG_FILE="{{ fluentd_log_file }}"
        TD_AGENT_OPTIONS="-p {{ fluentd_plugin_dir }}"
        STOPTIMEOUT=180
      RedHat: |
        TD_AGENT_LOG_FILE="{{ fluentd_log_file }}"
        TD_AGENT_OPTIONS=""
      OpenBSD: "--daemon /var/run/fluentd/fluentd.pid --config {{ fluentd_config_file }} -p {{ fluentd_plugin_dir }} --log {{ fluentd_log_file }}"
    fluentd_flags: "{{ os_fluentd_flags[ansible_os_family] }}"

    # _____________________________________________apt
    apt_repo_keys_to_add:
      - https://packages.treasuredata.com/GPG-KEY-td-agent
    apt_repo_to_add:
      - "deb http://packages.treasuredata.com/4/ubuntu/{{ ansible_distribution_release }}/ {{ ansible_distribution_release }} contrib"
    # _____________________________________________redhat_repo
    redhat_repo:
      treasuredata:
        baseurl: http://packages.treasuredata.com/4/redhat/$releasever/$basearch
        gpgkey: https://packages.treasuredata.com/GPG-KEY-td-agent

Лицензия

Copyright (c) 2019 Tomoyuki Sakurai <[email protected]>

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

ДАННОЕ ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ ПРЕДОСТАВЛЯЕТСЯ "КАК ЕСТЬ", И АВТОР ОТКАЗЫВАЕТСЯ ОТ ВСЕХ ГАРАНТИЙ
ПО ОТНОШЕНИЮ К ЭТОМУ ПРОГРАММНОМУ ОБЕСПЕЧЕНИЮ, ВКЛЮЧАЯ ВСЕ ПОДРАЗУМЕВАЕМЫЕ ГАРАНТИИ
КОММЕРЧЕСКОГО КАЧЕСТВА И ПРИГОДНОСТИ ДЛЯ ЦЕЛИ. В НИКАКОМ СЛУЧАЕ АВТОР НЕ НОСИТ ОТВЕТСТВЕННОСТИ ЗА
ЛЮБЫЕ СПЕЦИАЛЬНЫЕ, ПРОМЫШЛЕННЫЕ, ИЛИ ПОСЛЕДУЮЩИЕ УБЫТКИ, ИЛИ ЛЮБЫЕ УБЫТКИ,
ПРОИСХОДЯЩИЕ В РЕЗУЛЬТАТЕ ПОТЕРИ ИСПОЛЬЗОВАНИЯ, ДАННЫХ ИЛИ ПРИБЫЛИ, НУЖНО ОХРАНЯТЬ МЕТОДОМ ИЗВЛЕЧЕНИЯ,
НЕГЛИГЕНТНОСТИ ИЛИ ДРУГИХ НАРУШЕНИЙ ПРАВИЛ. 

Информация об авторе

Tomoyuki Sakurai y@trombik.org

Этот README был создан с помощью qansible

О проекте

Configures opensearch

Установить
ansible-galaxy install trombik/ansible-role-opensearch
Лицензия
isc
Загрузки
141
Владелец
PGP finger print: 03EB 3D97 5E04 9B0C AB21 93A2 D693 42A9 EFBC 3577 Makerspace and Coliving in Siem Reap, Cambodia: http://info.mkrsgh.org/