diff --git a/data/ansible/roles/grafana/defaults/main.yaml b/data/ansible/roles/grafana/defaults/main.yaml new file mode 100644 index 000000000..fb3a8bd05 --- /dev/null +++ b/data/ansible/roles/grafana/defaults/main.yaml @@ -0,0 +1,12 @@ +--- +grafana_version: 11.1.3 +grafana_user: grafana +grafana_install_dir: /opt/grafana +grafana_data_dir: /var/lib/grafana +grafana_logs_dir: /var/log/grafana +grafana_config_dir: /etc/grafana + +grafana_service_enabled: false +grafana_service_state: stopped + +grafana_config_file: '{{ grafana_install_dir }}/conf/defaults.ini' # supports either the path to a file or a j2 template diff --git a/data/ansible/roles/grafana/handlers/main.yaml b/data/ansible/roles/grafana/handlers/main.yaml new file mode 100644 index 000000000..1fcb575c2 --- /dev/null +++ b/data/ansible/roles/grafana/handlers/main.yaml @@ -0,0 +1,8 @@ +--- +- name: Restart grafana + become: true + ansible.builtin.systemd_service: + name: grafana + state: restarted + daemon_reload: true + when: grafana_service_state == 'started' diff --git a/data/ansible/roles/grafana/tasks/main.yaml b/data/ansible/roles/grafana/tasks/main.yaml new file mode 100644 index 000000000..4adc4e18f --- /dev/null +++ b/data/ansible/roles/grafana/tasks/main.yaml @@ -0,0 +1,91 @@ +--- +- name: Create grafana user + become: true + ansible.builtin.user: + name: '{{ grafana_user }}' + state: present + system: true + createhome: false + +- name: Check current Grafana version + ansible.builtin.command: "{{ grafana_install_dir }}/bin/grafana --version" + register: grafana_current_version + ignore_errors: true + changed_when: false + +- name: Remove existing Grafana installation if version differs + become: true + ansible.builtin.file: + path: "{{ grafana_install_dir }}" + state: absent + when: grafana_current_version.rc == 0 and grafana_version not in grafana_current_version.stdout + +- name: Create grafana directories + become: true + ansible.builtin.file: + path: '{{ item }}' + state: directory + owner: '{{ grafana_user }}' + group: '{{ grafana_user }}' + mode: '0755' + loop: + - '{{ grafana_install_dir }}' + - '{{ grafana_data_dir }}' + - '{{ grafana_logs_dir }}' + - '{{ grafana_config_dir }}' + +- name: Download and extract grafana + become: true + ansible.builtin.unarchive: + src: 'https://dl.grafana.com/oss/release/grafana-{{ grafana_version }}.linux-amd64.tar.gz' + dest: '{{ grafana_install_dir }}' + remote_src: true + owner: '{{ grafana_user }}' + group: '{{ grafana_user }}' + extra_opts: [--strip-components=1] + notify: Restart grafana + when: grafana_current_version.rc != 0 or grafana_version not in grafana_current_version.stdout + +- name: Handle grafana configuration file + block: + - name: Copy grafana configuration file if a direct path + become: true + ansible.builtin.copy: + src: '{{ grafana_config_file }}' + dest: '{{ grafana_config_dir }}/grafana.ini' + owner: '{{ grafana_user }}' + group: '{{ grafana_user }}' + mode: '0644' + remote_src: true + notify: Restart grafana + when: grafana_config_file is defined and '/' in grafana_config_file + + - name: Render grafana configuration template + become: true + ansible.builtin.template: + src: '{{ grafana_config_file }}' + dest: '{{ grafana_config_dir }}/grafana.ini' + owner: '{{ grafana_user }}' + group: '{{ grafana_user }}' + mode: '0644' + notify: Restart grafana + when: grafana_config_file is defined and '/' not in grafana_config_file + + when: grafana_config_file is defined and grafana_config_file != '' + +- name: Create grafana systemd service file + become: true + ansible.builtin.template: + src: grafana.service.j2 + dest: /etc/systemd/system/grafana.service + mode: '0644' + notify: Restart grafana + +- name: Ensure grafana service is in desired state + become: true + ansible.builtin.systemd_service: + name: grafana + state: '{{ grafana_service_state }}' + enabled: '{{ grafana_service_enabled }}' + daemon_reload: true + when: grafana_service_state == 'stopped' or not grafana_service_enabled diff --git a/data/ansible/roles/grafana/templates/grafana.service.j2 b/data/ansible/roles/grafana/templates/grafana.service.j2 new file mode 100644 index 000000000..7ba685153 --- /dev/null +++ b/data/ansible/roles/grafana/templates/grafana.service.j2 @@ -0,0 +1,20 @@ +[Unit] +Description=Grafana instance +Documentation=http://docs.grafana.org +Wants=network-online.target +After=network-online.target + +[Service] +User={{ grafana_user }} +Group={{ grafana_user }} +Type=simple +ExecStart={{ grafana_install_dir }}/bin/grafana server \ + --config={{ grafana_config_dir }}/grafana.ini \ + --homepath={{ grafana_install_dir }} \ + cfg:default.paths.data={{ grafana_data_dir }} \ + cfg:default.paths.logs={{ grafana_logs_dir }} + +Restart=always + +[Install] +WantedBy=multi-user.target