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
trombik.x509_certificategdyopensearch_include_role_x509_certificatejest prawdziwe.
Przykładowy Playbook
Przykład instalacji:
opensearchopensearch-dashboardshaproxyfluentd
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-plugini powiązanych zelasticsearch - ustawienie
verify_es_version_at_startuporazdefault_elasticsearch_versionwfluentd.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
ansible-galaxy install trombik.opensearch