trombik.opensearch

trombik.opensearch

Rola ansible do zarządzania opensearch.

Rola jest w wersji beta.

Dla użytkowników FreeBSD

Przykład, a nie sama rola, wymaga mojego własnego portu opensearch-dashboards dla FreeBSD, który można znaleźć na stronie trombik/freebsd-ports-opensearch. Przykład używa trombik.opensearch_dashboards. Jednak port i rola zależą od www/node10, który jest nieaktualny i wycofany.

Zobacz Problem 835 w sprawie planu aktualizacji.

Dla użytkowników Debian i CentOS

Rola instaluje opensearch z oficjalnego archiwum tar. Jest to duża improwizacja, dopóki Amazon lub dystrybucje nie wydadzą pakietów.

Zmienne roli związane z instalacją źródłową, opensearch_src_*, są celowo nieudokumentowane.

Rola nie instaluje pakietu JDK. Zamiast tego używana jest dołączona JDK.

Rola importuje klucz PGP do klucza root z projektu źródłowego w celu weryfikacji pliku tar. Jeśli wiesz, jak zweryfikować podpisany plik bez importowania klucza PGP, daj mi znać.

Niektóre wtyczki jeszcze nie działają.

Zmiany w stosunku do ustawień domyślnych obejmują:

  • plik dziennika znajduje się pod /var/log/opensearch
  • aplikacja jest zainstalowana pod opensearch_root_dir. Domyślna wartość to /usr/local/opensearch-dashboards
  • użytkownik uruchamiający aplikację to opensearch

Zmiany zostaną zaktualizowane, gdy dostępny będzie oficjalny pakiet.

Rola pobiera oficjalne archiwum tar do opensearch_src_dir. Domyślna wartość to /var/dist. Katalog ten nie jest tylko katalogiem pamięci podręcznej. Oprócz pliku tar znajdują się tam klucz PGP, plik z podpisem oraz pliki do kontrolowania zadań ansible.

Rola instaluje plik jednostki systemd dla opensearch. Autor nie jest ekspertem w zakresie systemd.

Wymagania

Domyślnie rola używa trombik.x509_certificate do zarządzania certyfikatami X509. Rola nie wymienia trombik.x509_certificate jako zależności, ponieważ TLS nie jest obowiązkowy.

Zmienne roli

Zmienna Opis Domyślna wartość
opensearch_user nazwa użytkownika opensearch {{ __opensearch_user }}
opensearch_group nazwa grupy opensearch {{ __opensearch_group }}
opensearch_log_dir ścieżka do katalogu dziennika {{ __opensearch_log_dir }}
opensearch_db_dir ścieżka do katalogu danych {{ __opensearch_db_dir }}
opensearch_scripts_dir ścieżka do katalogu skryptów {{ __opensearch_scripts_dir }}
opensearch_plugins_dir ścieżka do katalogu wtyczek {{ __opensearch_plugins_dir }}
opensearch_plugin_command ścieżka do polecenia opensearch-plugin {{ __opensearch_plugin_command }}
opensearch_plugins lista wtyczek (patrz poniżej) []
opensearch_service nazwa usługi opensearch {{ __opensearch_service }}
opensearch_package nazwa pakietu opensearch {{ __opensearch_package }}
opensearch_conf_dir ścieżka do katalogu konfiguracyjnego {{ __opensearch_conf_dir }}
opensearch_jvm_options opcje JVM (patrz przykładowy playbook) ""
opensearch_conf_file ścieżka do opensearch.yml {{ opensearch_conf_dir }}/opensearch.yml
opensearch_flags dodatkowe flagi dla skryptów startowych ""
opensearch_config zawartość opensearch.yml ""
opensearch_config_log4j2_properties zawartość log4j2.properties ""
opensearch_http_host adres lub nazwa hosta opensearch. Ten adres musi być dostępny z kontrolera ansible (hosta, na którym działa ansible). Wartość ta jest używana do dostępu do API, dlatego musi pasować do common name certyfikatu, gdy używane jest TLS, a weryfikacja zdalnego hosta jest włączona. W przeciwnym razie wywołania API w roli zakończą się niepowodzeniem. localhost
opensearch_http_port port nasłuchu opensearch. Ten port musi być dostępny z kontrolera ansible (hosta, na którym działa ansible) 9200
opensearch_http_url URL interfejsu HTTP. Ten URL musi być dostępny z kontrolera ansible (hosta, na którym działa ansible) https://{{ opensearch_http_host }}:{{ opensearch_http_port }}
opensearch_http_auth szczegóły autoryzacji do dostępu do API, zobacz poniżej {}
opensearch_java_home zmienna środowiskowa JAVA_HOME {{ __opensearch_java_home }}
opensearch_extra_plugin_files lista dodatkowych plików dla wtyczek (patrz poniżej) []
opensearch_include_role_x509_certificate jeśli prawda, uwzględnij trombik.x509_certificate podczas play (trombik.x509_certificate musi być wymieniona w requirements.yml) yes
opensearch_x509_certificate_vars zmienna do przekazania do trombik.x509_certificate {}
opensearch_wait_for_cluster_status czekaj na status klastra, aby uzyskać tę wartość po uruchomieniu usługi. Prawidłowa wartość to red, yellow, green, oraz false. Ustaw wartość false, aby wyłączyć no
opensearch_wait_for_cluster_status_timeout limit czasu, gdy czeka się na status klastra, aby uzyskać opensearch_wait_for_cluster_status 10s
opensearch_wait_for_cluster_status_retry ponowienie, gdy czeka się na status klastra, aby uzyskać opensearch_wait_for_cluster_status 3

