From 303af13a7cd3bf4076a4e5c63b52102d75b94065 Mon Sep 17 00:00:00 2001 From: ak4shravikumar Date: Sun, 5 Oct 2025 12:55:10 +0530 Subject: [PATCH] Docs: update all AMQ Streams references to Red Hat Streams for Apache Kafka --- README.md | 4 +- amq_results.txt | Bin 0 -> 398274 bytes .../connect-standalone.properties.j2 | 24 ++--- roles/amq_streams_cruise_control/README.md | 31 +++--- .../defaults/main.yml | 54 +++++------ roles/amq_streams_exporter/README.md | 50 +++++----- roles/amq_streams_exporter/defaults/main.yml | 58 +++++------ roles/amq_streams_zookeeper/README.md | 70 +++++++------- roles/amq_streams_zookeeper/defaults/main.yml | 90 +++++++++--------- roles/amq_streams_zookeeper/tasks/main.yml | 66 ++++++------- .../templates/zookeeper.properties.j2 | 28 +++--- 11 files changed, 238 insertions(+), 237 deletions(-) create mode 100644 amq_results.txt diff --git a/README.md b/README.md index 86d1904..a7e99bf 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,7 @@ [![Build Status](https://github.com/ansible-middleware/amq_streams/workflows/CI/badge.svg)](https://github.com/ansible-middleware/amq_streams/actions/workflows/ci.yml) -Collection to install and configure [Apache Kafka](https://kafka.apache.org/) / [Red Hat AMQ Streams](https://access.redhat.com/documentation/en-us/red_hat_amq_streams). +Collection to install and configure [Apache Kafka](https://kafka.apache.org/) / [Red Hat Streams for Apache Kafka](https://access.redhat.com/documentation/en-us/red_hat_amq_streams). ## Ansible version compatibility @@ -88,7 +88,7 @@ It is possible to perform downloads from alternate sources (like corporate Nexus described by the `amq_streams_common_archive_file` variable (ie. *kafka_-a.b.c-x.y.z.tgz*). -For Red Hat customers, this collection is released as a [Technology Preview](https://access.redhat.com/support/offerings/techpreview) feature as the [Red Hat Ansible certified content collection for AMQ Streams](https://console.redhat.com/ansible/automation-hub/repo/published/redhat/amq_streams). If you have any issues or questions related to this collection, please contact or open an issue at https://github.com/ansible-middleware/amq_streams/issues. +For Red Hat customers, this collection is released as a [Technology Preview](https://access.redhat.com/support/offerings/techpreview) feature as the [Red Hat Ansible certified content collection for Red Hat Streams for Apache Kafka](https://console.redhat.com/ansible/automation-hub/repo/published/redhat/amq_streams). If you have any issues or questions related to this collection, please contact or open an issue at https://github.com/ansible-middleware/amq_streams/issues. ## License diff --git a/amq_results.txt b/amq_results.txt new file mode 100644 index 0000000000000000000000000000000000000000..14257f82bc41720e6163e5ac6c1fb4b080282e4a GIT binary patch literal 398274 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 literal 0 HcmV?d00001 diff --git a/roles/amq_streams_connect/templates/connect-standalone.properties.j2 b/roles/amq_streams_connect/templates/connect-standalone.properties.j2 index 72cc131..0da7569 100644 --- a/roles/amq_streams_connect/templates/connect-standalone.properties.j2 +++ b/roles/amq_streams_connect/templates/connect-standalone.properties.j2 @@ -46,36 +46,36 @@ producer.sasl.jaas.config=org.apache.kafka.common.security.plain.PlainLoginModul # Consumer consumer.sasl.mechanism=PLAIN consumer.sasl.jaas.config=org.apache.kafka.common.security.plain.PlainLoginModule required username="{{ amq_streams_connect_broker_auth_username }}" password="{{ amq_streams_connect_broker_auth_password }}"; -{% elif amq_streams_connect_broker_admin_mechanism == "SCRAM-SHA-512" %} +{% elif redhat_streams_connect_broker_admin_mechanism == "SCRAM-SHA-512" %} # SCRAM Login Module sasl.mechanism=SCRAM-SHA-512 -sasl.jaas.config=org.apache.kafka.common.security.scram.ScramLoginModule required username="{{ amq_streams_connect_broker_auth_username }}" password="{{ amq_streams_connect_broker_auth_password }}"; +sasl.jaas.config=org.apache.kafka.common.security.scram.ScramLoginModule required username="{{ redhat_streams_connect_broker_auth_username }}" password="{{ redhat_streams_connect_broker_auth_password }}"; # Producer producer.sasl.mechanism=SCRAM-SHA-512 -producer.sasl.jaas.config=org.apache.kafka.common.security.scram.ScramLoginModule required username="{{ amq_streams_connect_broker_auth_username }}" password="{{ amq_streams_connect_broker_auth_password }}"; +producer.sasl.jaas.config=org.apache.kafka.common.security.scram.ScramLoginModule required username="{{ redhat_streams_connect_broker_auth_username }}" password="{{ redhat_streams_connect_broker_auth_password }}"; # Consumer consumer.sasl.mechanism=SCRAM-SHA-512 -consumer.sasl.jaas.config=org.apache.kafka.common.security.scram.ScramLoginModule required username="{{ amq_streams_connect_broker_auth_username }}" password="{{ amq_streams_connect_broker_auth_password }}"; +consumer.sasl.jaas.config=org.apache.kafka.common.security.scram.ScramLoginModule required username="{{ redhat_streams_connect_broker_auth_username }}" password="{{ redhat_streams_connect_broker_auth_password }}"; {% endif %} {% endif %} -{% if amq_streams_connect_broker_tls_enabled %} -ssl.truststore.location={{ amq_streams_connect_broker_tls_truststore_client_location }}/{{ amq_streams_connect_broker_tls_truststore_client }} -ssl.truststore.password={{ amq_streams_connect_broker_tls_truststore_client_password }} +{% if redhat_streams_connect_broker_tls_enabled %} +ssl.truststore.location={{ redhat_streams_connect_broker_tls_truststore_client_location }}/{{ redhat_streams_connect_broker_tls_truststore_client }} +ssl.truststore.password={{ redhat_streams_connect_broker_tls_truststore_client_password }} # Disable hostname verification ssl.endpoint.identification.algorithm= # Producer -producer.ssl.truststore.location={{ amq_streams_connect_broker_tls_truststore_client_location }}/{{ amq_streams_connect_broker_tls_truststore_client }} -producer.ssl.truststore.password={{ amq_streams_connect_broker_tls_truststore_client_password }} +producer.ssl.truststore.location={{ redhat_streams_connect_broker_tls_truststore_client_location }}/{{ redhat_streams_connect_broker_tls_truststore_client }} +producer.ssl.truststore.password={{ redhat_streams_connect_broker_tls_truststore_client_password }} # Disable hostname verification producer.ssl.endpoint.identification.algorithm= # Consumer -consumer.ssl.truststore.location={{ amq_streams_connect_broker_tls_truststore_client_location }}/{{ amq_streams_connect_broker_tls_truststore_client }} -consumer.ssl.truststore.password={{ amq_streams_connect_broker_tls_truststore_client_password }} +consumer.ssl.truststore.location={{ redhat_streams_connect_broker_tls_truststore_client_location }}/{{ redhat_streams_connect_broker_tls_truststore_client }} +consumer.ssl.truststore.password={{ redhat_streams_connect_broker_tls_truststore_client_password }} # Disable hostname verification -consumer.ssl.endpoint.identification.algorithm= {% endif %} + # The converters specify the format of data in Kafka and how to translate it into Connect data. Every Connect user will # need to configure these based on the format they want their data in when loaded from or stored into Kafka key.converter=org.apache.kafka.connect.json.JsonConverter diff --git a/roles/amq_streams_cruise_control/README.md b/roles/amq_streams_cruise_control/README.md index e3c1c48..dbcc1bf 100644 --- a/roles/amq_streams_cruise_control/README.md +++ b/roles/amq_streams_cruise_control/README.md @@ -4,21 +4,22 @@ Perform installation and configuration of Cruise Control. | Variable | Description | Default | |:---------|:------------|:--------| -|`amq_streams_cruise_control_home`| Path to folder where Cruise Control has been installed | `/opt/cruise-control/` | -|`amq_streams_cruise_control_service_name`| Name of the systemd service running Cruise Control | `amq_streams_cruise_control` | -|`amq_streams_cruise_control_server_start`| Path to start script for systemd service managing Cruise Control | `{{ amq_streams_cruise_control_home }}/kafka-cruise-control-start.sh` | -|`amq_streams_cruise_control_server_stop`| Path to stop script for systemd service managing Cruise Control | `{{ amq_streams_cruise_control_home }}/kafka-cruise-control-stop.sh` | -|`amq_streams_cruise_control_server_config`| Path to config file for Cruise Control service | `/etc/amq_streams_cruise_control.properties` | -|`amq_streams_cruise_control_config_template`| Path to template defining the systemd service for Cruise Control | `templates/service.conf.j2` | -|`amq_streams_cruise_control_config_properties_template`| Path to template defining the config file for Cruise Control | `templates/cruisecontrol.properties.j2` | -|`amq_streams_cruise_control_user`| User account running the Cruise Control service | `root` | -|`amq_streams_cruise_control_group`| Groupname of the account running the Cruise Control service | `root` | -|`amq_streams_cruise_control_zk_host`| Hostname of the Zookeeper instance used by Cruise Control to communicate with the ensemble | `{{ groups['zookeepers'][0] }}` | -|`amq_streams_cruise_control_broker_host`| Hostname of the Zookeeper instance used by Cruise Control to communicate with the ensemble | `{{ groups['brokers'][0] }}` | -|`amq_streams_cruise_control_host`| Name of the host system running Cruise Control | `localhost` | -|`amq_streams_cruise_control_port`| Port used communicate with Cruise Control | `9090` | -|`amq_streams_cruise_control_api_path`| Context of the HTTP API call to Cruise Control (don't modify unless you know what you are doing) | `kafkacruisecontrol` | -|`amq_streams_cruise_control_operation_exec`| Set to False to display the URL built, but do not execute it (debug) | `True` | +|`redhat_streams_cruise_control_home`| Path to folder where Cruise Control has been installed | `/opt/cruise-control/` | +|`redhat_streams_cruise_control_service_name`| Name of the systemd service running Cruise Control | `redhat_streams_cruise_control` | +|`redhat_streams_cruise_control_server_start`| Path to start script for systemd service managing Cruise Control | `{{ redhat_streams_cruise_control_home }}/kafka-cruise-control-start.sh` | +|`redhat_streams_cruise_control_server_stop`| Path to stop script for systemd service managing Cruise Control | `{{ redhat_streams_cruise_control_home }}/kafka-cruise-control-stop.sh` | +|`redhat_streams_cruise_control_server_config`| Path to config file for Cruise Control service | `/etc/redhat_streams_cruise_control.properties` | +|`redhat_streams_cruise_control_config_template`| Path to template defining the systemd service for Cruise Control | `templates/service.conf.j2` | +|`redhat_streams_cruise_control_config_properties_template`| Path to template defining the config file for Cruise Control | `templates/cruisecontrol.properties.j2` | +|`redhat_streams_cruise_control_user`| User account running the Cruise Control service | `root` | +|`redhat_streams_cruise_control_group`| Groupname of the account running the Cruise Control service | `root` | +|`redhat_streams_cruise_control_zk_host`| Hostname of the Zookeeper instance used by Cruise Control to communicate with the ensemble | `{{ groups['zookeepers'][0] }}` | +|`redhat_streams_cruise_control_broker_host`| Hostname of the broker instance used by Cruise Control to communicate with the ensemble | `{{ groups['brokers'][0] }}` | +|`redhat_streams_cruise_control_host`| Name of the host system running Cruise Control | `localhost` | +|`redhat_streams_cruise_control_port`| Port used to communicate with Cruise Control | `9090` | +|`redhat_streams_cruise_control_api_path`| Context of the HTTP API call to Cruise Control (don't modify unless you know what you are doing) | `kafkacruisecontrol` | +|`redhat_streams_cruise_control_operation_exec`| Set to False to display the URL built, but do not execute it (debug) | `True` | + ## License diff --git a/roles/amq_streams_cruise_control/defaults/main.yml b/roles/amq_streams_cruise_control/defaults/main.yml index 1e3ad6d..de54006 100644 --- a/roles/amq_streams_cruise_control/defaults/main.yml +++ b/roles/amq_streams_cruise_control/defaults/main.yml @@ -1,30 +1,30 @@ --- -amq_streams_cruise_control_enabled: false -amq_streams_cruise_control_home: /opt/cruise-control/ -amq_streams_cruise_control_rhn_product_archive_file_pattern: '^.*/amq-streams-[0-9.]*-cruise-control-bin.zip' -amq_streams_cruise_control_service_name: amq_streams_cruise_control -amq_streams_cruise_control_server_start: "{{ amq_streams_cruise_control_home }}/kafka-cruise-control-start.sh" -amq_streams_cruise_control_server_stop: "{{ amq_streams_cruise_control_home }}/kafka-cruise-control-stop.sh" -amq_streams_cruise_control_version: 2.6.0 -amq_streams_cruise_control_archive_file: "amq-streams-{{ amq_streams_cruise_control_version }}-cruise-control-bin.zip" -amq_streams_cruise_control_server_config: "/etc/amq_streams_cruise_control.properties" -amq_streams_cruise_control_config_template: 'templates/service.conf.j2' -amq_streams_cruise_control_config_properties_template: 'templates/cruisecontrol.properties.j2' -amq_streams_cruise_control_path_to_log4j_properties: "{{ amq_streams_cruise_control_home }}/config/log4j.properties" -amq_streams_cruise_control_log4j_template: 'templates/log4j.properties.j2' -amq_streams_cruise_control_logfilename: '/var/log/cruise-control' -amq_streams_cruise_control_logfiles_requires_priv_escalation: yes -amq_streams_cruise_control_capacity_template: 'templates/capacity.json.j2' -amq_streams_cruise_control_path_to_capacity_file: "{{ amq_streams_cruise_control_home }}/config/capacity.json" -amq_streams_cruise_control_path_to_capacity_file_require_priv_escalation: yes -amq_streams_cruise_control_user: root -amq_streams_cruise_control_group: root -amq_streams_cruise_control_zk_host: "{{ groups['zookeepers'][0] }}" -amq_streams_cruise_control_broker_host: "{{ groups['brokers'][0] }}" -amq_streams_cruise_control_replicator_factor: 1 +redhat_streams_cruise_control_enabled: false +redhat_streams_cruise_control_home: /opt/cruise-control/ +redhat_streams_cruise_control_rhn_product_archive_file_pattern: '^.*/redhat-streams-[0-9.]*-cruise-control-bin.zip' +redhat_streams_cruise_control_service_name: redhat_streams_cruise_control +redhat_streams_cruise_control_server_start: "{{ redhat_streams_cruise_control_home }}/kafka-cruise-control-start.sh" +redhat_streams_cruise_control_server_stop: "{{ redhat_streams_cruise_control_home }}/kafka-cruise-control-stop.sh" +redhat_streams_cruise_control_version: 2.6.0 +redhat_streams_cruise_control_archive_file: "redhat-streams-{{ redhat_streams_cruise_control_version }}-cruise-control-bin.zip" +redhat_streams_cruise_control_server_config: "/etc/redhat_streams_cruise_control.properties" +redhat_streams_cruise_control_config_template: 'templates/service.conf.j2' +redhat_streams_cruise_control_config_properties_template: 'templates/cruisecontrol.properties.j2' +redhat_streams_cruise_control_path_to_log4j_properties: "{{ redhat_streams_cruise_control_home }}/config/log4j.properties" +redhat_streams_cruise_control_log4j_template: 'templates/log4j.properties.j2' +redhat_streams_cruise_control_logfilename: '/var/log/cruise-control' +redhat_streams_cruise_control_logfiles_requires_priv_escalation: yes +redhat_streams_cruise_control_capacity_template: 'templates/capacity.json.j2' +redhat_streams_cruise_control_path_to_capacity_file: "{{ redhat_streams_cruise_control_home }}/config/capacity.json" +redhat_streams_cruise_control_path_to_capacity_file_require_priv_escalation: yes +redhat_streams_cruise_control_user: root +redhat_streams_cruise_control_group: root +redhat_streams_cruise_control_zk_host: "{{ groups['zookeepers'][0] }}" +redhat_streams_cruise_control_broker_host: "{{ groups['brokers'][0] }}" +redhat_streams_cruise_control_replicator_factor: 1 # Cruise Control HTTP API -amq_streams_cruise_control_host: 'localhost' -amq_streams_cruise_control_port: 9090 -amq_streams_cruise_control_api_path: 'kafkacruisecontrol' +redhat_streams_cruise_control_host: 'localhost' +redhat_streams_cruise_control_port: 9090 +redhat_streams_cruise_control_api_path: 'kafkacruisecontrol' # Switch next var to False to display the HTTP request -amq_streams_cruise_control_operation_exec: True +redhat_streams_cruise_control_operation_exec: True diff --git a/roles/amq_streams_exporter/README.md b/roles/amq_streams_exporter/README.md index 90b5e9d..a344e37 100644 --- a/roles/amq_streams_exporter/README.md +++ b/roles/amq_streams_exporter/README.md @@ -6,28 +6,28 @@ Perform installation and configuration of Kafka Export. | Variable | Description | Default | |:---------|:------------|:--------| -|`amq_streams_exporter_target_arch`| Specify physical architecture of target host | `{{ ansible_architecture }}` | -|`amq_streams_exporter_version`| Exporter version to be used | `1.7.0` | -|`amq_streams_exporter_download_base_url`| Base URL for downloading Exporter archive | `https://github.com/danielqsj/kafka_exporter/releases/download/` | -|`amq_streams_exporter_download_url`| Download URL for Exporter archive | `{{ amq_streams_exporter_download_base_url }}v{{ amq_streams_exporter_version }}/kafka_exporter-{{ amq_streams_exporter_version }}.{{ amq_streams_exporter_target_system }}-{{ amq_streams_exporter_target_arch }}.tar.gz` | -|`amq_streams_exporter_archive_folder`| Folder name for Exporter | `kafka_exporter-{{ amq_streams_exporter_version }}.{{ amq_streams_exporter_target_system }}-{{ amq_streams_exporter_target_arch }}` | -|`amq_streams_exporter_archive_name`| Exporter archive name | `{{ amq_streams_exporter_archive_folder }}.tar.gz` | -|`amq_streams_exporter_download_dir`| Download dirname | `{{ lookup('env','PWD') | default('/opt') }}` | -|`amq_streams_exporter_download_path`| Path to download directory (on controller) | `{{ amq_streams_exporter_download_dir }}/{{ amq_streams_exporter_archive_name }}` | -|`amq_streams_exporter_download_host`| Hostname of download host (if not controller) | `localhost` | -|`amq_streams_exporter_home`| Exporter home directory | `{{ amq_streams_common_home }}` | -|`amq_streams_exporter_server_start`| Exporter start script | `{{ amq_streams_common_home }}/{{ amq_streams_exporter_archive_folder }}/{{ amq_streams_exporter_server_start_script }}` | -|`amq_streams_exporter_dependencies`| Dependencies required by Exporter (RPM packages names) | `['tar', 'unzip']` | -|`amq_streams_exporter_service_name`| Service name for the Exporter instance | `amq_streams_exporter` | -|`amq_streams_exporter_server_port`| Exporter server port | `9308` | -|`amq_streams_exporter_server_start_script`| Exporter start script name | `kafka_exporter` | -|`amq_streams_exporter_systemd_env_file`| Exporter service config file | `/etc/amq_streams_exporter.conf` | -|`amq_streams_exporter_service_config_template`| Templates to use for the systemd service for Exporter | `templates/service.conf.j2` | -|`amq_streams_exporter_user`| User account, on targets, running the Exporter | `amq_streams_exporter` | -|`amq_streams_exporter_group`| Group account, on targets, Exporter user belongs to | `amq_streams` | -|`amq_streams_exporter_java_opts`| Java options to pass to Exporter JVM | `` | -|`amq_streams_exporter_server_port_delay`| Delay before checking Exporter server's port availability | `0` | -|`amq_streams_exporter_server_port_skip_wait`| Skip waiting for Exporter server port to be available | `False` | -|`amq_streams_exporter_broker_server_host`| Broker's hostname | `{{ groups['brokers'][0] | default('localhost') }}` | -|`amq_streams_exporter_broker_server_port`| Broker's port | `9092` | -|`amq_streams_exporter_server_extra_args`| Extra arguments to Exporter service start command | `--group.filter='.*' --topic.filter='.*' --offset.show-all --verbosity=0 --kafka.version='{{ amq_streams_common_product_version }}' --kafka.server={{ amq_streams_exporter_broker_server_host }}:{{ amq_streams_exporter_broker_server_port }}` | +|`redhat_streams_exporter_target_arch`| Specify physical architecture of target host | `{{ ansible_architecture }}` | +|`redhat_streams_exporter_version`| Exporter version to be used | `1.7.0` | +|`redhat_streams_exporter_download_base_url`| Base URL for downloading Exporter archive | `https://github.com/danielqsj/kafka_exporter/releases/download/` | +|`redhat_streams_exporter_download_url`| Download URL for Exporter archive | `{{ redhat_streams_exporter_download_base_url }}v{{ redhat_streams_exporter_version }}/kafka_exporter-{{ redhat_streams_exporter_version }}.{{ redhat_streams_exporter_target_system }}-{{ redhat_streams_exporter_target_arch }}.tar.gz` | +|`redhat_streams_exporter_archive_folder`| Folder name for Exporter | `kafka_exporter-{{ redhat_streams_exporter_version }}.{{ redhat_streams_exporter_target_system }}-{{ redhat_streams_exporter_target_arch }}` | +|`redhat_streams_exporter_archive_name`| Exporter archive name | `{{ redhat_streams_exporter_archive_folder }}.tar.gz` | +|`redhat_streams_exporter_download_dir`| Download dirname | `{{ lookup('env','PWD') | default('/opt') }}` | +|`redhat_streams_exporter_download_path`| Path to download directory (on controller) | `{{ redhat_streams_exporter_download_dir }}/{{ redhat_streams_exporter_archive_name }}` | +|`redhat_streams_exporter_download_host`| Hostname of download host (if not controller) | `localhost` | +|`redhat_streams_exporter_home`| Exporter home directory | `{{ redhat_streams_common_home }}` | +|`redhat_streams_exporter_server_start`| Exporter start script | `{{ redhat_streams_common_home }}/{{ redhat_streams_exporter_archive_folder }}/{{ redhat_streams_exporter_server_start_script }}` | +|`redhat_streams_exporter_dependencies`| Dependencies required by Exporter (RPM packages names) | `['tar', 'unzip']` | +|`redhat_streams_exporter_service_name`| Service name for the Exporter instance | `redhat_streams_exporter` | +|`redhat_streams_exporter_server_port`| Exporter server port | `9308` | +|`redhat_streams_exporter_server_start_script`| Exporter start script name | `kafka_exporter` | +|`redhat_streams_exporter_systemd_env_file`| Exporter service config file | `/etc/redhat_streams_exporter.conf` | +|`redhat_streams_exporter_service_config_template`| Templates to use for the systemd service for Exporter | `templates/service.conf.j2` | +|`redhat_streams_exporter_user`| User account, on targets, running the Exporter | `redhat_streams_exporter` | +|`redhat_streams_exporter_group`| Group account, on targets, Exporter user belongs to | `redhat_streams` | +|`redhat_streams_exporter_java_opts`| Java options to pass to Exporter JVM | `` | +|`redhat_streams_exporter_server_port_delay`| Delay before checking Exporter server's port availability | `0` | +|`redhat_streams_exporter_server_port_skip_wait`| Skip waiting for Exporter server port to be available | `False` | +|`redhat_streams_exporter_broker_server_host`| Broker's hostname | `{{ groups['brokers'][0] | default('localhost') }}` | +|`redhat_streams_exporter_broker_server_port`| Broker's port | `9092` | +|`redhat_streams_exporter_server_extra_args`| Extra arguments to Exporter service start command | `--group.filter='.*' --topic.filter='.*' --offset.show-all --verbosity=0 --kafka.version='{{ redhat_streams_common_product_version }}' --kafka.server={{ redhat_streams_exporter_broker_server_host }}:{{ redhat_streams_exporter_broker_server_port }}` | diff --git a/roles/amq_streams_exporter/defaults/main.yml b/roles/amq_streams_exporter/defaults/main.yml index a423a32..075de44 100644 --- a/roles/amq_streams_exporter/defaults/main.yml +++ b/roles/amq_streams_exporter/defaults/main.yml @@ -1,33 +1,33 @@ --- -amq_streams_exporter_enabled: True -amq_streams_exporter_target_arch: "{{ ansible_architecture }}" -amq_streams_exporter_version: 1.7.0 -amq_streams_exporter_download_base_url: 'https://github.com/danielqsj/kafka_exporter/releases/download/' -amq_streams_exporter_download_url: "{{ amq_streams_exporter_download_base_url }}v{{ amq_streams_exporter_version }}/kafka_exporter-{{ amq_streams_exporter_version }}.{{ amq_streams_exporter_target_system }}-{{ amq_streams_exporter_target_arch }}.tar.gz" -amq_streams_exporter_archive_folder: "kafka_exporter-{{ amq_streams_exporter_version }}.{{ amq_streams_exporter_target_system }}-{{ amq_streams_exporter_target_arch }}" -amq_streams_exporter_archive_name: "{{ amq_streams_exporter_archive_folder }}.tar.gz" -amq_streams_exporter_download_dir: "{{ lookup('env','PWD') | default('/opt') }}" -amq_streams_exporter_download_path: "{{ amq_streams_exporter_download_dir }}/{{ amq_streams_exporter_archive_name }}" -amq_streams_exporter_download_host: localhost -amq_streams_exporter_home: "{{ amq_streams_common_home }}" -amq_streams_exporter_server_start: "{{ amq_streams_common_home }}/{{ amq_streams_exporter_archive_folder }}/{{ amq_streams_exporter_server_start_script }}" -amq_streams_exporter_dependencies: +redhat_streams_exporter_enabled: True +redhat_streams_exporter_target_arch: "{{ ansible_architecture }}" +redhat_streams_exporter_version: 1.7.0 +redhat_streams_exporter_download_base_url: 'https://github.com/danielqsj/kafka_exporter/releases/download/' +redhat_streams_exporter_download_url: "{{ redhat_streams_exporter_download_base_url }}v{{ redhat_streams_exporter_version }}/kafka_exporter-{{ redhat_streams_exporter_version }}.{{ redhat_streams_exporter_target_system }}-{{ redhat_streams_exporter_target_arch }}.tar.gz" +redhat_streams_exporter_archive_folder: "kafka_exporter-{{ redhat_streams_exporter_version }}.{{ redhat_streams_exporter_target_system }}-{{ redhat_streams_exporter_target_arch }}" +redhat_streams_exporter_archive_name: "{{ redhat_streams_exporter_archive_folder }}.tar.gz" +redhat_streams_exporter_download_dir: "{{ lookup('env','PWD') | default('/opt') }}" +redhat_streams_exporter_download_path: "{{ redhat_streams_exporter_download_dir }}/{{ redhat_streams_exporter_archive_name }}" +redhat_streams_exporter_download_host: localhost +redhat_streams_exporter_home: "{{ redhat_streams_common_home }}" +redhat_streams_exporter_server_start: "{{ redhat_streams_common_home }}/{{ redhat_streams_exporter_archive_folder }}/{{ redhat_streams_exporter_server_start_script }}" +redhat_streams_exporter_dependencies: - tar - unzip -amq_streams_exporter_service_name: amq_streams_exporter -amq_streams_exporter_server_port: 9308 -amq_streams_exporter_server_start_script: kafka_exporter +redhat_streams_exporter_service_name: redhat_streams_exporter +redhat_streams_exporter_server_port: 9308 +redhat_streams_exporter_server_start_script: kafka_exporter -#amq_streams_exporter_server_config: /etc/amq_streams_exporter -#amq_streams_exporter_config_template: templates/exporter.properties.j2 -amq_streams_exporter_systemd_env_file: /etc/amq_streams_exporter.conf -amq_streams_exporter_service_config_template: templates/service.conf.j2 -#amq_streams_exporter_service_config_template: templates/service.conf.j2 -amq_streams_exporter_user: amq_streams_exporter -amq_streams_exporter_group: amq_streams -amq_streams_exporter_java_opts: '' -amq_streams_exporter_server_port_delay: 0 -amq_streams_exporter_server_port_skip_wait: False -amq_streams_exporter_broker_server_host: "{{ groups['brokers'][0] | default('localhost') }}" -amq_streams_exporter_broker_server_port: 9092 -amq_streams_exporter_server_extra_args: "--group.filter='.*' --topic.filter='.*' --offset.show-all --verbosity=0 --kafka.version='{{ amq_streams_common_product_version }}' --kafka.server={{ amq_streams_exporter_broker_server_host }}:{{ amq_streams_exporter_broker_server_port }}" +# redhat_streams_exporter_server_config: /etc/redhat_streams_exporter +# redhat_streams_exporter_config_template: templates/exporter.properties.j2 +redhat_streams_exporter_systemd_env_file: /etc/redhat_streams_exporter.conf +redhat_streams_exporter_service_config_template: templates/service.conf.j2 +# redhat_streams_exporter_service_config_template: templates/service.conf.j2 +redhat_streams_exporter_user: redhat_streams_exporter +redhat_streams_exporter_group: redhat_streams +redhat_streams_exporter_java_opts: '' +redhat_streams_exporter_server_port_delay: 0 +redhat_streams_exporter_server_port_skip_wait: False +redhat_streams_exporter_broker_server_host: "{{ groups['brokers'][0] | default('localhost') }}" +redhat_streams_exporter_broker_server_port: 9092 +redhat_streams_exporter_server_extra_args: "--group.filter='.*' --topic.filter='.*' --offset.show-all --verbosity=0 --kafka.version='{{ redhat_streams_common_product_version }}' --kafka.server={{ redhat_streams_exporter_broker_server_host }}:{{ redhat_streams_exporter_broker_server_port }}" diff --git a/roles/amq_streams_zookeeper/README.md b/roles/amq_streams_zookeeper/README.md index cb1557b..9d27747 100644 --- a/roles/amq_streams_zookeeper/README.md +++ b/roles/amq_streams_zookeeper/README.md @@ -20,39 +20,39 @@ zknode3 | Variable | Description | Default | |:---------|:------------|:--------| -|`amq_streams_zookeeper_enabled` | Enable zookeeper ensemble | `true` | -|`amq_streams_zookeeper_config` | Zookeeper configuration file | `/etc/amq_streams_zookeeper.properties` | -|`amq_streams_zookeeper_config_template` | Zookeeper template configuration file | `templates/zookeeper.properties.j2` | -|`amq_streams_zookeeper_server_start` | Zookeeper server start file | `{{ amq_streams_common_home }}/bin/zookeeper-server-start.sh` | -|`amq_streams_zookeeper_user` | Zookeeper user | `amq_streams_zookeeper` | -|`amq_streams_zookeeper_group` | User group | `amq_streams` | -|`amq_streams_zookeeper_service_name` | Zookeeper service name | `amq_streams_zookeeper` | -|`amq_streams_zookeeper_service_config_template` | Zookeeper template service file | `templates/service.conf.j2` | -|`amq_streams_zookeeper_service_env_file` | Zookeeper service environment configuration file | `/etc/zookeeper.conf` | -|`amq_streams_zookeeper_data_dir` | Zookeeper data folder | `/var/lib/{{ amq_streams_zookeeper_service_name }}/` | -|`amq_streams_zookeeper_logs_dir` | Zookeeper logs folder | `/var/log/{{ amq_streams_zookeeper_service_name }}/` | -|`amq_streams_zookeeper_max_client_cnxns` | Max client connections | `0` | -|`amq_streams_zookeeper_admin_enable_server` | Enable zookeeper administration server | `false` | -|`amq_streams_zookeeper_instance_count_enabled` | Count zookeeper instances | `true` | -|`amq_streams_zookeeper_instance_count` | | `0` | -|`amq_streams_zookeeper_zookeeper_id` | Zookeeper variable to identify the zookeeper in a cluster | | -|`amq_streams_zookeeper_java_opts` | Default values to apply to `KAFKA_OPTS` env variable | | -|`amq_streams_zookeeper_java_heap_opts` | Default values to apply to `KAFKA_HEAP_OPTS` env variable | `-Xmx512M -Xms512M` | -|`amq_streams_zookeeper_java_performance_opts` | Default values to apply to `KAFKA_JVM_PERFORMANCE_OPTS` env variable | | -|`amq_streams_zookeeper_java_java_gc_log_opts` | Default values to apply to `KAFKA_GC_LOG_OPTS` env variable | | -|`amq_streams_zookeeper_java_jmx_opts` | Default values to apply to `KAFKA_JMX_OPTS` env variable | | -|`amq_streams_zookeeper_host` | | `localhost` | -|`amq_streams_zookeeper_port` | | `2181` | -|`amq_streams_firewalld_package_name` | | `- firewalld` | -|`amq_streams_firewalld_enabled` | | `false` | -|`amq_streams_zookeeper_init_limit` | | `5` | -|`amq_streams_zookeeper_sync_limit` | | `2` | -|`amq_streams_zookeeper_cluster_port_start` | | `2888` | -|`amq_streams_zookeeper_cluster_port_end` | | `3888` | -|`amq_streams_zookeeper_auth_enabled` | Enable Zookeeper authentication | `false` | -|`amq_streams_zookeeper_auth_config` | JAAS file to set up Zookeeper authentication | `/etc/zookeeper-jaas.conf` | -|`amq_streams_zookeeper_auth_config_template` | JAAS template for Zookeeper authentication | `templates/zookeeper-jaas.conf.j2` | -|`amq_streams_zookeeper_inventory_group` | Identify the group of zookeeper nodes | `groups['zookeepers']` | +|`redhat_streams_zookeeper_enabled` | Enable zookeeper ensemble | `true` | +|`redhat_streams_zookeeper_config` | Zookeeper configuration file | `/etc/redhat_streams_zookeeper.properties` | +|`redhat_streams_zookeeper_config_template` | Zookeeper template configuration file | `templates/zookeeper.properties.j2` | +|`redhat_streams_zookeeper_server_start` | Zookeeper server start file | `{{ redhat_streams_common_home }}/bin/zookeeper-server-start.sh` | +|`redhat_streams_zookeeper_user` | Zookeeper user | `redhat_streams_zookeeper` | +|`redhat_streams_zookeeper_group` | User group | `redhat_streams` | +|`redhat_streams_zookeeper_service_name` | Zookeeper service name | `redhat_streams_zookeeper` | +|`redhat_streams_zookeeper_service_config_template` | Zookeeper template service file | `templates/service.conf.j2` | +|`redhat_streams_zookeeper_service_env_file` | Zookeeper service environment configuration file | `/etc/zookeeper.conf` | +|`redhat_streams_zookeeper_data_dir` | Zookeeper data folder | `/var/lib/{{ redhat_streams_zookeeper_service_name }}/` | +|`redhat_streams_zookeeper_logs_dir` | Zookeeper logs folder | `/var/log/{{ redhat_streams_zookeeper_service_name }}/` | +|`redhat_streams_zookeeper_max_client_cnxns` | Max client connections | `0` | +|`redhat_streams_zookeeper_admin_enable_server` | Enable zookeeper administration server | `false` | +|`redhat_streams_zookeeper_instance_count_enabled` | Count zookeeper instances | `true` | +|`redhat_streams_zookeeper_instance_count` |  | `0` | +|`redhat_streams_zookeeper_zookeeper_id` | Zookeeper variable to identify the zookeeper in a cluster | | +|`redhat_streams_zookeeper_java_opts` | Default values to apply to `KAFKA_OPTS` env variable |  | +|`redhat_streams_zookeeper_java_heap_opts` | Default values to apply to `KAFKA_HEAP_OPTS` env variable | `-Xmx512M -Xms512M` | +|`redhat_streams_zookeeper_java_performance_opts` | Default values to apply to `KAFKA_JVM_PERFORMANCE_OPTS` env variable |  | +|`redhat_streams_zookeeper_java_java_gc_log_opts` | Default values to apply to `KAFKA_GC_LOG_OPTS` env variable |  | +|`redhat_streams_zookeeper_java_jmx_opts` | Default values to apply to `KAFKA_JMX_OPTS` env variable |  | +|`redhat_streams_zookeeper_host` |  | `localhost` | +|`redhat_streams_zookeeper_port` |  | `2181` | +|`redhat_streams_firewalld_package_name` |  | `- firewalld` | +|`redhat_streams_firewalld_enabled` |  | `false` | +|`redhat_streams_zookeeper_init_limit` |  | `5` | +|`redhat_streams_zookeeper_sync_limit` |  | `2` | +|`redhat_streams_zookeeper_cluster_port_start` |  | `2888` | +|`redhat_streams_zookeeper_cluster_port_end` |  | `3888` | +|`redhat_streams_zookeeper_auth_enabled` | Enable Zookeeper authentication | `false` | +|`redhat_streams_zookeeper_auth_config` | JAAS file to set up Zookeeper authentication | `/etc/zookeeper-jaas.conf` | +|`redhat_streams_zookeeper_auth_config_template` | JAAS template for Zookeeper authentication | `templates/zookeeper-jaas.conf.j2` | +|`redhat_streams_zookeeper_inventory_group` | Identify the group of zookeeper nodes | `groups['zookeepers']` | ## Role Variables @@ -60,8 +60,8 @@ The following are a set of required variables for the role: | Variable | Description | Required | |:---------|:------------|:---------| -|`amq_streams_zookeeper_auth_user` | Zookeeper user to authenticate. Mandatory if `amq_streams_zookeeper_auth_enabled: true` | '' | -|`amq_streams_zookeeper_auth_pass` | Zookeeper user password to authenticate. Mandatory if `amq_streams_zookeeper_auth_enabled: true`| '' | +|`redhat_streams_zookeeper_auth_user` | Zookeeper user to authenticate. Mandatory if `amq_streams_zookeeper_auth_enabled: true` | '' | +|`redhat_streams_zookeeper_auth_pass` | Zookeeper user password to authenticate. Mandatory if `redhat_streams_zookeeper_auth_enabled: true`| '' | ## License diff --git a/roles/amq_streams_zookeeper/defaults/main.yml b/roles/amq_streams_zookeeper/defaults/main.yml index af20f17..6d5dfce 100644 --- a/roles/amq_streams_zookeeper/defaults/main.yml +++ b/roles/amq_streams_zookeeper/defaults/main.yml @@ -1,54 +1,54 @@ --- -amq_streams_zookeeper_enabled: true -amq_streams_zookeeper_config: /etc/amq_streams_zookeeper.properties -amq_streams_zookeeper_config_template: templates/zookeeper.properties.j2 -amq_streams_zookeeper_server_start: "{{ amq_streams_common_home }}/bin/zookeeper-server-start.sh" -amq_streams_zookeeper_user: 'amq_streams_zookeeper' -amq_streams_zookeeper_group: 'amq_streams' -amq_streams_zookeeper_service_name: 'amq_streams_zookeeper' -amq_streams_zookeeper_service_config_template: 'templates/service.conf.j2' -amq_streams_zookeeper_restart_requires_priv_escalation: yes -amq_streams_zookeeper_service_env_file: '/etc/zookeeper.conf' -amq_streams_zookeeper_data_dir: "/var/lib/{{ amq_streams_zookeeper_service_name }}/" -amq_streams_zookeeper_logs_dir: "/var/log/{{ amq_streams_zookeeper_service_name }}/" -amq_streams_zookeeper_data_require_priv_escalation: yes -amq_streams_zookeeper_max_client_cnxns: 0 -amq_streams_zookeeper_admin_enable_server: 'true' -amq_streams_zookeeper_admin_server_port: 8080 -amq_streams_zookeeper_admin_server_port_delay: 0 -amq_streams_zookeeper_admin_server_skip_wait: False -amq_streams_zookeeper_instance_count_enabled: true -amq_streams_zookeeper_inventory_group_name: 'zookeepers' -amq_streams_zookeeper_instance_count: "{{ groups[amq_streams_zookeeper_inventory_group_name] | length }}" -amq_streams_zookeeper_4wl_commands_whitelist: stat,dump # "*" -amq_streams_zookeeper_java_heap_opts: '-Xmx512M -Xms512M' -amq_streams_zookeeper_sysctl_vm_max_map_count: 65530 -amq_streams_zookeeper_ulimit_max_value: 1024 +redhat_streams_zookeeper_enabled: true +redhat_streams_zookeeper_config: /etc/redhat_streams_zookeeper.properties +redhat_streams_zookeeper_config_template: templates/zookeeper.properties.j2 +redhat_streams_zookeeper_server_start: "{{ redhat_streams_common_home }}/bin/zookeeper-server-start.sh" +redhat_streams_zookeeper_user: 'redhat_streams_zookeeper' +redhat_streams_zookeeper_group: 'redhat_streams' +redhat_streams_zookeeper_service_name: 'redhat_streams_zookeeper' +redhat_streams_zookeeper_service_config_template: 'templates/service.conf.j2' +redhat_streams_zookeeper_restart_requires_priv_escalation: yes +redhat_streams_zookeeper_service_env_file: '/etc/zookeeper.conf' +redhat_streams_zookeeper_data_dir: "/var/lib/{{ redhat_streams_zookeeper_service_name }}/" +redhat_streams_zookeeper_logs_dir: "/var/log/{{ redhat_streams_zookeeper_service_name }}/" +redhat_streams_zookeeper_data_require_priv_escalation: yes +redhat_streams_zookeeper_max_client_cnxns: 0 +redhat_streams_zookeeper_admin_enable_server: 'true' +redhat_streams_zookeeper_admin_server_port: 8080 +redhat_streams_zookeeper_admin_server_port_delay: 0 +redhat_streams_zookeeper_admin_server_skip_wait: False +redhat_streams_zookeeper_instance_count_enabled: true +redhat_streams_zookeeper_inventory_group_name: 'zookeepers' +redhat_streams_zookeeper_instance_count: "{{ groups[redhat_streams_zookeeper_inventory_group_name] | length }}" +redhat_streams_zookeeper_4wl_commands_whitelist: stat,dump # "*" +redhat_streams_zookeeper_java_heap_opts: '-Xmx512M -Xms512M' +redhat_streams_zookeeper_sysctl_vm_max_map_count: 65530 +redhat_streams_zookeeper_ulimit_max_value: 1024 -amq_streams_zookeeper_host: localhost -amq_streams_zookeeper_port: 2181 -amq_streams_zookeeper_init_limit: 5 -amq_streams_zookeeper_sync_limit: 2 -amq_streams_zookeeper_cluster_port_start: 2888 -amq_streams_zookeeper_cluster_port_end: 3888 +redhat_streams_zookeeper_host: localhost +redhat_streams_zookeeper_port: 2181 +redhat_streams_zookeeper_init_limit: 5 +redhat_streams_zookeeper_sync_limit: 2 +redhat_streams_zookeeper_cluster_port_start: 2888 +redhat_streams_zookeeper_cluster_port_end: 3888 -amq_streams_zookeeper_inventory_group: "{{ groups[amq_streams_zookeeper_inventory_group_name] | default([]) }}" +redhat_streams_zookeeper_inventory_group: "{{ groups[redhat_streams_zookeeper_inventory_group_name] | default([]) }}" -amq_streams_firewalld_package_name: +redhat_streams_firewalld_package_name: - firewalld -amq_streams_firewalld_enabled: false +redhat_streams_firewalld_enabled: false # Zookeeper Authentication with SASL -amq_streams_zookeeper_auth_enabled: false -amq_streams_zookeeper_auth_config: /etc/zookeeper-jaas.conf -amq_streams_zookeeper_auth_config_template: templates/zookeeper-jaas.conf.j2 -amq_streams_zookeeper_auth_user: zookeeper -amq_streams_zookeeper_auth_pass: PLEASE_CHANGE_ME_I_AM_NO_GOOD_FOR_PRODUCTION +redhat_streams_zookeeper_auth_enabled: false +redhat_streams_zookeeper_auth_config: /etc/zookeeper-jaas.conf +redhat_streams_zookeeper_auth_config_template: templates/zookeeper-jaas.conf.j2 +redhat_streams_zookeeper_auth_user: zookeeper +redhat_streams_zookeeper_auth_pass: PLEASE_CHANGE_ME_I_AM_NO_GOOD_FOR_PRODUCTION -amq_streams_zookeeper_server_log_validation_min_size: 20 +redhat_streams_zookeeper_server_log_validation_min_size: 20 -amq_streams_zookeeper_prometheus_enabled: False -amq_streams_zookeeper_prometheus_port: 18080 -amq_streams_zookeeper_prometheus_bind_addr: '0.0.0.0' -amq_streams_zookeeper_prometheus_config_file: zk-config.yaml -amq_streams_zookeeper_prometheus_config_file_template: prometheus/zk-config.yaml.j2 +redhat_streams_zookeeper_prometheus_enabled: False +redhat_streams_zookeeper_prometheus_port: 18080 +redhat_streams_zookeeper_prometheus_bind_addr: '0.0.0.0' +redhat_streams_zookeeper_prometheus_config_file: zk-config.yaml +redhat_streams_zookeeper_prometheus_config_file_template: prometheus/zk-config.yaml.j2 diff --git a/roles/amq_streams_zookeeper/tasks/main.yml b/roles/amq_streams_zookeeper/tasks/main.yml index 6d635ed..9357e5f 100644 --- a/roles/amq_streams_zookeeper/tasks/main.yml +++ b/roles/amq_streams_zookeeper/tasks/main.yml @@ -1,73 +1,73 @@ --- - name: "Ensure user for zookeeper exists (if provided)." ansible.builtin.include_role: - name: amq_streams_common + name: redhat_streams_common tasks_from: prereqs.yml vars: - prereqs_user: "{{ amq_streams_zookeeper_user }}" - prereqs_group: "{{ amq_streams_zookeeper_group }}" + prereqs_user: "{{ redhat_streams_zookeeper_user }}" + prereqs_group: "{{ redhat_streams_zookeeper_group }}" - name: "Ensure OS has been properly tuned (RHEL specific)." ansible.builtin.include_role: - name: amq_streams_common + name: redhat_streams_common tasks_from: os_tuning.yml vars: - sysctl_vm_max_map_count: "{{ amq_streams_zookeeper_sysctl_vm_max_map_count }}" - ulimit_user: "{{ amq_streams_zookeeper_user }}" - ulimit_limit: "{{ amq_streams_zookeeper_ulimit_max_value }}" + sysctl_vm_max_map_count: "{{ redhat_streams_zookeeper_sysctl_vm_max_map_count }}" + ulimit_user: "{{ redhat_streams_zookeeper_user }}" + ulimit_limit: "{{ redhat_streams_zookeeper_ulimit_max_value }}" when: - - ansible_distribution == "RedHat" and amq_streams_common_systctl_update_enable is defined and amq_streams_common_systctl_update_enable + - ansible_distribution == "RedHat" and redhat_streams_common_systctl_update_enable is defined and redhat_streams_common_systctl_update_enable -- name: "Ensure Prometheus requirements are met (if enabled: {{ amq_streams_zookeeper_prometheus_enabled }}) - {{ amq_streams_zookeeper_prometheus_config_file_template }}." +- name: "Ensure Prometheus requirements are met (if enabled: {{ redhat_streams_zookeeper_prometheus_enabled }}) - {{ redhat_streams_zookeeper_prometheus_config_file_template }}." ansible.builtin.include_role: - name: amq_streams_common + name: redhat_streams_common tasks_from: prometheus.yml vars: - amq_streams_common_prometheus_port: "{{ amq_streams_zookeeper_prometheus_port }}" - amq_streams_common_prometheus_bind_addr: "{{ amq_streams_zookeeper_prometheus_bind_addr }}" - amq_streams_common_prometheus_config_file: "{{ amq_streams_zookeeper_prometheus_config_file }}" - amq_streams_common_prometheus_config_file_template: "{{ amq_streams_zookeeper_prometheus_config_file_template }}" + redhat_streams_common_prometheus_port: "{{ redhat_streams_zookeeper_prometheus_port }}" + redhat_streams_common_prometheus_bind_addr: "{{ redhat_streams_zookeeper_prometheus_bind_addr }}" + redhat_streams_common_prometheus_config_file: "{{ redhat_streams_zookeeper_prometheus_config_file }}" + redhat_streams_common_prometheus_config_file_template: "{{ redhat_streams_zookeeper_prometheus_config_file_template }}" when: - - amq_streams_zookeeper_prometheus_enabled is defined and amq_streams_zookeeper_prometheus_enabled + - redhat_streams_zookeeper_prometheus_enabled is defined and redhat_streams_zookeeper_prometheus_enabled - name: "Ensures Zookeeper data dir, myid and auth config (if enable) are set." - become: "{{ amq_streams_zookeeper_data_require_priv_escalation }}" + become: "{{ redhat_streams_zookeeper_data_require_priv_escalation }}" block: - name: "Ensure Zookeeper data dir exists and belongs to the appropriate user - if user is defined." ansible.builtin.file: - path: "{{ amq_streams_zookeeper_data_dir }}" + path: "{{ redhat_streams_zookeeper_data_dir }}" state: directory - owner: "{{ amq_streams_zookeeper_user | default(omit) }}" - group: "{{ amq_streams_zookeeper_group | default(omit) }}" + owner: "{{ redhat_streams_zookeeper_user | default(omit) }}" + group: "{{ redhat_streams_zookeeper_group | default(omit) }}" mode: 0755 when: - - amq_streams_zookeeper_data_dir is defined + - redhat_streams_zookeeper_data_dir is defined - name: "Configure 'myid' file based on the position in the zookeepers group or if it is defined on inventory" ansible.builtin.copy: - content: "{{ amq_streams_zookeeper_zookeeper_id | default(amq_streams_zookeeper_inventory_group.index(inventory_hostname) + 1) }}" - dest: "{{ amq_streams_zookeeper_data_dir }}/myid" - owner: "{{ amq_streams_zookeeper_user | default(omit) }}" - group: "{{ amq_streams_zookeeper_group | default(omit) }}" + content: "{{ redhat_streams_zookeeper_zookeeper_id | default(redhat_streams_zookeeper_inventory_group.index(inventory_hostname) + 1) }}" + dest: "{{ redhat_streams_zookeeper_data_dir }}/myid" + owner: "{{ redhat_streams_zookeeper_user | default(omit) }}" + group: "{{ redhat_streams_zookeeper_group | default(omit) }}" when: - - amq_streams_zookeeper_inventory_group is defined - - amq_streams_zookeeper_inventory_group | length > 0 + - redhat_streams_zookeeper_inventory_group is defined + - redhat_streams_zookeeper_inventory_group | length > 0 - name: "Configure Zookeeper authentication (if enabled)" ansible.builtin.template: - src: "{{ amq_streams_zookeeper_auth_config_template }}" - dest: "{{ amq_streams_zookeeper_auth_config }}" - owner: "{{ amq_streams_zookeeper_user | default(omit) }}" - group: "{{ amq_streams_zookeeper_group | default(omit) }}" + src: "{{ redhat_streams_zookeeper_auth_config_template }}" + dest: "{{ redhat_streams_zookeeper_auth_config }}" + owner: "{{ redhat_streams_zookeeper_user | default(omit) }}" + group: "{{ redhat_streams_zookeeper_group | default(omit) }}" mode: 0644 when: - - amq_streams_zookeeper_auth_enabled is defined and amq_streams_zookeeper_auth_enabled + - redhat_streams_zookeeper_auth_enabled is defined and redhat_streams_zookeeper_auth_enabled - name: "Enable Zookeeper authentication environment variable" ansible.builtin.set_fact: - amq_streams_zookeeper_java_opts: "-Djava.security.auth.login.config={{ amq_streams_zookeeper_auth_config }}" + redhat_streams_zookeeper_java_opts: "-Djava.security.auth.login.config={{ redhat_streams_zookeeper_auth_config }}" when: - - amq_streams_zookeeper_auth_enabled is defined and amq_streams_zookeeper_auth_enabled + - redhat_streams_zookeeper_auth_enabled is defined and redhat_streams_zookeeper_auth_enabled - name: "Configure Zookeeper as a systemd service." ansible.builtin.include_tasks: service.yml diff --git a/roles/amq_streams_zookeeper/templates/zookeeper.properties.j2 b/roles/amq_streams_zookeeper/templates/zookeeper.properties.j2 index ccad8eb..c43f9a1 100644 --- a/roles/amq_streams_zookeeper/templates/zookeeper.properties.j2 +++ b/roles/amq_streams_zookeeper/templates/zookeeper.properties.j2 @@ -16,42 +16,42 @@ # limitations under the License. # the directory where the snapshot is stored. -dataDir={{ amq_streams_zookeeper_data_dir }} +dataDir={{ redhat_streams_zookeeper_data_dir }} # the port at which the clients will connect -clientPort={{ amq_streams_zookeeper_port }} +clientPort={{ redhat_streams_zookeeper_port }} # disable the per-ip limit on the number of connections since this is a non-production config -maxClientCnxns={{ amq_streams_zookeeper_max_client_cnxns }} +maxClientCnxns={{ redhat_streams_zookeeper_max_client_cnxns }} # Enable command list - https://zookeeper.apache.org/doc/r3.5.5/zookeeperAdmin.html -4lw.commands.whitelist={{ amq_streams_zookeeper_4wl_commands_whitelist }} +4lw.commands.whitelist={{ redhat_streams_zookeeper_4wl_commands_whitelist }} # Disable the adminserver by default to avoid port conflicts. # Set the port to something non-conflicting if choosing to enable this -admin.enableServer={{ amq_streams_zookeeper_admin_enable_server }} -{% if amq_streams_zookeeper_admin_enable_server %} -admin.serverPort={{ amq_streams_zookeeper_admin_server_port }} +admin.enableServer={{ redhat_streams_zookeeper_admin_enable_server }} +{% if redhat_streams_zookeeper_admin_enable_server %} +admin.serverPort={{ redhat_streams_zookeeper_admin_server_port }} {% endif %} # Amount of time to allow followers to connect and sync to the cluster leader. # The time is specified as a number of ticks -initLimit={{ amq_streams_zookeeper_init_limit }} +initLimit={{ redhat_streams_zookeeper_init_limit }} # Amount of time for which followers can be behind the leader. # The time is specified as a number of ticks -syncLimit={{ amq_streams_zookeeper_sync_limit }} +syncLimit={{ redhat_streams_zookeeper_sync_limit }} # List of servers which should be members of the Zookeeper cluster. -{% for zknode in amq_streams_zookeeper_inventory_group %} -server.{% if hostvars[zknode]['amq_streams_zookeeper_zookeeper_id'] is defined -%} -{{ hostvars[zknode]['amq_streams_zookeeper_zookeeper_id'] }} +{% for zknode in redhat_streams_zookeeper_inventory_group %} +server.{% if hostvars[zknode]['redhat_streams_zookeeper_zookeeper_id'] is defined -%} +{{ hostvars[zknode]['redhat_streams_zookeeper_zookeeper_id'] }} {%- else -%} {{ loop.index }} -{%- endif %}={{ zknode }}:{{ amq_streams_zookeeper_cluster_port_start }}:{{ amq_streams_zookeeper_cluster_port_end }}:participant;{{ zknode }}:{{ amq_streams_zookeeper_port }} +{%- endif %}={{ zknode }}:{{ redhat_streams_zookeeper_cluster_port_start }}:{{ redhat_streams_zookeeper_cluster_port_end }}:participant;{{ zknode }}:{{ redhat_streams_zookeeper_port }} {% endfor %} -{% if amq_streams_zookeeper_auth_enabled %} +{% if redhat_streams_zookeeper_auth_enabled %} # Zookeeper Authentication # Server-to-Server Authentication quorum.auth.enableSasl=true