trombik.opensearch

trombik.opensearch

Rol de ansible para gestionar opensearch.

El rol está en versión beta.

Para usuarios de FreeBSD

El ejemplo, no el rol en sí, requiere mi propio puerto de
opensearch-dashboards para FreeBSD, que se puede encontrar en
trombik/freebsd-ports-opensearch.
El ejemplo utiliza trombik.opensearch_dashboards.
Sin embargo, el puerto y el rol dependen de www/node10, que está fuera de soporte y
ha sido descontinuado.

Consulte Issue 835
para el plan de actualización.

Para usuarios de variantes de Debian y CentOS

El rol instala opensearch desde el archivo tar oficial. Esto
es una solución provisional hasta que Amazon o las distribuciones lancen paquetes.

Las variables del rol relacionadas con la instalación desde la fuente, opensearch_src_*, no están
documentadas intencionalmente.

El rol no instala el paquete JDK. En su lugar, se utiliza el JDK incluido.

El rol importa una clave PGP en el llavero de root desde el proyecto de origen para
verificar el archivo tar. Si sabe cómo verificar un archivo firmado sin importar
la clave PGP, hágamelo saber.

Algunos complementos aún no funcionan.

Los cambios respecto a la configuración por defecto incluyen:

  • El archivo de registro está en /var/log/opensearch
  • La aplicación se instala en opensearch_root_dir. El valor por defecto es /usr/local/opensearch-dashboards
  • El usuario que ejecuta la aplicación es opensearch

Los cambios se actualizarán cuando un paquete oficial esté disponible.

El rol descarga el archivo tar oficial en opensearch_src_dir. El
valor por defecto es /var/dist. Este directorio no es solo un caché. Además del
archivo tar, contiene una clave PGP, un archivo de firma y archivos para
controlar las tareas de ansible.

El rol instala un archivo de unidad systemd para opensearch. El autor no es un
experto en systemd de ninguna manera.

Requisitos

Por defecto, el rol utiliza
trombik.x509_certificate
para gestionar certificados X509. El rol no enumera trombik.x509_certificate
como una dependencia porque TLS no es obligatorio.

Variables del Rol

Variable Descripción Por defecto
opensearch_user nombre de usuario de opensearch {{ __opensearch_user }}
opensearch_group nombre del grupo de opensearch {{ __opensearch_group }}
opensearch_log_dir ruta al directorio de registros {{ __opensearch_log_dir }}
opensearch_db_dir ruta al directorio de datos {{ __opensearch_db_dir }}
opensearch_scripts_dir ruta al directorio de scripts {{ __opensearch_scripts_dir }}
opensearch_plugins_dir ruta al directorio de complementos {{ __opensearch_plugins_dir }}
opensearch_plugin_command ruta al comando opensearch-plugin {{ __opensearch_plugin_command }}
opensearch_plugins una lista de complementos (ver abajo) []
opensearch_service nombre del servicio de opensearch {{ __opensearch_service }}
opensearch_package nombre del paquete de opensearch {{ __opensearch_package }}
opensearch_conf_dir ruta al directorio de configuración {{ __opensearch_conf_dir }}
opensearch_jvm_options opciones de JVM (ver el ejemplo de playbook) ""
opensearch_conf_file ruta a opensearch.yml {{ opensearch_conf_dir }}/opensearch.yml
opensearch_flags banderas adicionales para los scripts de inicio ""
opensearch_config el contenido de opensearch.yml ""
opensearch_config_log4j2_properties el contenido de log4j2.properties ""
opensearch_http_host dirección o hostname de opensearch. Esta dirección debe ser accesible desde el controlador ansible (el host en el que se ejecuta ansible). El valor se utiliza para el acceso a la API, por lo tanto, debe coincidir con el nombre común del certificado cuando se usa TLS y se habilita la verificación del host remoto. De lo contrario, las llamadas a la API en el rol fallarán. localhost
opensearch_http_port puerto de escucha de opensearch. Este puerto debe ser accesible desde el controlador ansible (el host en el que se ejecuta ansible) 9200
opensearch_http_url URL de la interfaz HTTP. Esta URL debe ser accesible desde el controlador ansible https://{{ opensearch_http_host }}:{{ opensearch_http_port }}
opensearch_http_auth detalles de autenticación para el acceso a la API, ver abajo {}
opensearch_java_home variable de entorno JAVA_HOME {{ __opensearch_java_home }}
opensearch_extra_plugin_files una lista de archivos adicionales para complementos (ver abajo) []
opensearch_include_role_x509_certificate si es verdadero, incluir trombik.x509_certificate durante el play (trombik.x509_certificate debe estar enumerado en requirements.yml) yes
opensearch_x509_certificate_vars variable para pasar a trombik.x509_certificate {}
opensearch_wait_for_cluster_status esperar que el estado del clúster sea este valor después de iniciar el servicio. los valores válidos incluyen red, yellow, green, y false. establecer el valor false para deshabilitar no
opensearch_wait_for_cluster_status_timeout tiempo de espera al esperar que el estado del clúster sea opensearch_wait_for_cluster_status 10s
opensearch_wait_for_cluster_status_retry reintentar al esperar que el estado del clúster sea opensearch_wait_for_cluster_status 3

