From b492422c89310579118b8fefbc1145e0be7ce927 Mon Sep 17 00:00:00 2001 From: Webster Mudge Date: Thu, 31 Jul 2025 17:38:41 -0400 Subject: [PATCH 1/3] Update (and rename) node exporter role for ansible-lint, argument specs, README, and future redirects Signed-off-by: Webster Mudge --- meta/runtime.yml | 11 ++- roles/node_exporter/README.md | 75 +++++++++++++++++++ roles/node_exporter/defaults/main.yml | 23 ++++++ roles/node_exporter/handlers/main.yml | 27 +++++++ roles/node_exporter/meta/argument_specs.yml | 54 +++++++++++++ roles/node_exporter/tasks/main.yml | 63 ++++++++++++++++ .../templates/node_exporter.service.j2 | 11 +++ 7 files changed, 261 insertions(+), 3 deletions(-) create mode 100644 roles/node_exporter/README.md create mode 100644 roles/node_exporter/defaults/main.yml create mode 100644 roles/node_exporter/handlers/main.yml create mode 100644 roles/node_exporter/meta/argument_specs.yml create mode 100644 roles/node_exporter/tasks/main.yml create mode 100644 roles/node_exporter/templates/node_exporter.service.j2 diff --git a/meta/runtime.yml b/meta/runtime.yml index 87e89dc5..3d3e0217 100644 --- a/meta/runtime.yml +++ b/meta/runtime.yml @@ -1,6 +1,6 @@ --- -# Copyright 2023 Cloudera, Inc. All Rights Reserved. +# Copyright 2025 Cloudera, Inc. All Rights Reserved. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. @@ -14,12 +14,17 @@ # See the License for the specific language governing permissions and # limitations under the License. -requires_ansible: ">=2.10" +requires_ansible: ">=2.15.0" plugin_routing: - role: + role: # Not yet supported rdbms.server: deprecation: removal_version: 3.0.0 warning_text: Use cloudera.exe.rdbms_server instead of this nested role. redirect: cloudera.exe.rdbms_server + nodeexporter: + deprecation: + removal_version: 6.0.0 + warning_text: Please update references to the renamed role, cloudera.exe.node_exporter + redirect: cloudera.exe.node_exporter diff --git a/roles/node_exporter/README.md b/roles/node_exporter/README.md new file mode 100644 index 00000000..0e2c0ccf --- /dev/null +++ b/roles/node_exporter/README.md @@ -0,0 +1,75 @@ +# node_exporter + +Install Node Exporter. + +This role handles the download, installation, and configuration of the Prometheus Node Exporter on a Linux host. It ensures the Node Exporter is set up as a systemd service, running under a dedicated user and group, making it ready to expose host-level metrics for Prometheus scraping. + +The role will: +- Create a dedicated system user and group for the Node Exporter service. +- Download the specified Node Exporter tarball from the provided URL. +- Extract the Node Exporter binary to the configured directory. +- Set up a systemd service file for Node Exporter. +- Enable and start the Node Exporter service, ensuring it runs on system boot. + +## Requirements + +- Target host must have `systemd` for service management. +- Internet access on the target host to download the Node Exporter tarball. + +## Dependencies + +None. + +## Role Variables + +| Parameter | Type | Default Value | Required | Description | +|----------------------------------|------|------------------------------------------------------------------------------------|----------|-------------------------------------------------| +| `node_exporter_directory` | `path`| `/etc/node_exporter` | `false` | The directory where Node Exporter will be installed. | +| `node_exporter_tarball_url` | `str`| `https://github.com/prometheus/node_exporter/releases/download/v1.7.0/node_exporter-1.7.0.linux-amd64.tar.gz`| `false` | URL to the Node Exporter installation package (tarball). | +| `node_exporter_tarball_file` | `str`| `node_exporter.tar.gz` | `false` | The intermediate filename to use for the downloaded tarball. | +| `node_exporter_service_directory`| `path`| `/etc/systemd/system/node_exporter.service` | `false` | Full path to the systemd service file for Node Exporter. | +| `node_exporter_user` | `str`| `node_exporter` | `false` | The system username under which the Node Exporter service will run. | +| `node_exporter_group` | `str`| `node_exporter` | `false` | The system group under which the Node Exporter service will run. | + +## Examples + +```yaml +- name: Install Node Exporter with default configuration + ansible.builtin.import_role: + name: node_exporter + # No variables needed here as defaults will be used + +- name: Install Node Exporter v1.8.0 + ansible.builtin.import_role: + name: node_exporter + vars: + node_exporter_tarball_url: "https://github.com/prometheus/node_exporter/releases/download/v1.8.0/node_exporter-1.8.0.linux-amd64.tar.gz" + node_exporter_tarball_file: "node_exporter-1.8.0.tar.gz" # Update filename for clarity + +- name: Install Node Exporter with custom paths and user + ansible.builtin.import_role: + name: node_exporter + vars: + node_exporter_directory: "/opt/monitoring/node_exporter" + node_exporter_service_directory: "/usr/lib/systemd/system/node_exporter.service" # Common location on some distros + node_exporter_user: "prometheus_exporter" + node_exporter_group: "prometheus_exporter" +``` + +## License + +``` +Copyright 2025 Cloudera, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + https://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +``` diff --git a/roles/node_exporter/defaults/main.yml b/roles/node_exporter/defaults/main.yml new file mode 100644 index 00000000..506f74bd --- /dev/null +++ b/roles/node_exporter/defaults/main.yml @@ -0,0 +1,23 @@ +--- + +# Copyright 2024 Cloudera, Inc. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +node_exporter_directory: /etc/node_exporter +node_exporter_tarball_url: https://github.com/prometheus/node_exporter/releases/download/v1.7.0/node_exporter-1.7.0.linux-amd64.tar.gz +node_exporter_tarball_file: node_exporter.tar.gz +node_exporter_service_directory: /etc/systemd/system/node_exporter.service + +node_exporter_user: nodeexporter +node_exporter_group: nodeexporter diff --git a/roles/node_exporter/handlers/main.yml b/roles/node_exporter/handlers/main.yml new file mode 100644 index 00000000..643f82d3 --- /dev/null +++ b/roles/node_exporter/handlers/main.yml @@ -0,0 +1,27 @@ +# Copyright 2025 Cloudera, Inc. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +--- + +- name: Start node_exporter service + block: + - name: Reload systemd daemon + ansible.builtin.systemd: + daemon_reload: true + + - name: Enable and start node_exporter service + ansible.builtin.systemd: + name: node_exporter + state: started + enabled: true diff --git a/roles/node_exporter/meta/argument_specs.yml b/roles/node_exporter/meta/argument_specs.yml new file mode 100644 index 00000000..52ece15c --- /dev/null +++ b/roles/node_exporter/meta/argument_specs.yml @@ -0,0 +1,54 @@ +# Copyright 2025 Cloudera, Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +--- + +argument_specs: + main: + short_description: Install Node Exporter + description: + - Download and install the Node Exporter (node_exporter) for Prometheus. + author: Cloudera Labs + version_added: 5.0.0 + options: + node_exporter_directory: + description: Configuration directory + type: path + required: false + default: /etc/node_exporter + node_exporter_tarball_url: + description: URL to the installation package + type: str + required: false + default: https://github.com/prometheus/node_exporter/releases/download/v1.7.0/node_exporter-1.7.0.linux-amd64.tar.gz + node_exporter_tarball_file: + description: The intermediate name of the installation package + type: str + required: false + default: node_exporter.tar.gz + node_exporter_service_directory: + description: systemd services directory + type: path + required: false + default: /etc/systemd/system/node_exporter.service + node_exporter_user: + description: Service username + type: str + required: false + default: node_exporter + node_exporter_group: + description: Service group + type: str + required: false + default: node_exporter diff --git a/roles/node_exporter/tasks/main.yml b/roles/node_exporter/tasks/main.yml new file mode 100644 index 00000000..f0b09556 --- /dev/null +++ b/roles/node_exporter/tasks/main.yml @@ -0,0 +1,63 @@ +# Copyright 2025 Cloudera, Inc. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +--- + +- name: Create nodeexporter group + ansible.builtin.user: + name: "{{ node_exporter_group }}" + +- name: Create nodeexporter user + ansible.builtin.user: + name: "{{ node_exporter_user }}" + group: "{{ node_exporter_group }}" + +- name: Create node_exporter directory + ansible.builtin.file: + path: "{{ node_exporter_directory }}" + mode: "0755" + state: directory + +- name: Create a temporary directory + ansible.builtin.tempfile: + state: directory + register: __exporter_tmp + +- name: Download node_exporter tarball + ansible.builtin.get_url: + url: "{{ node_exporter_tarball_url }}" + dest: "{{ __exporter_tmp.path }}/{{ node_exporter_tarball_file }}" + mode: "0755" + +- name: Extract tarball + ansible.builtin.unarchive: + src: "{{ __exporter_tmp.path }}/{{ node_exporter_tarball_file }}" + dest: "{{ node_exporter_directory }}" + extra_opts: --strip-components=1 + owner: "{{ node_exporter_user }}" + group: "{{ node_exporter_group }}" + remote_src: true + +- name: Remove the temporary directory + when: __exporter_tmp is defined + ansible.builtin.file: + path: "{{ __exporter_tmp.path }}" + state: absent + +- name: Copy node exporter service file + ansible.builtin.template: + src: node_exporter.service.j2 + dest: "{{ node_exporter_service_directory }}" + mode: "0755" + notify: Start node_exporter service diff --git a/roles/node_exporter/templates/node_exporter.service.j2 b/roles/node_exporter/templates/node_exporter.service.j2 new file mode 100644 index 00000000..61a79fae --- /dev/null +++ b/roles/node_exporter/templates/node_exporter.service.j2 @@ -0,0 +1,11 @@ +[Unit] +Description=Node Exporter +Wants=network-online.target +After=network-online.target + +[Service] +User={{ node_exporter_user }} +ExecStart={{ node_exporter_directory }}/node_exporter + +[Install] +WantedBy=default.target From 3d6c767b31007252c34b1f10392f989e1e3e62c0 Mon Sep 17 00:00:00 2001 From: Webster Mudge Date: Thu, 31 Jul 2025 17:38:43 -0400 Subject: [PATCH 2/3] Remove nodeexporter role (was renamed) Signed-off-by: Webster Mudge --- roles/nodeexporter/README.md | 17 ----- roles/nodeexporter/defaults/main.yml | 23 ------ roles/nodeexporter/tasks/main.yml | 72 ------------------- .../templates/node_exporter.service.j2 | 11 --- 4 files changed, 123 deletions(-) delete mode 100644 roles/nodeexporter/README.md delete mode 100644 roles/nodeexporter/defaults/main.yml delete mode 100644 roles/nodeexporter/tasks/main.yml delete mode 100644 roles/nodeexporter/templates/node_exporter.service.j2 diff --git a/roles/nodeexporter/README.md b/roles/nodeexporter/README.md deleted file mode 100644 index ced418ba..00000000 --- a/roles/nodeexporter/README.md +++ /dev/null @@ -1,17 +0,0 @@ - - -# nodeexporter diff --git a/roles/nodeexporter/defaults/main.yml b/roles/nodeexporter/defaults/main.yml deleted file mode 100644 index 506f74bd..00000000 --- a/roles/nodeexporter/defaults/main.yml +++ /dev/null @@ -1,23 +0,0 @@ ---- - -# Copyright 2024 Cloudera, Inc. All Rights Reserved. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -node_exporter_directory: /etc/node_exporter -node_exporter_tarball_url: https://github.com/prometheus/node_exporter/releases/download/v1.7.0/node_exporter-1.7.0.linux-amd64.tar.gz -node_exporter_tarball_file: node_exporter.tar.gz -node_exporter_service_directory: /etc/systemd/system/node_exporter.service - -node_exporter_user: nodeexporter -node_exporter_group: nodeexporter diff --git a/roles/nodeexporter/tasks/main.yml b/roles/nodeexporter/tasks/main.yml deleted file mode 100644 index 299c3283..00000000 --- a/roles/nodeexporter/tasks/main.yml +++ /dev/null @@ -1,72 +0,0 @@ ---- -# Copyright 2024 Cloudera, Inc. All Rights Reserved. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -- name: Create nodexporter group - ansible.builtin.user: - name: "{{ node_exporter_group }}" - -- name: Create nodexporter user - ansible.builtin.user: - name: "{{ node_exporter_user }}" - group: "{{ node_exporter_group }}" - -- name: Create node_exporter directory - ansible.builtin.file: - path: "{{ node_exporter_directory }}" - state: directory - -- name: Create a temporary directory - ansible.builtin.tempfile: - state: directory - register: __exporter_tmp - -- name: Download node_exporter tarball - ansible.builtin.get_url: - url: "{{ node_exporter_tarball_url }}" - dest: "{{ __exporter_tmp.path }}/{{ node_exporter_tarball_file }}" - -- name: Extract tarball - ansible.builtin.unarchive: - src: "{{ __exporter_tmp.path }}/{{ node_exporter_tarball_file }}" - dest: "{{ node_exporter_directory }}" - extra_opts: --strip-components=1 - owner: "{{ node_exporter_user }}" - group: "{{ node_exporter_group }}" - remote_src: true - -- name: Remove the temporary directory - when: __exporter_tmp is defined - ansible.builtin.file: - path: "{{ __exporter_tmp.path }}" - state: absent - -- name: Copy Node Exporter service file - ansible.builtin.template: - src: node_exporter.service.j2 - dest: "{{ node_exporter_service_directory }}" - register: __exporter_service - -- name: Start and enable node_exporter service - when: __exporter_service.changed - block: - - name: Reload systemd daemon - ansible.builtin.systemd: - daemon_reload: true - - - name: Enable and start node_exporter service - ansible.builtin.systemd: - name: node_exporter - state: started - enabled: true diff --git a/roles/nodeexporter/templates/node_exporter.service.j2 b/roles/nodeexporter/templates/node_exporter.service.j2 deleted file mode 100644 index 61a79fae..00000000 --- a/roles/nodeexporter/templates/node_exporter.service.j2 +++ /dev/null @@ -1,11 +0,0 @@ -[Unit] -Description=Node Exporter -Wants=network-online.target -After=network-online.target - -[Service] -User={{ node_exporter_user }} -ExecStart={{ node_exporter_directory }}/node_exporter - -[Install] -WantedBy=default.target From d038b7ceba5103d3bf2456f9bf4f7a2dcb7a8b41 Mon Sep 17 00:00:00 2001 From: Webster Mudge Date: Thu, 31 Jul 2025 17:38:45 -0400 Subject: [PATCH 3/3] Add symlink to renamed node exporter role Signed-off-by: Webster Mudge --- roles/nodeexporter | 1 + 1 file changed, 1 insertion(+) create mode 120000 roles/nodeexporter diff --git a/roles/nodeexporter b/roles/nodeexporter new file mode 120000 index 00000000..15c51261 --- /dev/null +++ b/roles/nodeexporter @@ -0,0 +1 @@ +node_exporter \ No newline at end of file