opensearch
trombik.opensearch
Роль ansible
для управления opensearch
.
Роль находится в бета-версии.
Для пользователей FreeBSD
В примере, а не в самой роли, требуется моя портация
opensearch-dashboards
для FreeBSD, которую можно найти на
trombik/freebsd-ports-opensearch.
Пример использует trombik.opensearch_dashboards
.
Однако, порт и роль зависят от www/node10
, который больше не поддерживается и устарел.
Смотрите Issue 835 для плана обновления.
Для пользователей Debian и CentOS
Роль устанавливает opensearch
из официального архива tar. Это
является временным решением, пока Amazon или дистрибутивы не выпустят пакеты.
Переменные роли, относящиеся к установке из исходников, opensearch_src_*
,
намеренно не задокументированы.
Роль не устанавливает пакет JDK. Вместо этого используется встроенный JDK.
Роль импортирует PGP-ключ в ключевую систему root
из основного проекта для
проверки tar-файла. Если вы знаете, как проверить подписанный файл без импорта
PGP-ключа, дайте мне знать.
Некоторые плагины еще не работают.
Изменения от значений по умолчанию включают:
- файл журнала находится по пути
/var/log/opensearch
- приложение устанавливается в
opensearch_root_dir
. По умолчанию это/usr/local/opensearch-dashboards
- пользователь для запуска приложения —
opensearch
Изменения будут обновлены, когда станет доступен официальный пакет.
Роль загружает официальный tar-архив в opensearch_src_dir
. По умолчанию это /var/dist
. Директория не просто кэш. В
добавок к tar-файлу, она содержит PGP-ключ, файл подписи и файлы для
управления задачами ansible
.
Роль устанавливает файл юнита systemd
для opensearch
. Автор не является
экспертом по systemd
.
Требования
По умолчанию роль использует
trombik.x509_certificate
для управления сертификатами X509. Роль не указывает trombik.x509_certificate
как зависимость, так как TLS не является обязательным.
Переменные роли
Переменная | Описание | Значение по умолчанию |
---|---|---|
opensearch_user |
имя пользователя opensearch |
{{ __opensearch_user }} |
opensearch_group |
имя группы opensearch |
{{ __opensearch_group }} |
opensearch_log_dir |
путь к директории журнала | {{ __opensearch_log_dir }} |
opensearch_db_dir |
путь к директории данных | {{ __opensearch_db_dir }} |
opensearch_scripts_dir |
путь к директории скриптов | {{ __opensearch_scripts_dir }} |
opensearch_plugins_dir |
путь к директории плагинов | {{ __opensearch_plugins_dir }} |
opensearch_plugin_command |
путь к команде opensearch-plugin |
{{ __opensearch_plugin_command }} |
opensearch_plugins |
список плагинов (см. ниже) | [] |
opensearch_service |
имя службы opensearch |
{{ __opensearch_service }} |
opensearch_package |
имя пакета opensearch |
{{ __opensearch_package }} |
opensearch_conf_dir |
путь к директории конфигурации | {{ __opensearch_conf_dir }} |
opensearch_jvm_options |
опции JVM (см. пример playbook) | "" |
opensearch_conf_file |
путь к opensearch.yml |
{{ opensearch_conf_dir }}/opensearch.yml |
opensearch_flags |
дополнительные флаги для скриптов запуска | "" |
opensearch_config |
содержание opensearch.yml |
"" |
opensearch_config_log4j2_properties |
содержание log4j2.properties |
"" |
opensearch_http_host |
адрес или hostname opensearch . этот адрес должен быть доступен с контроллера ansible . Значение используется для доступа к API, поэтому оно должно совпадать с common name сертификата при использовании TLS и включенной проверке удаленного хоста. В противном случае вызовы API в роли не будут выполнены. |
localhost |
opensearch_http_port |
порт прослушивания opensearch . этот порт должен быть доступен с контроллера ansible |
9200 |
opensearch_http_url |
URL интерфейса HTTP | https://{{ opensearch_http_host }}:{{ opensearch_http_port }} |
opensearch_http_auth |
детали аутентификации для доступа к API | {} |
opensearch_java_home |
переменная окружения JAVA_HOME |
{{ __opensearch_java_home }} |
opensearch_extra_plugin_files |
список дополнительных файлов для плагинов | [] |
opensearch_include_role_x509_certificate |
если true, включает trombik.x509_certificate во время выполнения (trombik.x509_certificate должен быть указан в requirements.yml ) |
yes |
opensearch_x509_certificate_vars |
переменная для передачи в trombik.x509_certificate |
{} |
opensearch_wait_for_cluster_status |
ждать, пока статус кластера станет этим значением после запуска сервиса. допустимые значения: red , yellow , green , и false . установить значение false , чтобы отключить |
no |
opensearch_wait_for_cluster_status_timeout |
тайм-аут при ожидании статуса кластера | 10s |
opensearch_wait_for_cluster_status_retry |
количество повторений при ожидании статуса кластера | 3 |
opensearch_plugins
Список плагинов. Элемент списка — это словарь.
Ключ | Описание | Обязательно? |
---|---|---|
name |
имя плагина | да |
src |
источник плагина, обычно URL | нет |
opensearch_extra_plugin_files
Эта переменная представляет собой список файлов для плагинов. Элемент списка — это словарь.
Ключ | Описание | Обязательно? |
---|---|---|
path |
относительный путь к файлу в opensearch_plugins_dir |
да |
type |
yaml или raw . когда тип yaml , значение content обрабатывается как YAML. когда тип raw , значение content используется как есть. когда значение state опущено или present , type должен быть указан. |
нет |
mode |
режим файла | нет |
owner |
владелец файла | нет |
group |
группа файла | нет |
state |
present или absent . present создает файл, absent удаляет файл. значение по умолчанию — present |
нет |
content |
содержание файла (см. также type выше) |
нет |
post_command |
словарь для ansible.builtin.command |
нет |
post_command
— это словарь для выполнения команды после изменения статуса элемента.
Переменная передается в ansible.builtin.command
(не ansible.builtin.shell
).
Он принимает следующие ключи:
Ключ | Описание | Обязательно? |
---|---|---|
cmd |
Команда для выполнения | да |
args |
Словарь для args . В настоящее время поддерживаются chdir , creates и removes . |
нет |
enabled |
Либо yes , либо no . Когда yes , команда выполняется. |
да |
post_command
в основном предназначен для securityadmin.sh
.
Смотрите
Применение изменений с помощью securityadmin.sh
для получения дополнительных деталей. Используйте enabled
, чтобы выполнить securityadmin.sh
на определенном узле.
opensearch_http_auth
Эта переменная представляет собой словарь и используется как учетные данные пользователя при доступе к
API-эндоинтам по opensearch_http_url
.
Ключ | Описание | Обязательно? |
---|---|---|
client_cert |
Путь к открытому ключу клиента в формате PEM . Если это относительный путь, он относителен к рабочему каталогу контроллера ansible , а не к целевой машине. |
нет |
client_key |
Путь к секретному ключу клиента в формате PEM . Если это относительный путь, он относителен к рабочему каталогу контроллера ansible , а не к целевой машине. |
нет |
ca_path |
Путь к открытому ключу CA в формате PEM . Если это относительный путь, он относителен к рабочему каталогу контроллера ansible , а не к целевой машине. |
нет |
url_username |
Имя пользователя для базовой аутентификации | нет |
url_password |
Пароль для базовой аутентификации | нет |
validate_certs |
проверять удаленный сертификат | нет |
Роль передает переменную в
uri
модуль.
ca_path
был добавлен в ansible
версии 2.11. client_cert
и client_key
были добавлены в ansible
версии 2.4. Убедитесь, что ваша версия ansible
поддерживает
данные ключи. В результате вы не можете использовать validate_certs: yes
, когда ваша
версия ansible
старше 2.11 и сертификат не подписан CA из стандартного пакета CA (в большинстве случаев вы хотите, чтобы у вас был собственный CA для
подписания сертификатов из-за финансовых затрат).
Обратите внимание, что вызовы API выполняются с контроллера ansible
. opensearch_http_url
должен быть доступен с контроллера ansible
.
Файлы, на которые указывают client_cert
, client_key
и ca_path
, должны находиться на
контроллере ansible
.
Известные проблемы с opensearch_http_auth
и TLS
opensearch
поддерживает базовую аутентификацию и аутентификацию сертификата клиента TLS. Однако в некоторых конфигурациях вызовы API могут завершаться неудачей.
Краткий ответ: используйте базовую аутентификацию через TLS с ca_path
. Это
единственная конфигурация, которая работает безопасно, как ожидалось.
Чтобы использовать аутентификацию клиента TLS без имени пользователя и пароля, вам нужно
установить validate_certs
в no
. Вот матрица тестирования и результаты.
Метод аутентификации | значение validate_certs |
с ca_path ? |
Результат |
---|---|---|---|
TLS клиентский сертификат | no |
Да | Успех |
TLS клиентский сертификат | no |
Нет | Успех |
TLS клиентский сертификат | yes |
Да | Ошибка |
TLS клиентский сертификат | yes |
Нет | Ошибка (это ожидаемо, так как клиент не может проверить без сертификата CA) |
Базовая | no |
Да | Успех |
Базовая | no |
Нет | Успех |
Базовая | yes |
Да | Успех |
Базовая | yes |
Нет | Ошибка (это ожидаемо, так как клиент не может проверить без сертификата CA) |
Это может быть ошибкой в ansible
uri
модуле, так как curl
работает нормально как при аутентификации клиента TLS, так и при базовой аутентификации через TLS. Для записи использовались следующие команды.
curl -vv --cacert /usr/local/etc/opensearch/root-ca.pem \
--cert /usr/local/etc/opensearch/admin.pem \
--key /usr/local/etc/opensearch/admin-key.pem \
https://localhost:9200
curl -vv --user admin:admin \
--cacert /usr/local/etc/opensearch/root-ca.pem \
https://localhost:9200
Debian
Переменная | Значение по умолчанию |
---|---|
__opensearch_user |
opensearch |
__opensearch_group |
opensearch |
__opensearch_log_dir |
/var/log/opensearch |
__opensearch_db_dir |
/var/lib/opensearch |
__opensearch_package |
opensearch |
__opensearch_conf_dir |
/usr/local/opensearch/config |
__opensearch_root_dir |
/usr/local/opensearch |
__opensearch_scripts_dir |
"" |
__opensearch_plugins_dir |
/usr/local/opensearch/plugins |
__opensearch_plugin_command |
/usr/local/opensearch/bin/opensearch-plugin |
__opensearch_service |
opensearch |
__opensearch_java_home |
/usr/local/opensearch/jdk |
FreeBSD
Переменная | Значение по умолчанию |
---|---|
__opensearch_user |
opensearch |
__opensearch_group |
opensearch |
__opensearch_log_dir |
/var/log/opensearch |
__opensearch_db_dir |
/var/db/opensearch |
__opensearch_package |
textproc/opensearch |
__opensearch_conf_dir |
/usr/local/etc/opensearch |
__opensearch_scripts_dir |
"" |
__opensearch_plugins_dir |
/usr/local/lib/opensearch/plugins |
__opensearch_plugin_command |
/usr/local/lib/opensearch/bin/opensearch-plugin |
__opensearch_service |
opensearch |
__opensearch_java_home |
/usr/local |
RedHat
Переменная | Значение по умолчанию |
---|---|
__opensearch_user |
opensearch |
__opensearch_group |
opensearch |
__opensearch_log_dir |
/var/log/opensearch |
__opensearch_db_dir |
/var/lib/opensearch |
__opensearch_package |
opensearch |
__opensearch_conf_dir |
/usr/local/opensearch/config |
__opensearch_root_dir |
/usr/local/opensearch |
__opensearch_scripts_dir |
"" |
__opensearch_plugins_dir |
/usr/local/opensearch/plugins |
__opensearch_plugin_command |
/usr/local/opensearch/bin/opensearch-plugin |
__opensearch_service |
opensearch |
__opensearch_java_home |
/usr/local/opensearch/jdk |
Зависимости
trombik.x509_certificate
, еслиopensearch_include_role_x509_certificate
истинно
Пример Playbook
Пример для установки:
opensearch
opensearch-dashboards
haproxy
fluentd
haproxy
представляет собой обратный прокси для opensearch-dashboards
. Журналы от haproxy
и демона syslog
отправляются на локальный слушатель fluentd
syslog
. Затем
fluentd
обрабатывает журналы и отправляет их в opensearch
. Шаблон индекса — logstash-*
.
Обратите внимание, что выходной плагин fluentd
для elasticsearch
не поддерживает
opensearch
. Пример обходит эту проблему, установив:
- конкретные версии
fluentd-elasticsearch-plugin
и связанные сelasticsearch
гемы - установив
verify_es_version_at_startup
иdefault_elasticsearch_version
вfluentd.conf
Смотрите Issue 915 для получения дополнительных сведений.
Используйте пользователя admin
с паролем admin
для входа в панели управления.
Для примера кластера смотрите tests/serverspec/cluster.yml.
---
- hosts: localhost
pre_tasks:
- name: Разрешить HTTP порт
ansible.builtin.iptables:
chain: INPUT
destination_port: 80
protocol: tcp
jump: ACCEPT
when: ansible_os_family == 'RedHat'
- name: Включить переадресацию syslog от rsyslog
ansible.builtin.copy:
dest: /etc/rsyslog.d/fluentd.conf
content: |
*.*;syslog;auth,authpriv.none action(
Target="127.0.0.1"
type="omfwd"
Port="1514"
Protocol="udp"
template="RSYSLOG_SyslogProtocol23Format"
)
mode: "0644"
when:
- ansible_os_family == 'Debian' or ansible_os_family == 'RedHat'
register: __register_project_rsyslog_config
- name: Перезапустить rsyslog
ansible.builtin.service:
name: rsyslog
state: restarted
when:
- ansible_os_family == 'Debian' or ansible_os_family == 'RedHat'
- __register_project_rsyslog_config['changed']
- name: Включить переадресацию syslog от syslogd
ansible.builtin.copy:
dest: /etc/syslog.d/fluentd.conf
content: |
*.* @127.0.0.1:1514
mode: "0644"
когда: ansible_os_family == 'FreeBSD'
register: __register_project_syslog_config
- name: Включить syslog rfc5424
ansible.builtin.copy:
dest: /etc/rc.conf.d/syslogd
content: |
syslogd_flags="-s -O rfc5424"
mode: "0644"
когда: ansible_os_family == 'FreeBSD'
register: __register_project_syslog_flags
- name: Перезапустить syslogd
ansible.builtin.service:
name: syslogd
state: restarted
when:
- ansible_os_family == 'FreeBSD'
- __register_project_syslog_config['changed'] or __register_project_syslog_flags['changed']
roles:
- role: trombik.freebsd_pkg_repo
when: ansible_os_family == "FreeBSD"
- name: trombik.apt_repo
when: ansible_os_family == 'Debian'
- name: trombik.redhat_repo
when: ansible_os_family == 'RedHat'
- role: trombik.java
# XXX используется встроенный jdk на Ubuntu и CentOS
when: ansible_os_family == "FreeBSD"
- role: trombik.sysctl
- ansible-role-opensearch
- role: trombik.opensearch_dashboards
- role: trombik.fluentd
- role: trombik.haproxy
vars:
# XXX используйте мой собственный пакет, так как пакет в официальном дереве пакетов
# сломан. обратите внимание, что пакет зависит от node10, который более не поддерживается и имеет
# уязвимости.
freebsd_pkg_repo:
local:
enabled: "true"
url: "http://pkg.i.trombik.org/{{ ansible_distribution_version | regex_replace('\\.') }}{{ ansible_architecture }}-default-default"
mirror_type: none
priority: 100
state: present
os_opensearch_extra_packages:
FreeBSD: []
Debian:
- unzip
RedHat: []
opensearch_extra_packages: "{{ os_opensearch_extra_packages[ansible_os_family] }}"
os_java_packages:
FreeBSD:
- openjdk11
- jq
- vim
- tmux
- p5-ack
Debian:
- openjdk-11-jdk
RedHat:
- java-11-openjdk-devel
java_packages: "{{ os_java_packages[ansible_os_family] }}"
os_sysctl:
FreeBSD:
kern.maxfilesperproc: 65536
security.bsd.unprivileged_mlock: 1
Debian:
# см. https://opensearch.org/docs/latest/opensearch/install/important-settings/
vm.max_map_count: 262144
RedHat:
vm.max_map_count: 262144
sysctl: "{{ os_sysctl[ansible_os_family] }}"
opensearch_wait_for_cluster_status: yellow
os_opensearch_package:
FreeBSD: "{{ __opensearch_package }}"
Debian: "{{ __opensearch_package }}"
RedHat: opensearch-1.13.2
opensearch_package: "{{ os_opensearch_package[ansible_os_family] }}"
os_opensearch_flags:
FreeBSD: ""
Debian: |
ES_PATH_CONF={{ opensearch_conf_dir }}
ES_STARTUP_SLEEP_TIME=5
RedHat: |
ES_PATH_CONF={{ opensearch_conf_dir }}
ES_STARTUP_SLEEP_TIME=5
opensearch_flags: "{{ os_opensearch_flags[ansible_os_family] }}"
os_opensearch_jvm_options:
FreeBSD: ""
Debian: |
# см. opensearch-tar-install.sh
# /usr/bin/getconf CLK_TCK`
-Dclk.tck=100
-Djdk.attach.allowAttachSelf=true
-Djava.security.policy={{ opensearch_root_dir }}/plugins/opensearch-performance-analyzer/pa_config/opensearch_security.policy
RedHat: |
# /usr/bin/getconf CLK_TCK`
-Dclk.tck=100
-Djdk.attach.allowAttachSelf=true
-Djava.security.policy={{ opensearch_root_dir }}/plugins/opensearch-performance-analyzer/pa_config/opensearch_security.policy
os_opensearch_http_auth:
FreeBSD:
url_username: admin
url_password: admin
ca_path: "{{ role_path }}/files/test/certs/root-ca.pem"
validate_certs: yes
Debian:
client_cert: "{{ role_path }}/files/test/certs/admin.pem"
client_key: "{{ role_path }}/files/test/certs/admin-key.pem"
# XXX версия ansible на Ubuntu 2.9.6. как таковой, ca_path
# не может быть использован.
validate_certs: no
RedHat:
client_cert: "{{ role_path }}/files/test/certs/admin.pem"
client_key: "{{ role_path }}/files/test/certs/admin-key.pem"
validate_certs: no
opensearch_http_auth: "{{ os_opensearch_http_auth[ansible_os_family] }}"
opensearch_jvm_options: "{{ lookup('file', 'test/jvm_options') + os_opensearch_jvm_options[ansible_os_family] }}"
opensearch_config:
discovery.type: single-node
network.publish_host: ["10.0.2.15"]
path.data: "{{ opensearch_db_dir }}"
http.port: "{{ opensearch_http_port }}"
path.logs: "{{ opensearch_log_dir }}"
node.data: "true"
http.compression: "true"
network.host:
- "{{ opensearch_http_host }}"
- _site_
cluster.name: testcluster
node.name: testnode
http.cors.enabled: "true"
http.cors.allow-origin: "*"
http.cors.max-age: 86400
http.cors.allow-methods: "OPTIONS, HEAD, GET, POST, PUT, DELETE"
http.cors.allow-headers: "X-Requested-With, Content-Type, Content-Length"
http.cors.allow-credentials: "true"
# _________________________TLS
plugins.security.ssl.transport.pemcert_filepath: node.pem
plugins.security.ssl.transport.pemkey_filepath: node-key.pem
plugins.security.ssl.transport.pemtrustedcas_filepath: root-ca.pem
plugins.security.ssl.transport.enforce_hostname_verification: false
plugins.security.ssl.http.enabled: true
plugins.security.ssl.http.pemcert_filepath: node.pem
plugins.security.ssl.http.pemkey_filepath: node-key.pem
plugins.security.ssl.http.pemtrustedcas_filepath: root-ca.pem
plugins.security.allow_unsafe_democertificates: true
plugins.security.allow_default_init_securityindex: true
plugins.security.authcz.admin_dn:
# XXX используйте другой CN для admin_dn и nodes_dn. когда admin_dn ==
# nodes_dn, это ошибка.
- CN=Admin,O=Internet Widgits Pty Ltd,ST=Some-State,C=AU
plugins.security.nodes_dn:
- CN=localhost,O=Internet Widgits Pty Ltd,ST=Some-State,C=AU
plugins.security.advanced_modules_enabled: false
plugins.security.audit.type: internal_opensearch
plugins.security.enable_snapshot_restore_privilege: true
plugins.security.check_snapshot_restore_write_privileges: true
plugins.security.restapi.roles_enabled: ["all_access", "security_rest_api_access"]
plugins.security.system_indices.enabled: true
plugins.security.system_indices.indices: [".opendistro-alerting-config", ".opendistro-alerting-alert*", ".opendistro-anomaly-results*", ".opendistro-anomaly-detector*", ".opendistro-anomaly-checkpoints", ".opendistro-anomaly-detection-state", ".opendistro-reports-*", ".opendistro-notifications-*", ".opendistro-notebooks", ".opendistro-asynchronous-search-response*"]
plugins.security.disabled: false
cluster.routing.allocation.disk.threshold_enabled: false
project_security_plugin_dir: "{{ opensearch_plugins_dir }}/opensearch-security"
project_securityadmin_bin: "{{ project_security_plugin_dir }}/tools/securityadmin.sh"
project_security_plugin_post_command:
cmd: "{{ project_securityadmin_bin }} -icl -nhnv -cacert {{ opensearch_conf_dir }}/root-ca.pem -cert {{ opensearch_conf_dir }}/admin.pem -key {{ opensearch_conf_dir }}/admin-key.pem"
args:
chdir: "{{ project_security_plugin_dir }}/securityconfig"
enabled: "{% if 1 == 1 %}yes{% else %}no{% endif %}"
opensearch_plugins: []
opensearch_extra_plugin_files:
- path: opensearch-security/securityconfig/action_groups.yml
type: yaml
mode: "0640"
group: "{{ opensearch_user }}"
content: "{{ lookup('file', 'test/securityconfig/action_groups.yml') | from_yaml }}"
post_command: "{{ project_security_plugin_post_command }}"
- path: opensearch-security/securityconfig/audit.yml
type: yaml
mode: "0640"
group: "{{ opensearch_user }}"
content: "{{ lookup('file', 'test/securityconfig/audit.yml') | from_yaml }}"
post_command: "{{ project_security_plugin_post_command }}"
- path: opensearch-security/securityconfig/config.yml
type: yaml
mode: "0640"
group: "{{ opensearch_user }}"
content: "{{ lookup('file', 'test/securityconfig/config.yml') | from_yaml }}"
post_command: "{{ project_security_plugin_post_command }}"
- path: opensearch-security/securityconfig/internal_users.yml
type: yaml
mode: "0640"
group: "{{ opensearch_user }}"
content: "{{ lookup('file', 'test/securityconfig/internal_users.yml') | from_yaml }}"
post_command: "{{ project_security_plugin_post_command }}"
- path: opensearch-security/securityconfig/nodes_dn.yml
type: yaml
mode: "0640"
group: "{{ opensearch_user }}"
content: "{{ lookup('file', 'test/securityconfig/nodes_dn.yml') | from_yaml }}"
post_command: "{{ project_security_plugin_post_command }}"
- path: opensearch-security/securityconfig/roles.yml
type: yaml
mode: "0640"
group: "{{ opensearch_user }}"
content: "{{ lookup('file', 'test/securityconfig/roles.yml') | from_yaml }}"
post_command: "{{ project_security_plugin_post_command }}"
- path: opensearch-security/securityconfig/roles_mapping.yml
type: yaml
mode: "0640"
group: "{{ opensearch_user }}"
content: "{{ lookup('file', 'test/securityconfig/roles_mapping.yml') | from_yaml }}"
post_command: "{{ project_security_plugin_post_command }}"
- path: opensearch-security/securityconfig/tenants.yml
type: yaml
mode: "0640"
group: "{{ opensearch_user }}"
content: "{{ lookup('file', 'test/securityconfig/tenants.yml') | from_yaml }}"
post_command: "{{ project_security_plugin_post_command }}"
- path: opensearch-security/securityconfig/whitelist.yml
type: yaml
mode: "0640"
group: "{{ opensearch_user }}"
content: "{{ lookup('file', 'test/securityconfig/whitelist.yml') | from_yaml }}"
post_command: "{{ project_security_plugin_post_command }}"
opensearch_config_log4j2_properties: "{{ lookup('file', 'test/log4j2_properties') }}"
x509_certificate_debug_log: yes
# XXX эти ключи были созданы с помощью следующих шагов, описанных на:
# https://opensearch.org/docs/latest/security-plugin/configuration/generate-certificates/
#
# вот копия шагов:
#
# Корневой CA
# openssl genrsa -out root-ca-key.pem 2048
# openssl req -new -x509 -sha256 -key root-ca-key.pem -out root-ca.pem
#
# Сертификат администратора
# openssl genrsa -out admin-key-temp.pem 2048
# openssl pkcs8 -inform PEM -outform PEM -in admin-key-temp.pem -topk8 -nocrypt -v1 PBE-SHA1-3DES -out admin-key.pem
# openssl req -new -key admin-key.pem -out admin.csr
# openssl x509 -req -in admin.csr -CA root-ca.pem -CAkey root-ca-key.pem -CAcreateserial -sha256 -out admin.pem
#
# Сертификат узла
# openssl genrsa -out node-key-temp.pem 2048
# openssl pkcs8 -inform PEM -outform PEM -in node-key-temp.pem -topk8 -nocrypt -v1 PBE-SHA1-3DES -out node-key.pem
# openssl req -new -key node-key.pem -out node.csr
# openssl x509 -req -in node.csr -CA root-ca.pem -CAkey root-ca-key.pem -CAcreateserial -sha256 -out node.pem
#
# Удаление временных файлов
# rm admin-key-temp.pem admin.csr node-key-temp.pem node.csr
#
# смотрите файлы/test/certs/Makefile для автоматизации этих шагов.
x509_certificate:
- name: node
state: present
public:
path: "{{ opensearch_conf_dir }}/node.pem"
mode: "0444"
key: "{{ lookup('file', 'test/certs/node.pem') }}"
secret:
path: "{{ opensearch_conf_dir }}/node-key.pem"
owner: "{{ opensearch_user }}"
group: "{{ opensearch_group }}"
mode: "0600"
key: "{{ lookup('file', 'test/certs/node-key.pem') }}"
- name: root-ca
state: present
public:
path: "{{ opensearch_conf_dir }}/root-ca.pem"
key: "{{ lookup('file', 'test/certs/root-ca.pem') }}"
secret:
path: "{{ opensearch_conf_dir }}/root-ca-key.pem"
owner: "{{ opensearch_user }}"
group: "{{ opensearch_group }}"
key: "{{ lookup('file', 'test/certs/root-ca-key.pem') }}"
- name: admin
state: present
public:
path: "{{ opensearch_conf_dir }}/admin.pem"
key: "{{ lookup('file', 'test/certs/admin.pem') }}"
secret:
path: "{{ opensearch_conf_dir }}/admin-key.pem"
owner: "{{ opensearch_user }}"
group: "{{ opensearch_group }}"
key: "{{ lookup('file', 'test/certs/admin-key.pem') }}"
# _____________________________________________opensearch-dashboards
opensearch_dashboards_config:
server.host: "{{ opensearch_dashboards_bind_address }}"
server.port: "{{ opensearch_dashboards_bind_port }}"
server.name: "OpenSearch Dashboards"
# XXX исправьте путь к журналу в пакете FreeBSD
logging.dest: "{% if ansible_os_family == 'FreeBSD' %}/var/log/opensearch_dashboards.log{% else %}{{ opensearch_dashboards_log_file }}{% endif %}"
logging.verbose: true
opensearch.hosts: ["https://localhost:9200"]
path.data: "{{ opensearch_dashboards_data_dir }}"
opensearch.ssl.verificationMode: none
opensearch.username: "kibanaserver"
opensearch.password: "kibanaserver"
opensearch_security.multitenancy.enabled: true
opensearch_security.multitenancy.tenants.preferred: ["Private", "Global"]
opensearch_security.readonly_mode.roles: ["kibana_read_only"]
# Используйте эту настройку, если вы запускаете kibana без https
opensearch_security.cookie.secure: false
# _____________________________________________haproxy
project_backend_host: 127.0.0.1
project_backend_port: 5601
os_haproxy_selinux_seport:
FreeBSD: {}
Debian: {}
RedHat:
ports:
- 80
- 5601
proto: tcp
setype: http_port_t
haproxy_selinux_seport: "{{ os_haproxy_selinux_seport[ansible_os_family] }}"
haproxy_config: |
global
daemon
{% if ansible_os_family != 'RedHat' %}
# увеличьте максимальную длину строки до 65535. это обрезает
# журналы, когда они длиннее этого значения.
log 127.0.0.1:5140 len 65535 format rfc3164 local0 info
{% else %}
# XXX haproxy 1.x не понимает `format`.
log 127.0.0.1:5140 len 65535 local2
log-send-hostname
{% endif %}
{% if ansible_os_family == 'FreeBSD' %}
# Пакет FreeBSD по умолчанию не предоставляет
maxconn 4096
user {{ haproxy_user }}
group {{ haproxy_group }}
{% elif ansible_os_family == 'Debian' %}
chroot {{ haproxy_chroot_dir }}
stats socket /run/haproxy/admin.sock mode 660 level admin expose-fd listeners
stats timeout 30s
user {{ haproxy_user }}
group {{ haproxy_group }}
# Стандартные расположения материалов SSL
ca-base /etc/ssl/certs
crt-base /etc/ssl/private
# См.: https://ssl-config.mozilla.org/#server=haproxy&server-version=2.0.3&config=intermediate
ssl-default-bind-ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384
ssl-default-bind-ciphersuites TLS_AES_128_GCM_SHA256:TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256
ssl-default-bind-options ssl-min-ver TLSv1.2 no-tls-tickets
{% elif ansible_os_family == 'OpenBSD' %}
maxconn 1024
chroot {{ haproxy_chroot_dir }}
uid 604
gid 604
pidfile /var/run/haproxy.pid
{% elif ansible_os_family == 'RedHat' %}
chroot /var/lib/haproxy
pidfile /var/run/haproxy.pid
maxconn 4000
user haproxy
group haproxy
daemon
{% endif %}
defaults
log global
mode http
timeout connect 5s
timeout client 10s
timeout server 10s
retries 3
maxconn 2000
{% if ansible_os_family == 'Debian' %}
errorfile 400 /etc/haproxy/errors/400.http
errorfile 403 /etc/haproxy/errors/403.http
errorfile 408 /etc/haproxy/errors/408.http
errorfile 500 /etc/haproxy/errors/500.http
errorfile 502 /etc/haproxy/errors/502.http
errorfile 503 /etc/haproxy/errors/503.http
errorfile 504 /etc/haproxy/errors/504.http
{% elif ansible_os_family == 'OpenBSD' %}
option redispatch
{% endif %}
frontend http-in
bind *:80
default_backend servers
unique-id-format %{+X}o\ %ci:%cp_%fi:%fp_%Ts_%rt:%pid
{% if ansible_os_family != 'RedHat' %}
http-request capture req.fhdr(Host) len 128
http-request capture req.fhdr(Referer) len 1024
http-request capture req.fhdr(User-Agent) len 1024
http-request capture req.fhdr(Accept) len 1024
{% else %}
capture request header Host len 128
capture request header Referer len 1024
capture request header User-Agent len 1024
capture request header Accept len 1024
{% endif %}
# кастомный формат журнала в JSON.
{% if ansible_os_family != 'RedHat' %}
log-format '{"bytes_read":%B}'
{% else %}
# XXX haproxy для CentOS 1.x. эта версия не понимает
# HM, `http-request capture` и другие. используйте упрощенную версию JSON
# лога. формат лога 1.x не понимает одинарных кавычек.
# пробелы необходимо экранировать.
log-format {"bytes_read":%B,"hostname":"%H","unique-id":"%ID","status_code":%ST,"gmt_date_time":"%T","timestamp":%Ts,"bytes_uploaded":%U,"backend_name":"%b","beconn":%bc,"backend_queue":%bq,"client_ip":"%ci","client_port":%cp,"frontend_name":"%f","frontend_ip":"%fi","frontend_port":%fp,"ssl":{"ciphers":"%sslc","version":"%sslv"},"request":{"headers":"%hr"}}
{% endif %}
backend servers
option forwardfor
server server1 {{ project_backend_host }}:{{ project_backend_port }} maxconn 32 check
os_haproxy_flags:
FreeBSD: |
haproxy_config="{{ haproxy_conf_file }}"
#haproxy_flags="-q -f ${haproxy_config} -p ${pidfile}"
Debian: |
#CONFIG="/etc/haproxy/haproxy.cfg"
#EXTRAOPTS="-de -m 16"
OpenBSD: ""
RedHat: |
OPTIONS=""
haproxy_flags: "{{ os_haproxy_flags[ansible_os_family] }}"
# _____________________________________________fluentd
fluentd_system_config: |
log_level debug
suppress_config_dump
fluentd_configs:
input_udp_1514:
enabled: yes
config: |
<source>
@type syslog
@label @forward
port 1514
bind 127.0.0.1
tag syslog
severity_key severity
<parse>
message_format rfc5424
with_priority true
</parse>
</source>
input_udp_5140:
enabled: true
config: |
<source>
@type syslog
@label @haproxy
port 5140
bind 127.0.0.1
tag haproxy
severity_key severity
<parse>
message_format rfc3164
</parse>
</source>
<label @haproxy>
<filter *.*.info>
@type parser
<parse>
@type json
json_parser json
time_type string
time_key gmt_date_time
time_format %d/%b/%Y:%H:%M:%S %z
</parse>
key_name message
reserve_data false
replace_invalid_sequence true
</filter>
<match **>
@type relabel
@label @forward
</match>
</label>
outout_default:
enabled: yes
config: |
<label @forward>
<match **>
@type elasticsearch
host localhost
port 9200
scheme https
ssl_version TLSv1_2
user "logstash"
password "logstash"
with_transporter_log true
ca_file {{ opensearch_conf_dir }}/root-ca.pem
ssl_verify true
logstash_format true
verify_es_version_at_startup false
default_elasticsearch_version 7
<buffer>
timekey 1d
timekey_use_utc true
timekey_wait 10m
</buffer>
</match>
</label>
fluentd_gems:
- name: elasticsearch-transport
version: 7.13.3
state: present
- name: elasticsearch-api
version: 7.13.3
state: present
- name: elasticsearch
version: 7.13.3
state: present
- name: fluent-plugin-elasticsearch
version: 5.1.0
state: present
os_fluentd_flags:
FreeBSD: |
fluentd_flags="-p {{ fluentd_plugin_dir }} --log {{ fluentd_log_file }}"
Debian: |
TD_AGENT_LOG_FILE="{{ fluentd_log_file }}"
TD_AGENT_OPTIONS="-p {{ fluentd_plugin_dir }}"
STOPTIMEOUT=180
RedHat: |
TD_AGENT_LOG_FILE="{{ fluentd_log_file }}"
TD_AGENT_OPTIONS=""
OpenBSD: "--daemon /var/run/fluentd/fluentd.pid --config {{ fluentd_config_file }} -p {{ fluentd_plugin_dir }} --log {{ fluentd_log_file }}"
fluentd_flags: "{{ os_fluentd_flags[ansible_os_family] }}"
# _____________________________________________apt
apt_repo_keys_to_add:
- https://packages.treasuredata.com/GPG-KEY-td-agent
apt_repo_to_add:
- "deb http://packages.treasuredata.com/4/ubuntu/{{ ansible_distribution_release }}/ {{ ansible_distribution_release }} contrib"
# _____________________________________________redhat_repo
redhat_repo:
treasuredata:
baseurl: http://packages.treasuredata.com/4/redhat/$releasever/$basearch
gpgkey: https://packages.treasuredata.com/GPG-KEY-td-agent
Лицензия
Copyright (c) 2019 Tomoyuki Sakurai <[email protected]>
Разрешение на использование, копирование, модификацию и распространение этого программного обеспечения для любых
целей, с или без платы, настоящим предоставляется, при условии, что вышеуказанное
уведомление об авторских правах и это уведомление о разрешении появляются во всех копиях.
ДАННОЕ ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ ПРЕДОСТАВЛЯЕТСЯ "КАК ЕСТЬ", И АВТОР ОТКАЗЫВАЕТСЯ ОТ ВСЕХ ГАРАНТИЙ
ПО ОТНОШЕНИЮ К ЭТОМУ ПРОГРАММНОМУ ОБЕСПЕЧЕНИЮ, ВКЛЮЧАЯ ВСЕ ПОДРАЗУМЕВАЕМЫЕ ГАРАНТИИ
КОММЕРЧЕСКОГО КАЧЕСТВА И ПРИГОДНОСТИ ДЛЯ ЦЕЛИ. В НИКАКОМ СЛУЧАЕ АВТОР НЕ НОСИТ ОТВЕТСТВЕННОСТИ ЗА
ЛЮБЫЕ СПЕЦИАЛЬНЫЕ, ПРОМЫШЛЕННЫЕ, ИЛИ ПОСЛЕДУЮЩИЕ УБЫТКИ, ИЛИ ЛЮБЫЕ УБЫТКИ,
ПРОИСХОДЯЩИЕ В РЕЗУЛЬТАТЕ ПОТЕРИ ИСПОЛЬЗОВАНИЯ, ДАННЫХ ИЛИ ПРИБЫЛИ, НУЖНО ОХРАНЯТЬ МЕТОДОМ ИЗВЛЕЧЕНИЯ,
НЕГЛИГЕНТНОСТИ ИЛИ ДРУГИХ НАРУШЕНИЙ ПРАВИЛ.
Информация об авторе
Tomoyuki Sakurai y@trombik.org
Этот README был создан с помощью qansible
ansible-galaxy install trombik/ansible-role-opensearch