opensearch_plugins

Esta es una lista de complementos. Un elemento de la lista es un dict.

Clave Descripción ¿Obligatorio?
name nombre del complemento
src la fuente del complemento, por lo general una URL no

opensearch_extra_plugin_files

Esta variable es una lista de archivos para complementos. Un elemento de la lista es un dict.

Clave Descripción ¿Obligatorio?
path ruta relativa al archivo desde opensearch_plugins_dir
type ya sea yaml o raw. cuando el tipo es yaml, el valor de content se procesa como YAML. cuando el tipo es raw, el valor de content se procesa tal cual. cuando el valor de state se omite o es present, type debe ser especificada. no
mode modo del archivo no
owner propietario del archivo no
group grupo del archivo no
state ya sea present o absent. present crea el archivo. absent elimina el archivo. el valor por defecto es present no
content el contenido del archivo (ver también type arriba) no
post_command un dict para ansible.builtin.command no

post_command es un dict para ejecutar un comando después de que se haya cambiado el estado del elemento. La variable se pasa a ansible.builtin.command (no a ansible.builtin.shell).

Acepta las siguientes claves:

Clave Descripción ¿Obligatorio?
cmd El comando a ejecutar
args Un dict para args. Actualmente se admiten chdir, creates y removes. no
enabled Ya sea yes o no. Cuando yes, se ejecuta el comando, cuando no no

post_command está diseñado principalmente para securityadmin.sh.
Consulte
Aplicar cambios usando securityadmin.sh
para más detalles. Utilice enabled para ejecutar securityadmin.sh en un nodo específico.

opensearch_http_auth

Esta variable es un dict, utilizada como credenciales de usuario al acceder a los
puntos finales de la API en opensearch_http_url.

Clave Descripción ¿Obligatorio?
client_cert Ruta a la clave pública del cliente en formato PEM. Cuando es una ruta relativa, la ruta es relativa al directorio de trabajo en el controlador ansible, NO en la máquina destino. no
client_key Ruta a la clave secreta del cliente en formato PEM. Cuando es una ruta relativa, la ruta es relativa al directorio de trabajo en el controlador ansible, NO en la máquina destino. no
ca_path Ruta a la clave pública de la CA en formato PEM. Cuando es una ruta relativa, la ruta es relativa al directorio de trabajo en el controlador ansible, NO en la máquina destino. no
url_username Nombre de usuario para la autenticación básica no
url_password Contraseña para la autenticación básica no
validate_certs verificar el certificado remoto no

El rol pasa la variable al
uri
módulo.

ca_path se agregó en la versión ansible 2.11. client_cert y client_key
se agregaron en la versión ansible 2.4. Asegúrese de que su versión de ansible soporte
las claves. Como resultado, no puede usar validate_certs: yes cuando su
versión de ansible es anterior a 2.11 y el certificado no está firmado por
una CA en el paquete CA predeterminado (en muchos casos, querrá tener su propia CA para
firmar certificados debido a costos financieros).

Tenga en cuenta que las llamadas a la API se realizan desde el controlador ansible.
opensearch_http_url debe ser accesible desde el controlador ansible.

Los archivos a los que apuntan client_cert, client_key y ca_path deben estar en
el controlador ansible.

Problemas conocidos con opensearch_http_auth y TLS

opensearch soporta autenticación básica y autenticación con certificado de cliente TLS.
Sin embargo, en algunas configuraciones, la llamada a la API falla.

La respuesta corta es: use autenticación básica sobre TLS con ca_path. Esta es
la única configuración que funciona de manera segura como se esperaba.

Para usar autenticación de cliente TLS sin nombre de usuario y contraseña,
debe establecer validate_certs en no. Aquí está la matriz de pruebas y los resultados.

