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_certificate
gdyopensearch_include_role_x509_certificate
jest prawdziwe.
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 zelasticsearch
- ustawienie
verify_es_version_at_startup
orazdefault_elasticsearch_version
wfluentd.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