opensearch_plugins

Jest to lista wtyczek. Element listy to słownik.

Klucz Opis Obowiązkowy?
name nazwa wtyczki tak
src źródło wtyczki, zwykle URL nie

opensearch_extra_plugin_files

Ta zmienna jest listą plików dla wtyczek. Element listy to słownik.

Klucz Opis Obowiązkowy?
path względna ścieżka do pliku z opensearch_plugins_dir tak
type yaml lub raw. gdy typ to yaml, wartość content jest renderowana jako YAML. gdy typ to raw, wartość content jest renderowana bez zmian. gdy wartość state jest pominięta lub present, type musi być określony. nie
mode tryb pliku nie
owner właściciel pliku nie
group grupa pliku nie
state present lub absent. present tworzy plik. absent usuwa plik. domyślnie to present nie
content zawartość pliku (patrz także type powyżej) nie
post_command słownik dla ansible.builtin.command nie

post_command jest słownikiem do uruchomienia polecenia po zmianie statusu elementu. Zmienna jest przekazywana do ansible.builtin.command (nie ansible.builtin.shell).

Akceptuje następujące klucze:

Klucz Opis Obowiązkowy?
cmd Polecenie do uruchomienia tak
args Słownik dla args. Aktualnie wspierane są chdir, creates oraz removes. nie
enabled yes lub no. Gdy yes, polecenie jest wykonywane, a gdy no – nie tak

post_command jest głównie zaprojektowane dla securityadmin.sh. Zobacz Zastosuj zmiany za pomocą securityadmin.sh po więcej szczegółów. Użyj enabled, aby uruchomić securityadmin.sh na konkretnym węźle.

opensearch_http_auth

Ta zmienna jest słownikiem i służy jako poświadczenie użytkownika przy dostępie do punktów końcowych API w opensearch_http_url.

Klucz Opis Obowiązkowy?
client_cert Ścieżka do publicznego klucza klienta w formacie PEM. Gdy jest to ścieżka względna, ścieżka jest względna od katalogu roboczego na kontrolerze ansible, a nie na maszynie docelowej. nie
client_key Ścieżka do prywatnego klucza klienta w formacie PEM. Gdy jest to ścieżka względna, ścieżka jest względna od katalogu roboczego na kontrolerze ansible, a nie na maszynie docelowej. nie
ca_path Ścieżka do publicznego klucza CA w formacie PEM. Gdy jest to ścieżka względna, ścieżka jest względna od katalogu roboczego na kontrolerze ansible, a nie na maszynie docelowej. nie
url_username Nazwa użytkownika do podstawowej autoryzacji nie
url_password Hasło do podstawowej autoryzacji nie
validate_certs weryfikuj zdalny certyfikat nie

