add prometheus role
This commit is contained in:
parent
ec17840809
commit
749934f9e1
70
roles/prometheus/defaults/main.yaml
Normal file
70
roles/prometheus/defaults/main.yaml
Normal file
@ -0,0 +1,70 @@
|
||||
---
|
||||
prometheus_go_arch_map:
|
||||
i386: '386'
|
||||
x86_64: 'amd64'
|
||||
|
||||
prometheus_go_arch: "{{ prometheus_go_arch_map[ansible_architecture] | default('amd64') }}"
|
||||
|
||||
prometheus_service_name: prometheus.service
|
||||
prometheus_service_enabled: true
|
||||
prometheus_service_state: started
|
||||
|
||||
prometheus_version_regex: ^prometheus, version ([\d.]+)
|
||||
|
||||
prometheus_release_file: "prometheus-{{ prometheus_version }}.{{ ansible_system | lower }}-{{ prometheus_go_arch }}.tar.gz"
|
||||
prometheus_release_url: "https://github.com/prometheus/prometheus/releases/download/v{{ prometheus_version }}/{{ prometheus_release_file }}"
|
||||
prometheus_checksum_url: "https://github.com/prometheus/prometheus/releases/download/v{{ prometheus_version }}/sha256sums.txt"
|
||||
prometheus_download_path: "/tmp/{{ prometheus_release_file }}"
|
||||
prometheus_unarchive_dest_path: /tmp
|
||||
prometheus_extracted_path: "{{ prometheus_download_path | replace('.tar.gz', '') }}"
|
||||
|
||||
prometheus_user: prometheus
|
||||
prometheus_user_state: present
|
||||
prometheus_user_shell: /usr/sbin/nologin
|
||||
|
||||
prometheus_group: prometheus
|
||||
prometheus_group_state: "{{ prometheus_user_state | default('present') }}"
|
||||
|
||||
prometheus_etc_path: /etc/prometheus
|
||||
prometheus_etc_owner: root
|
||||
prometheus_etc_group: root
|
||||
prometheus_etc_mode: "0755"
|
||||
|
||||
prometheus_var_path: /var/lib/prometheus
|
||||
prometheus_var_owner: "{{ prometheus_user }}"
|
||||
prometheus_var_group: "{{ prometheus_group }}"
|
||||
prometheus_var_mode: "0775"
|
||||
|
||||
prometheus_bin_path: /usr/local/bin
|
||||
|
||||
prometheus_ssl_enabled: true
|
||||
prometheus_hostname: "{{ prometheus_web_external_url | urlsplit('hostname') }}"
|
||||
prometheus_ssl_certificate: "/etc/letsencrypt/live/{{ prometheus_hostname }}/fullchain.pem"
|
||||
prometheus_ssl_certificate_key: "/etc/letsencrypt/live/{{ prometheus_hostname }}/privkey.pem"
|
||||
|
||||
prometheus_alertmanager_enabled: true
|
||||
|
||||
prometheus_web_listen_address: 0.0.0.0:9090
|
||||
prometheus_port: "{{ prometheus_web_listen_address.split(':')[1] }}"
|
||||
prometheus_web_external_url:
|
||||
prometheus_web_route_prefix:
|
||||
prometheus_web_enable_lifecycle: true
|
||||
prometheus_storage_tsdb_min_block_duration: 2h
|
||||
prometheus_storage_tsdb_max_block_duration: 2h
|
||||
|
||||
prometheus_htpasswd_path: "{{ nginx_etc_path }}/prometheus.htpasswd"
|
||||
|
||||
prometheus_config:
|
||||
global:
|
||||
scrape_interval: 15s
|
||||
scrape_configs:
|
||||
- job_name: prometheus
|
||||
scrape_interval: 5s
|
||||
static_configs:
|
||||
- targets:
|
||||
- localhost:9090
|
||||
relabel_configs:
|
||||
- source_labels: [__address__]
|
||||
target_label: instance
|
||||
regex: (.+):\d+
|
||||
replacement: $1
|
11
roles/prometheus/handlers/main.yaml
Normal file
11
roles/prometheus/handlers/main.yaml
Normal file
@ -0,0 +1,11 @@
|
||||
---
|
||||
- name: restart prometheus
|
||||
systemd:
|
||||
name: prometheus.service
|
||||
daemon_reload: true
|
||||
state: restarted
|
||||
|
||||
- name: reload prometheus
|
||||
service:
|
||||
name: prometheus.service
|
||||
state: reloaded
|
65
roles/prometheus/tasks/configure.yaml
Normal file
65
roles/prometheus/tasks/configure.yaml
Normal file
@ -0,0 +1,65 @@
|
||||
---
|
||||
- name: create group
|
||||
group:
|
||||
name: "{{ prometheus_group }}"
|
||||
system: true
|
||||
state: "{{ prometheus_group_state | default('present') }}"
|
||||
|
||||
- name: create user
|
||||
user:
|
||||
name: "{{ prometheus_user }}"
|
||||
system: true
|
||||
shell: "{{ prometheus_user_shell }}"
|
||||
group: "{{ prometheus_group }}"
|
||||
createhome: false
|
||||
home: "{{ prometheus_var_path }}"
|
||||
state: "{{ prometheus_user_state | default('present') }}"
|
||||
|
||||
- name: create etc path
|
||||
file:
|
||||
path: "{{ prometheus_etc_path }}"
|
||||
state: directory
|
||||
owner: "{{ prometheus_etc_owner }}"
|
||||
group: "{{ prometheus_etc_group }}"
|
||||
mode: "{{ prometheus_etc_mode }}"
|
||||
|
||||
- name: create var path
|
||||
file:
|
||||
path: "{{ prometheus_var_path }}"
|
||||
state: directory
|
||||
owner: "{{ prometheus_var_owner }}"
|
||||
group: "{{ prometheus_var_group }}"
|
||||
mode: "{{ prometheus_var_mode }}"
|
||||
|
||||
- name: configure
|
||||
copy:
|
||||
dest: "{{ prometheus_etc_path }}/prometheus.yaml"
|
||||
content: "{{ (prometheus_config | default({})) | to_yaml }}"
|
||||
owner: root
|
||||
group: root
|
||||
mode: 0444
|
||||
notify: restart prometheus
|
||||
|
||||
- name: configure rules
|
||||
copy:
|
||||
dest: "{{ prometheus_etc_path }}/rules.yaml"
|
||||
content: "{{ (prometheus_rules_config | default({})) | to_yaml }}"
|
||||
owner: root
|
||||
group: root
|
||||
mode: 0444
|
||||
notify: reload prometheus
|
||||
|
||||
- name: configure systemd template
|
||||
template:
|
||||
src: prometheus.service.j2
|
||||
dest: /etc/systemd/system/prometheus.service
|
||||
owner: root
|
||||
group: root
|
||||
mode: 0444
|
||||
notify: restart prometheus
|
||||
|
||||
- name: manage service
|
||||
service:
|
||||
name: "{{ prometheus_service_name }}"
|
||||
enabled: "{{ prometheus_service_enabled }}"
|
||||
state: "{{ prometheus_service_state }}"
|
0
roles/prometheus/tasks/default.yaml
Normal file
0
roles/prometheus/tasks/default.yaml
Normal file
32
roles/prometheus/tasks/install.yaml
Normal file
32
roles/prometheus/tasks/install.yaml
Normal file
@ -0,0 +1,32 @@
|
||||
---
|
||||
- block:
|
||||
- name: download tar
|
||||
get_url:
|
||||
url: "{{ prometheus_release_url }}"
|
||||
dest: "{{ prometheus_download_path }}"
|
||||
checksum: "{{ prometheus_checksum }}"
|
||||
register: dl
|
||||
until: dl is success
|
||||
retries: 5
|
||||
delay: 10
|
||||
|
||||
- name: extract tar
|
||||
unarchive:
|
||||
src: "{{ prometheus_download_path }}"
|
||||
dest: "{{ prometheus_unarchive_dest_path }}"
|
||||
creates: "{{ prometheus_extracted_path }}/prometheus"
|
||||
remote_src: true
|
||||
|
||||
- name: install binaries
|
||||
copy:
|
||||
src: "{{ prometheus_extracted_path }}/{{ item }}"
|
||||
dest: "{{ prometheus_bin_path }}/{{ item }}"
|
||||
owner: root
|
||||
group: root
|
||||
mode: 0755
|
||||
remote_src: true
|
||||
loop:
|
||||
- promtool
|
||||
- prometheus
|
||||
notify: restart prometheus
|
||||
when: prometheus_version != prometheus_local_version
|
34
roles/prometheus/tasks/main.yaml
Normal file
34
roles/prometheus/tasks/main.yaml
Normal file
@ -0,0 +1,34 @@
|
||||
---
|
||||
- name: gather os specific variables
|
||||
include_vars: "{{ lookup('first_found', possible_files) }}"
|
||||
vars:
|
||||
possible_files:
|
||||
files:
|
||||
- "{{ ansible_distribution }}-{{ ansible_distribution_version }}.yaml"
|
||||
- "{{ ansible_distribution }}.yaml"
|
||||
- "{{ ansible_os_family }}.yaml"
|
||||
- "default.yaml"
|
||||
paths:
|
||||
- vars
|
||||
|
||||
- name: include os specific tasks
|
||||
include_tasks: "{{ lookup('first_found', possible_files) }}"
|
||||
vars:
|
||||
possible_files:
|
||||
files:
|
||||
- "{{ ansible_distribution }}-{{ ansible_distribution_version }}.yaml"
|
||||
- "{{ ansible_distribution }}.yaml"
|
||||
- "{{ ansible_os_family }}.yaml"
|
||||
- "default.yaml"
|
||||
paths:
|
||||
- tasks
|
||||
|
||||
- include: pre.yaml
|
||||
|
||||
- include: install.yaml
|
||||
|
||||
- include: configure.yaml
|
||||
notify: restart prometheus
|
||||
|
||||
- include: nginx.yaml
|
||||
when: '"nginx" in ansible_play_role_names'
|
9
roles/prometheus/tasks/nginx.yaml
Normal file
9
roles/prometheus/tasks/nginx.yaml
Normal file
@ -0,0 +1,9 @@
|
||||
---
|
||||
- name: configure nginx
|
||||
template:
|
||||
src: nginx.conf.j2
|
||||
dest: "{{ nginx_conf_d_path }}/prometheus.conf"
|
||||
owner: root
|
||||
group: root
|
||||
mode: 0444
|
||||
notify: reload nginx
|
50
roles/prometheus/tasks/pre.yaml
Normal file
50
roles/prometheus/tasks/pre.yaml
Normal file
@ -0,0 +1,50 @@
|
||||
---
|
||||
- name: determine if installed
|
||||
stat:
|
||||
path: "{{ prometheus_bin_path }}/prometheus"
|
||||
register: st
|
||||
|
||||
- name: set prometheus_installed
|
||||
set_fact:
|
||||
prometheus_installed: "{{ st.stat.exists | bool }}"
|
||||
|
||||
- block:
|
||||
- name: determine latest version
|
||||
uri:
|
||||
url: https://api.github.com/repos/prometheus/prometheus/releases/latest
|
||||
return_content: true
|
||||
body_format: json
|
||||
register: _latest_version
|
||||
until: _latest_version.status == 200
|
||||
retries: 3
|
||||
|
||||
- name: set prometheus_version
|
||||
set_fact:
|
||||
prometheus_version: "{{ _latest_version.json['tag_name'] | regex_replace('^v', '') }}"
|
||||
|
||||
- block:
|
||||
- name: determine installed version
|
||||
command: "{{ prometheus_bin_path }}/prometheus --version"
|
||||
register: _installed_version_string
|
||||
changed_when: false
|
||||
|
||||
- name: set prometheus_local_version
|
||||
set_fact:
|
||||
prometheus_local_version: "{{ _installed_version_string.stdout | regex_search(prometheus_version_regex, '\\1') | first }}"
|
||||
when: prometheus_installed
|
||||
|
||||
- name: set prometheus_local_version to 0
|
||||
set_fact:
|
||||
prometheus_local_version: "0"
|
||||
when: not prometheus_installed
|
||||
|
||||
- block:
|
||||
- name: get checksums
|
||||
set_fact:
|
||||
_checksums: "{{ lookup('url', prometheus_checksum_url, wantlist=True) }}"
|
||||
|
||||
- name: set prometheus_checksum
|
||||
set_fact:
|
||||
prometheus_checksum: "sha256:{{ item.split(' ') | first }}"
|
||||
loop: "{{ _checksums }}"
|
||||
when: "prometheus_release_file in item"
|
79
roles/prometheus/templates/nginx.conf.j2
Normal file
79
roles/prometheus/templates/nginx.conf.j2
Normal file
@ -0,0 +1,79 @@
|
||||
# {{ ansible_managed }}
|
||||
|
||||
upstream prometheus_backend {
|
||||
server 127.0.0.1:{{ prometheus_port }};
|
||||
}
|
||||
|
||||
upstream alertmanager_backend {
|
||||
server 127.0.0.1:{{ alertmanager_port }};
|
||||
}
|
||||
|
||||
upstream karma_backend {
|
||||
server 127.0.0.1:{{ karma_port }};
|
||||
}
|
||||
|
||||
server {
|
||||
listen 80;
|
||||
{% if ansible_all_ipv6_addresses | length %}
|
||||
listen [::]:80;
|
||||
{% endif %}
|
||||
server_name {{ prometheus_hostname }};
|
||||
|
||||
access_log /var/log/nginx/prometheus.access.log main;
|
||||
error_log /var/log/nginx/prometheus.error.log warn;
|
||||
|
||||
location /.well-known/acme-challenge/ {
|
||||
root /var/www/html;
|
||||
try_files $uri =404;
|
||||
}
|
||||
|
||||
{% if prometheus_ssl_enabled is defined and
|
||||
prometheus_ssl_enabled %}
|
||||
location / {
|
||||
return 301 https://$server_name$request_uri;
|
||||
}
|
||||
{% endif %}
|
||||
}
|
||||
|
||||
{% if prometheus_ssl_enabled is defined and
|
||||
prometheus_ssl_enabled %}
|
||||
server {
|
||||
listen 443 ssl http2;
|
||||
{% if ansible_all_ipv6_addresses | length %}
|
||||
listen [::]:443 ssl http2;
|
||||
{% endif %}
|
||||
server_name {{ prometheus_hostname }};
|
||||
|
||||
auth_basic "Prometheus";
|
||||
auth_basic_user_file {{ prometheus_htpasswd_path }};
|
||||
|
||||
access_log /var/log/nginx/prometheus.access.log main;
|
||||
error_log /var/log/nginx/prometheus.error.log warn;
|
||||
|
||||
{% if prometheus_ssl_certificate is defined %}
|
||||
ssl_certificate {{ prometheus_ssl_certificate }};
|
||||
{% endif %}
|
||||
{% if prometheus_ssl_certificate_key is defined %}
|
||||
ssl_certificate_key {{ prometheus_ssl_certificate_key }};
|
||||
{% endif %}
|
||||
{% if prometheus_ssl_dhparam is defined %}
|
||||
ssl_dhparam {{ prometheus_ssl_dhparam }};
|
||||
{% endif %}
|
||||
|
||||
location /prometheus/ {
|
||||
proxy_pass http://prometheus_backend/;
|
||||
}
|
||||
|
||||
location /alertmanager/ {
|
||||
proxy_pass http://alertmanager_backend/;
|
||||
}
|
||||
|
||||
location /karma/ {
|
||||
proxy_pass http://karma_backend/;
|
||||
}
|
||||
|
||||
location / {
|
||||
return 301 /prometheus/;
|
||||
}
|
||||
}
|
||||
{% endif %}
|
35
roles/prometheus/templates/prometheus.service.j2
Normal file
35
roles/prometheus/templates/prometheus.service.j2
Normal file
@ -0,0 +1,35 @@
|
||||
{{ ansible_managed | comment }}
|
||||
|
||||
[Unit]
|
||||
Description=Prometheus
|
||||
After=network-online.target
|
||||
|
||||
[Service]
|
||||
Type=simple
|
||||
User={{ prometheus_user }}
|
||||
Group={{ prometheus_group }}
|
||||
ExecReload=/bin/kill -HUP $MAINPID
|
||||
ExecStart={{ prometheus_bin_path }}/prometheus \
|
||||
--config.file={{ prometheus_etc_path }}/prometheus.yaml \
|
||||
--storage.tsdb.path={{ prometheus_var_path }} \
|
||||
{% if prometheus_web_external_url %}
|
||||
--web.external-url={{ prometheus_web_external_url }} \
|
||||
{% endif %}
|
||||
{% if prometheus_web_route_prefix %}
|
||||
--web.route-prefix={{ prometheus_web_route_prefix }} \
|
||||
{% endif %}
|
||||
{% if prometheus_web_listen_address %}
|
||||
--web.listen-address={{ prometheus_web_listen_address }} \
|
||||
{% endif %}
|
||||
{% if prometheus_web_enable_lifecycle %}
|
||||
--web.enable-lifecycle \
|
||||
{% endif %}
|
||||
{% if prometheus_storage_tsdb_min_block_duration %}
|
||||
--storage.tsdb.min-block-duration={{ prometheus_storage_tsdb_min_block_duration }} \
|
||||
{% endif %}
|
||||
{% if prometheus_storage_tsdb_max_block_duration %}
|
||||
--storage.tsdb.max-block-duration={{ prometheus_storage_tsdb_max_block_duration }} \
|
||||
{% endif %}
|
||||
|
||||
[Install]
|
||||
WantedBy=multi-user.target
|
1
roles/prometheus/templates/targets.yaml.j2
Normal file
1
roles/prometheus/templates/targets.yaml.j2
Normal file
@ -0,0 +1 @@
|
||||
---
|
0
roles/prometheus/vars/default.yaml
Normal file
0
roles/prometheus/vars/default.yaml
Normal file
1
roles/prometheus/vars/main.yaml
Normal file
1
roles/prometheus/vars/main.yaml
Normal file
@ -0,0 +1 @@
|
||||
---
|
Loading…
Reference in New Issue
Block a user