From 872179cbcda6739340a0de44946cc8a2ddf390db Mon Sep 17 00:00:00 2001 From: phil Date: Wed, 15 Nov 2023 12:32:00 +0100 Subject: [PATCH] Add Promehteus Exporter --- README.md | 12 +++-------- defaults/main.yml | 4 ++++ handlers/main.yml | 7 +++++++ tasks/main.yml | 5 +++++ tasks/prometheus.yml | 21 ++++++++++++++++++++ templates/systemd/phpfpm_exporter.service.j2 | 13 ++++++++++++ 6 files changed, 53 insertions(+), 9 deletions(-) create mode 100644 tasks/prometheus.yml create mode 100644 templates/systemd/phpfpm_exporter.service.j2 diff --git a/README.md b/README.md index 0f445fa..42339e5 100644 --- a/README.md +++ b/README.md @@ -10,15 +10,6 @@ lassen sich daraus Services für verschiedene Anwendungen erstellen. Für die PHP-Konfiguration sind verschiedene defaults gesetzt. Über die jeweilige `host_vars` lassen sich im Dictionary `php` die defaults überschreiben. -| Varible | Wert | -|--|--| -| date_timezone | string | -| default_charset | string | -| max_execution_time | int | -| memory_limit | string | -| post_max_size | string | -| upload_max_filesize | string | - Beispiel: ```YAML php: @@ -26,6 +17,9 @@ php: post_max_size: 30M ``` +Durch setzen der Variable `phpfpm_exporter: true` wird ein [Prometheus Exporter](https://github.com/Lusitaniae/phpfpm_exporter) +installiert. Das zugehörife [Grafana Dashboard](https://grafana.com/grafana/dashboards/5714-php-fpm-multi-pool/) trägt die ID `5714`. + ## Nutzerkonto und PHP-FPM-Service anlegen Per Ansible Tag kann ein Systemkonto und ein PHP-FPM-Socket und Service angelegt werden. Am Beispiel des playbooks `php.yml`: diff --git a/defaults/main.yml b/defaults/main.yml index 57d4d2f..e354767 100644 --- a/defaults/main.yml +++ b/defaults/main.yml @@ -18,3 +18,7 @@ php_fpm_config: assert.active: "Off" mail.add_x_header: "Off" session.use_strict_mode: 1 + +phpfpm_exporter_github_api_url: https://api.github.com/repos/Lusitaniae/phpfpm_exporter/releases/latest +phpfpm_exporter_socket_directories: /run/php/ +phpfpm_exporter_listen_address: ":9253" diff --git a/handlers/main.yml b/handlers/main.yml index f0d9b28..8c209d4 100644 --- a/handlers/main.yml +++ b/handlers/main.yml @@ -21,3 +21,10 @@ - name: Reload systemd ansible.builtin.systemd: daemon_reload: true + +- name: Start phpfpm_exporter + ansible.builtin.systemd: + name: phpfpm_exporter + daemon_reload: true + state: started + enabled: true diff --git a/tasks/main.yml b/tasks/main.yml index a1bcca7..fc3d345 100644 --- a/tasks/main.yml +++ b/tasks/main.yml @@ -18,3 +18,8 @@ - name: User tasks ansible.builtin.import_tasks: user.yml tags: never, user + +- name: Prometheus exporter + ansible.builtin.import_tasks: prometheus.yml + tags: exporter + when: phpfpm_exporter is defined and phpfpm_exporter diff --git a/tasks/prometheus.yml b/tasks/prometheus.yml new file mode 100644 index 0000000..c8f2150 --- /dev/null +++ b/tasks/prometheus.yml @@ -0,0 +1,21 @@ +--- +- name: "Prometheus | Get Download URL" + ansible.builtin.shell: + cmd: curl -sL "{{ phpfpm_exporter_github_api_url }}" | jq -r '.assets[].browser_download_url' | grep -E linux-amd64.tar.gz + register: exporter_download_url + +- name: "Prometheus | Download binary" + ansible.builtin.unarchive: + src: "{{ exporter_download_url.stdout }}" + dest: /usr/local/bin + remote_src: true + exclude: + - LICENSE + mode: "0755" + +- name: "Prometheus | Copy systemd service file" + ansible.builtin.template: + src: systemd/phpfpm_exporter.service.j2 + dest: /etc/systemd/system/phpfpm_exporter.service + mode: "0644" + notify: Start phpfpm_exporter diff --git a/templates/systemd/phpfpm_exporter.service.j2 b/templates/systemd/phpfpm_exporter.service.j2 new file mode 100644 index 0000000..099ee4b --- /dev/null +++ b/templates/systemd/phpfpm_exporter.service.j2 @@ -0,0 +1,13 @@ +# Ansible managed + +[Unit] +Description = PHP-FPM Prometheus Exporter + +[Service] +SyslogIdentifier = phpfpm_exporter + +ExecStart =/usr/local/bin/phpfpm_exporter --phpfpm.socket-directories={{ phpfpm_exporter_socket_directories }} --web.listen-address="{{ phpfpm_exporter_listen_address }}" + + +[Install] +WantedBy = multi-user.target