Rola przekazuje zmienną do uri modułu.

ca_path został dodany w wersji ansible 2.11. client_cert i client_key zostały dodane w wersji ansible 2.4. Upewnij się, że wersja ansible obsługuje klucze. W związku z tym nie możesz używać validate_certs: yes, gdy masz wersję ansible starszą niż 2.11, a certyfikat nie jest podpisany przez CA w domyślnym pakiecie CA (w większości przypadków chcesz mieć własne CA do podpisywania certyfikatów z powodów finansowych).

Należy pamiętać, że wywołania API są realizowane z kontrolera ansible. opensearch_http_url musi być dostępny z kontrolera ansible.

Pliki, do których wskazują client_cert, client_key oraz ca_path, muszą znajdować się na kontrolerze ansible.

Znane problemy z opensearch_http_auth i TLS

opensearch obsługuje podstawową autoryzację i autoryzację przez certyfikat klienta TLS. Jednak w niektórych konfiguracjach wywołanie API nie działa.

Krótka odpowiedź: użyj podstawowej autoryzacji przez TLS z ca_path. To jest jedyna konfiguracja, która działa zgodnie z oczekiwaniami.

Aby używać autoryzacji klienta TLS bez nazwy użytkownika i hasła, musisz ustawić validate_certs na no. Oto tabela testowa i rezultaty.

Metoda autoryzacji wartość validate_certs z ca_path? Wynik
Certyfikat klienta TLS no Tak Sukces
Certyfikat klienta TLS no Nie Sukces
Certyfikat klienta TLS yes Tak Niepowodzenie
Certyfikat klienta TLS yes Nie Niepowodzenie (to jest oczekiwane, ponieważ klient nie może zweryfikować bez certyfikatu CA)
Podstawowy no Tak Sukces
Podstawowy no Nie Sukces
Podstawowy yes Tak Sukces
Podstawowy yes Nie Niepowodzenie (to jest oczekiwane, ponieważ klient nie może zweryfikować bez certyfikatu CA)

Może to być błąd w module uri ansible, ponieważ curl działa poprawnie zarówno w przypadku certyfikacji klienta TLS, jak i podstawowej autoryzacji przez TLS. Dla rekordu użyto następujących poleceń.

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

Zmienna Domyślna wartość
__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

Zmienna Domyślna wartość
__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

Zmienna Domyślna wartość
__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

Zależności

Przykładowy Playbook

Przykład instalacji:

  • opensearch
  • opensearch-dashboards
  • haproxy
  • fluentd

haproxy jest odwrotnym proxy dla opensearch-dashboards. Dzienniki z haproxy i demona syslog są przesyłane do lokalnego słuchacza fluentd syslog. fluentd przetwarza dzienniki i wysyła je do opensearch. Wzorzec indeksu to logstash-*.

Należy pamiętać, że wtyczka wyjściowa fluentd elasticsearch nie obsługuje opensearch. Przykład obejmuje problem przez:

  • instalację określonych wersji fluentd-elasticsearch-plugin i powiązanych z elasticsearch
  • ustawienie verify_es_version_at_startup oraz default_elasticsearch_version w fluentd.conf

Zobacz Problem 915 po więcej szczegółów.

Użyj użytkownika admin z hasłem admin, aby zalogować się do dashboardów.

Dla przykładu klastra zobacz tests/serverspec/cluster.yml.