Método de autenticación valor de validate_certs ¿con ca_path? Resultado
Certificado de cliente TLS no Éxito
Certificado de cliente TLS no No Éxito
Certificado de cliente TLS yes Fallo
Certificado de cliente TLS yes No Fallo (esto es esperado ya que el cliente no puede validar sin certificado CA)
Básica no Éxito
Básica no No Éxito
Básica yes Éxito
Básica yes No Fallo (esto es esperado ya que el cliente no puede validar sin certificado CA)

Esto podría ser un error en el módulo uri de ansible porque curl funciona bien en
tanto la certificación de cliente TLS como la autenticación básica sobre TLS. Para
registro, se utilizaron los siguientes comandos.

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

Variable Por defecto
__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

Variable Por defecto
__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

Variable Por defecto
__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

Dependencias

Ejemplo de Playbook

Un ejemplo para instalar:

  • opensearch
  • opensearch-dashboards
  • haproxy
  • fluentd

haproxy es un proxy inverso para opensearch-dashboards. Los registros de haproxy
y el daemon de syslog se envían a un listener syslog local de fluentd. El
fluentd luego procesa los registros y los envía a opensearch. El patrón
de índice es logstash-*.

Tenga en cuenta que el complemento de salida elasticsearch de fluentd no admite
opensearch. El ejemplo sortea el problema al:

  • instalar versiones específicas del fluentd-elasticsearch-plugin y
    gemas relacionadas con elasticsearch
  • establecer verify_es_version_at_startup y default_elasticsearch_version
    en fluentd.conf

Consulte Issue 915
para más detalles.

Utilice el usuario admin con la contraseña admin para iniciar sesión en los dashboards.

Para un ejemplo de clúster, consulte
tests/serverspec/cluster.yml.

