From 398aa2a2a6376fb6d41f5a44edcdafe2dce8b8f6 Mon Sep 17 00:00:00 2001 From: ionutboangiu Date: Tue, 30 Jul 2024 17:02:02 +0300 Subject: [PATCH] Add prometheus ansible role --- .../roles/prometheus/defaults/main.yaml | 13 +++ .../roles/prometheus/handlers/main.yaml | 8 ++ data/ansible/roles/prometheus/tasks/main.yaml | 89 +++++++++++++++++++ .../templates/prometheus.service.j2 | 17 ++++ 4 files changed, 127 insertions(+) create mode 100644 data/ansible/roles/prometheus/defaults/main.yaml create mode 100644 data/ansible/roles/prometheus/handlers/main.yaml create mode 100644 data/ansible/roles/prometheus/tasks/main.yaml create mode 100644 data/ansible/roles/prometheus/templates/prometheus.service.j2 diff --git a/data/ansible/roles/prometheus/defaults/main.yaml b/data/ansible/roles/prometheus/defaults/main.yaml new file mode 100644 index 000000000..055e35932 --- /dev/null +++ b/data/ansible/roles/prometheus/defaults/main.yaml @@ -0,0 +1,13 @@ +--- +prometheus_version: 2.53.1 +prometheus_user: prometheus +prometheus_install_dir: /opt/prometheus +prometheus_config_dir: /etc/prometheus +prometheus_data_dir: /var/lib/prometheus + +prometheus_web_listen_address: 0.0.0.0:9090 + +prometheus_service_enabled: false +prometheus_service_state: stopped + +prometheus_config_file: '{{ prometheus_install_dir }}/prometheus.yml' # supports either the path to a file or a j2 template diff --git a/data/ansible/roles/prometheus/handlers/main.yaml b/data/ansible/roles/prometheus/handlers/main.yaml new file mode 100644 index 000000000..9e424b9f2 --- /dev/null +++ b/data/ansible/roles/prometheus/handlers/main.yaml @@ -0,0 +1,8 @@ +--- +- name: Restart prometheus + become: true + ansible.builtin.systemd_service: + name: prometheus + state: restarted + daemon_reload: true + when: prometheus_service_state == 'started' diff --git a/data/ansible/roles/prometheus/tasks/main.yaml b/data/ansible/roles/prometheus/tasks/main.yaml new file mode 100644 index 000000000..244e7c4ab --- /dev/null +++ b/data/ansible/roles/prometheus/tasks/main.yaml @@ -0,0 +1,89 @@ +--- +- name: Create prometheus user + become: true + ansible.builtin.user: + name: '{{ prometheus_user }}' + state: present + system: true + createhome: no + +- name: Check current Prometheus version + ansible.builtin.command: "{{ prometheus_install_dir }}/prometheus --version" + register: prometheus_current_version + ignore_errors: true + changed_when: false + +- name: Remove existing Prometheus installation if version differs + become: true + ansible.builtin.file: + path: "{{ prometheus_install_dir }}" + state: absent + when: prometheus_current_version.rc == 0 and prometheus_version not in prometheus_current_version.stdout + +- name: Create prometheus data and config directories + become: true + ansible.builtin.file: + path: '{{ item }}' + state: directory + owner: '{{ prometheus_user }}' + group: '{{ prometheus_user }}' + mode: '0755' + loop: + - '{{ prometheus_config_dir }}' + - '{{ prometheus_data_dir }}' + - '{{ prometheus_install_dir }}' + +- name: Download and extract prometheus + become: true + ansible.builtin.unarchive: + src: 'https://github.com/prometheus/prometheus/releases/download/v{{ prometheus_version }}/prometheus-{{ prometheus_version }}.linux-amd64.tar.gz' + dest: '{{ prometheus_install_dir }}' + remote_src: true + owner: '{{ prometheus_user }}' + group: '{{ prometheus_user }}' + extra_opts: [--strip-components=1] + notify: Restart prometheus + when: prometheus_current_version.rc != 0 or prometheus_version not in prometheus_current_version.stdout + +- name: Handle prometheus configuration file + block: + - name: Copy prometheus configuration file if a direct path + become: true + ansible.builtin.copy: + src: '{{ prometheus_config_file }}' + dest: '{{ prometheus_config_dir }}/prometheus.yml' + owner: '{{ prometheus_user }}' + group: '{{ prometheus_user }}' + mode: '0644' + remote_src: true + notify: Restart prometheus + when: prometheus_config_file is defined and '/' in prometheus_config_file + + - name: Render prometheus configuration template + become: true + ansible.builtin.template: + src: '{{ prometheus_config_file }}' + dest: '{{ prometheus_config_dir }}/prometheus.yml' + owner: '{{ prometheus_user }}' + group: '{{ prometheus_user }}' + mode: '0644' + notify: Restart prometheus + when: prometheus_config_file is defined and '/' not in prometheus_config_file + + when: prometheus_config_file is defined and prometheus_config_file != '' + +- name: Create prometheus systemd service file + become: true + ansible.builtin.template: + src: prometheus.service.j2 + dest: /etc/systemd/system/prometheus.service + mode: '0644' + notify: Restart prometheus + +- name: Ensure prometheus service is in desired state + become: true + ansible.builtin.systemd_service: + name: prometheus + state: '{{ prometheus_service_state }}' + enabled: '{{ prometheus_service_enabled }}' + when: prometheus_service_state == 'stopped' or prometheus_service_enabled == false diff --git a/data/ansible/roles/prometheus/templates/prometheus.service.j2 b/data/ansible/roles/prometheus/templates/prometheus.service.j2 new file mode 100644 index 000000000..8f1d0e379 --- /dev/null +++ b/data/ansible/roles/prometheus/templates/prometheus.service.j2 @@ -0,0 +1,17 @@ +[Unit] +Description=Prometheus +Wants=network-online.target +After=network-online.target + +[Service] +User={{ prometheus_user }} +Group={{ prometheus_user }} +Type=simple +ExecStart={{ prometheus_install_dir }}/prometheus \ + --config.file={{ prometheus_config_dir }}/prometheus.yml \ + --storage.tsdb.path={{ prometheus_data_dir }} \ + --web.listen-address={{ prometheus_web_listen_address }} +Restart=always + +[Install] +WantedBy=multi-user.target