---
- hosts: localhost
  pre_tasks:
    - name: Zezwól na port HTTP
      ansible.builtin.iptables:
        chain: INPUT
        destination_port: 80
        protocol: tcp
        jump: ACCEPT
      when: ansible_os_family == 'RedHat'

    - name: Włącz przesyłanie syslog z 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: Restartuj rsyslog
      ansible.builtin.service:
        name: rsyslog
        state: restarted
      when:
        - ansible_os_family == 'Debian' or ansible_os_family == 'RedHat'
        - __register_project_rsyslog_config['changed']

    - name: Włącz przesyłanie syslog z syslogd
      ansible.builtin.copy:
        dest: /etc/syslog.d/fluentd.conf
        content: |
          *.*						@127.0.0.1:1514
        mode: "0644"
      when: ansible_os_family == 'FreeBSD'
      register: __register_project_syslog_config

    - name: Włącz rfc5424 syslog
      ansible.builtin.copy:
        dest: /etc/rc.conf.d/syslogd
        content: |
          syslogd_flags="-s -O rfc5424"
        mode: "0644"
      when: ansible_os_family == 'FreeBSD'
      register: __register_project_syslog_flags

    - name: Restartuj 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 dołączone jdk jest używane na Ubuntu i CentOS
      when: ansible_os_family == "FreeBSD"
    - role: trombik.sysctl
    - ansible-role-opensearch
    - role: trombik.opensearch_dashboards
    - role: trombik.fluentd
    - role: trombik.haproxy
  vars:
    # XXX użyj mojego własnego pakietu, ponieważ pakiet w oficjalnym drzewie pakietów jest
    # uszkodzony. Należy zauważyć, że pakiet zależy od node10, który jest wycofany i ma
    # luki.
    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:
        # zobacz 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: |
        # zobacz 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 wersja ansible na Ubuntu to 2.9.6. dlatego `ca_path`
        # nie może być używane.
        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 użyj różnego CN dla admin_dn i nodes_dn. gdy admin_dn ==
        # nodes_dn, to błąd.
        - 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 te klucze zostały wygenerowane podczas następujących kroków opisanych w:
    # https://opensearch.org/docs/latest/security-plugin/configuration/generate-certificates/
    #
    # oto kopiowanie kroków:
    #
    # Root CA
    # openssl genrsa -out root-ca-key.pem 2048
    # openssl req -new -x509 -sha256 -key root-ca-key.pem -out root-ca.pem
    #
    # Certyfikat administratora
    # 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
    #
    # Certyfikat węzła
    # 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
    #
    # Czyszczenie
    # rm admin-key-temp.pem admin.csr node-key-temp.pem node.csr
    #
    # zobacz pliki/test/certs/Makefile, aby zautomatyzować te kroki.
    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 napraw ścieżkę do logowania w pakiecie 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"]
      # Użyj tej opcji, jeśli uruchamiasz kibana bez 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' %}
        # zwiększ domyślną długość linii 1024 do maksymalnej długości 65535. to przycina
        # dzienniki, gdy są dłuższe niż ta wartość.
        log 127.0.0.1:5140 len 65535 format rfc3164 local0 info
      {% else %}
        # XXX haproxy 1.x nie rozumie `format`.
        log 127.0.0.1:5140 len 65535 local2
        log-send-hostname
      {% endif %}

      {% if ansible_os_family == 'FreeBSD' %}
      # Pakiet FreeBSD nie zapewnia domyślnej
        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 }}

        # Domyślne lokalizacje materiałów SSL
        ca-base /etc/ssl/certs
        crt-base /etc/ssl/private

        # Zobacz: 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 %}
        # niestandardowy format logowania w JSON.
        # aby stworzyć własną strukturę JSON:
        #
        # cd files/test/haproxy
        # ruby ./yaml2logformat.rb log.yml
        #
        # należy zauważyć, że wyjście zawiera pojedynczy cytat. jednak,
        # pojedyncze cytaty muszą zostać usunięte, gdy wersja haproxy jest 1.x.
        # na przykład, gdy wyjście to:
        #
        # log-format '{"bytes_read":%B}'
        #
        # użyj tego zamiast:
        # log-format {"bytes_read":%B}
        #
        # zobacz dostępne zmienne w:
        # 8.2.4. Niestandardowy format logowania
        # https://www.haproxy.com/documentation/hapee/latest/onepage/#8.2.4
        #
      {% if ansible_os_family != 'RedHat' %}
        log-format '{"bytes_read":%B,"hostname":"%H","http":{"method":"%HM","uri":"%HP","query":"%HQ","version":"%HV"},"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":{"host":"%[capture.req.hdr(0),json(utf8ps)]","referer":"%[capture.req.hdr(1),json(utf8ps)]","ua":"%[capture.req.hdr(2),json(utf8ps)]","accept":"%[capture.req.hdr(3),json(utf8ps)]"}}}'
      {% else %}
        # XXX haproxy dla CentOS to 1.x. ta wersja nie rozumie
        # HM, `http-request capture`, i innych. użyj uproszczonej wersji
        # logowania JSON. log-format 1.x nie rozumie pojedynczych cytatów.
        # spacje muszą być escape'owane.
        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
            # uwzględnij ciężarność w zdarzeniu syslog.
            # domyślnie wtyczka wejściowa syslog nie uwzględnia ciężarności.
            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>

          # przetwarzaj dziennik dostępu z haproxy. poziom info zawiera logi dostępu.
          # klucz `message` zawiera zaszyfrowany JSON. jak JSON zawiera wszystkie dane,
          # odrzuc niewłaściwe dane z wydarzenia fluentd za pomocą `reserve_data false`.
          <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: |
          # wysyłaj zdarzenia do elasticsearch. Uwaga, że zdarzenia są wysyłane z
          # `_bulk` API. wysyłanie zdarzeń zajmuje trochę czasu.
          <label @forward>
            <match **>
              @type elasticsearch
              # nie używaj 127.0.0.1 tutaj. użyj CN w certyfikacie
              host localhost
              port 9200
              scheme https
              ssl_version TLSv1_2
              user "logstash"
              password "logstash"
              # XXX musisz utworzyć rolę, aby wysłać dane do indeksu innego niż
              # `logstash`, ponieważ rola `logstash`, która jest statyczna,
              # wcześniej zainstalowana rola, ma dostęp tylko do wzorców indeksów `logstash-*`.
              # logstash_prefix syslog

              # włącz logowanie debugowania w transporterze. zdarzenia wysłane do elasticsearch
              # są logowane w pliku dziennika. prawdopodobnie chcesz ustawić to na
              # false w środowisku produkcyjnym.
              with_transporter_log true
              ca_file {{ opensearch_conf_dir }}/root-ca.pem
              ssl_verify true
              logstash_format true
              # XXX obejście do użycia opensearch z wtyczką wyjściową elasticsearch. zobacz także fluentd_gems poniżej.
              #
              # https://github.com/uken/fluent-plugin-elasticsearch/issues/915
              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