---
- hosts: localhost
  pre_tasks:
    - name: Permitir puerto HTTP
      ansible.builtin.iptables:
        chain: INPUT
        destination_port: 80
        protocol: tcp
        jump: ACCEPT
      when: ansible_os_family == 'RedHat'

    - name: Habilitar reenvío de syslog desde 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: Reiniciar rsyslog
      ansible.builtin.service:
        name: rsyslog
        state: restarted
      when:
        - ansible_os_family == 'Debian' or ansible_os_family == 'RedHat'
        - __register_project_rsyslog_config['changed']

    - name: Habilitar reenvío de syslog desde 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: Habilitar syslog rfc5424
      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: Reiniciar 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 se usa el jdk incluido en Ubuntu y CentOS
      when: ansible_os_family == "FreeBSD"
    - role: trombik.sysctl
    - ansible-role-opensearch
    - role: trombik.opensearch_dashboards
    - role: trombik.fluentd
    - role: trombik.haproxy
  vars:
    # XXX usar mi propio paquete ya que el paquete en el árbol oficial de paquetes
    # está roto. tenga en cuenta que el paquete depende de node10, que está fuera de
    # soporte y tiene vulnerabilidades.
    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:
        # vea 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: |
        # vea 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 la versión de ansible en Ubuntu es 2.9.6. como tal, ca_path
        # no se puede usar.
        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 usar CN diferente para admin_dn y nodes_dn. cuando admin_dn ==
        # nodes_dn, eso es un error.
        - 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 estas claves fueron creadas por los siguientes pasos descritos en:  
    # https://opensearch.org/docs/latest/security-plugin/configuration/generate-certificates/
    #
    # aquí hay una copia de los pasos:
    #
    # CA Raíz
    # openssl genrsa -out root-ca-key.pem 2048
    # openssl req -new -x509 -sha256 -key root-ca-key.pem -out root-ca.pem
    #
    # Certificado de Administrador
    # 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
    #
    # Certificado de Nodo
    # 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
    #
    # Limpieza
    # rm admin-key-temp.pem admin.csr node-key-temp.pem node.csr
    #
    # vea files/test/certs/Makefile para automatizar estos pasos.
    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') }}"

    # _____________________________________________dashboards de opensearch
    opensearch_dashboards_config:
      server.host: "{{ opensearch_dashboards_bind_address }}"
      server.port: "{{ opensearch_dashboards_bind_port }}"
      server.name: "OpenSearch Dashboards"
      # XXX corregir la ruta al registro en el paquete de 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"]
      # Utilice esta configuración si está ejecutando kibana sin 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' %}
        # aumentar la longitud máxima de línea de 1024 a 65535. esto trunca
        # los registros cuando son más largos que este valor.
        log 127.0.0.1:5140 len 65535 format rfc3164 local0 info
      {% else %}
        # XXX haproxy 1.x no entiende `format`.
        log 127.0.0.1:5140 len 65535 local2
        log-send-hostname
      {% endif %}

      {% if ansible_os_family == 'FreeBSD' %}
      # El paquete de FreeBSD no proporciona por defecto
        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 }}

        # Ubicaciones de material SSL predeterminadas
        ca-base /etc/ssl/certs
        crt-base /etc/ssl/private

        # Ver: 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 %}
        # formato de registro personalizado en JSON.
        # para crear su propia estructura JSON:
        #
        # cd files/test/haproxy
        # ruby ./yaml2logformat.rb log.yml
        #
        # note que la salida incluye el formato de registro entre comillas simples. sin embargo,
        # las comillas simples deben ser eliminadas cuando la versión de haproxy es 1.x.
        # por ejemplo, cuando la salida es:
        #
        # log-format '{"bytes_read":%B}'
        #
        # utilice esto en su lugar:
        # log-format {"bytes_read":%B}
        #
        # consulte las variables disponibles en:
        # 8.2.4. Formato de registro personalizado
        # 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 para CentOS es 1.x. esa versión no entiende
        # HM, `http-request capture`, y otros. utilice una versión simplificada del
        # registro JSON. el formato de registro de 1.x no entiende comillas simples.
        # los espacios deben escaparse.
        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
            # incluir la severidad en el evento syslog.
            # por defecto, el complemento de entrada syslog no incluye severidad.
            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>

          # procesar el registro de acceso desde haproxy. el nivel de información incluye los registros de acceso.
          # la clave `message` incluye JSON escapado. como el JSON incluye todos los datos,
          # descartar otros datos en el evento fluentd con `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: |
          # enviar eventos a elasticsearch. tenga en cuenta que los eventos se envían con
          # la API `_bulk`. puede tomar un tiempo enviar los eventos.
          <label @forward>
            <match **>
              @type elasticsearch
              # no use 127.0.0.1 aquí. use CN en el certificado
              host localhost
              port 9200
              scheme https
              ssl_version TLSv1_2
              user "logstash"
              password "logstash"
              # XXX necesita crear un rol para enviar datos a un índice diferente a
              # `logstash`, porque el rol de `logstash`, que es estático y se
              # preinstala, solo tiene acceso a patrones de índice `logstash-*`.
              # logstash_prefix syslog

              # habilitar registro de depuración en el transportista. los eventos enviados a elasticsearch
              # se registran en el archivo de registro. probablemente desee establecer esto en
              # falso en producción.
              with_transporter_log true
              ca_file {{ opensearch_conf_dir }}/root-ca.pem
              ssl_verify true
              logstash_format true
              # XXX una solución para usar opensearch con el complemento de salida elasticsearch. vea también fluentd_gems a continuación.
              #
              # 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

Licencia

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

Se concede permiso para utilizar, copiar, modificar y distribuir este software para cualquier
propósito con o sin cargo, siempre que se incluya el aviso de copyright anterior y este aviso
de permiso en todas las copias.

EL SOFTWARE SE PROPORCIONA "TAL CUAL" Y EL AUTOR RENUNCIA A TODAS LAS GARANTÍAS
CON RESPECTO A ESTE SOFTWARE INCLUYENDO TODAS LAS GARANTÍAS IMPLÍCITAS DE
COMERCIABILIDAD Y ADECUACIÓN. EN NINGÚN CASO EL AUTOR SERÁ RESPONSABLE DE NINGÚN DAÑO ESPECIAL, DIRECTO, INDIRECTO O CONSECUENTE O CUALQUIER DAÑO
QUE SURJA DE LA PÉRDIDA DE USO, DATOS O BENEFICIOS, YA SEA EN UNA ACCIÓN DE CONTRATO, NEGLIGENCIA O CUALQUIER OTRA ACCIÓN TORTICERA, SURGIENDO DE O EN CONEXIÓN CON EL USO O DESEMPEÑO DE ESTE SOFTWARE.

Información del Autor

Tomoyuki Sakurai y@trombik.org

Este README fue creado por qansible.

Acerca del proyecto

Configures opensearch

Instalar
ansible-galaxy install trombik.opensearch
Licencia
isc
Descargas
156
Propietario
PGP finger print: 03EB 3D97 5E04 9B0C AB21 93A2 D693 42A9 EFBC 3577 Makerspace and Coliving in Siem Reap, Cambodia: http://info.mkrsgh.org/