Licencja

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

Zezwolenie na używanie, kopiowanie, modyfikację i dystrybucję tego oprogramowania do wszelkich
celów, z lub bez opłaty, niniejszym udzielane, pod warunkiem, że powyższy
wniosek o copyright i to zezwolenie pojawią się we wszystkich kopiach.

OPROGRAMOWANIE JEST DOSTARCZANE "TAK JEST" I AUTOR ZRZEKA SIĘ WSZYSTKICH GWARANCJI
W ZWIĄZKU Z TYM OPROGRAMOWANIEM, W TYM WSZELKICH IMPLICITNYCH GWARANCJI
HANDLOWOŚCI I PRZYDATNOŚCI. W ŻADNYM WYPADKU AUTOR NIE BĘDZIE ODPOWIEDZIALNY ZA
ŻADNE SZCZEGÓLNE, BEZPOŚREDNIE, POŚREDNIE LUB WTÓRNE SZKODY LUB JAKIEKOLWIEK SZKODY
WYNIKAJĄCE Z UTRATY UŻYTKU, DANYCH LUB ZYSKÓW, CZY TO W WYNIKU DZIAŁANIA UMOWNEGO,
NIEDBALSTWA LUB INNEJ CZYNNOŚCI ZŁEJ, WYNIKAJĄCEJ Z LUB W ZWIĄZKU Z UŻYTKOWANIEM
LUB WYDAJNOŚCIĄ TEGO OPROGRAMOWANIA.

Informacje o autorze

Tomoyuki Sakurai y@trombik.org

Ten README został stworzony przez qansible

O projekcie

Configures opensearch

Zainstaluj
ansible-galaxy install trombik.opensearch
Licencja
isc
Pobrania
156
Właściciel
PGP finger print: 03EB 3D97 5E04 9B0C AB21 93A2 D693 42A9 EFBC 3577 Makerspace and Coliving in Siem Reap, Cambodia: http://info.mkrsgh.org/