diff --git a/app/create_db.py b/app/create_db.py index 1ab14e59..b819a9a0 100644 --- a/app/create_db.py +++ b/app/create_db.py @@ -859,7 +859,7 @@ def update_db_v_5_3_2_2(**kwargs): def update_ver(): - query = Version.update(version='5.3.4.0') + query = Version.update(version='5.3.5.0') try: query.execute() except: diff --git a/app/funct.py b/app/funct.py index 985d7f2f..8c7f5a32 100644 --- a/app/funct.py +++ b/app/funct.py @@ -432,6 +432,8 @@ def get_config(server_ip, cfg, **kwargs): config_path = "/etc/keepalived/keepalived.conf" elif kwargs.get("nginx"): config_path = sql.get_setting('nginx_config_path') + elif kwargs.get("waf"): + config_path = sql.get_setting('haproxy_dir') + '/waf/rules/' + kwargs.get("waf_rule_file") else: config_path = sql.get_setting('haproxy_config_path') @@ -707,7 +709,7 @@ def install_haproxy(server_ip, **kwargs): os.system("cp scripts/%s ." % script) if haproxy_ver is None: - haproxy_ver = '2.3.0-1' + haproxy_ver = '2.4.9-1' if proxy is not None and proxy != '' and proxy != 'None': proxy_serv = proxy diff --git a/app/options.py b/app/options.py index b36a5b23..19b10961 100644 --- a/app/options.py +++ b/app/options.py @@ -669,6 +669,7 @@ if act == "overviewwaf": ioloop.run_until_complete(get_runner_overviewWaf()) ioloop.close() + if act == "overviewServers": import asyncio @@ -1372,6 +1373,8 @@ if form.getvalue('install_grafana'): if form.getvalue('haproxy_exp_install'): serv = form.getvalue('haproxy_exp_install') + ver = form.getvalue('exporter_v') + ext_prom = form.getvalue('ext_prom') script = "install_haproxy_exporter.sh" stats_port = sql.get_setting('stats_port') server_state_file = sql.get_setting('server_state_file') @@ -1398,7 +1401,7 @@ if form.getvalue('haproxy_exp_install'): commands = ["chmod +x " + script + " && ./" + script + " PROXY=" + proxy_serv + " STAT_PORT=" + str(stats_port) + " STAT_FILE=" + server_state_file + - " SSH_PORT=" + ssh_port + " STAT_PAGE=" + stat_page + + " SSH_PORT=" + ssh_port + " STAT_PAGE=" + stat_page + " VER=" + ver + " EXP_PROM=" + ext_prom + " STATS_USER=" + stats_user + " STATS_PASS='" + stats_password + "' HOST=" + serv + " USER=" + ssh_user_name + " PASS='" + ssh_user_password + "' KEY=" + ssh_key_name] @@ -1411,6 +1414,7 @@ if form.getvalue('haproxy_exp_install'): if form.getvalue('nginx_exp_install'): serv = form.getvalue('nginx_exp_install') ver = form.getvalue('exporter_v') + ext_prom = form.getvalue('ext_prom') script = "install_nginx_exporter.sh" stats_user = sql.get_setting('nginx_stats_user') stats_password = sql.get_setting('nginx_stats_password') @@ -1436,8 +1440,8 @@ if form.getvalue('nginx_exp_install'): commands = ["chmod +x " + script + " && ./" + script + " PROXY=" + proxy_serv + " STAT_PORT=" + str(stats_port) + " SSH_PORT=" + ssh_port + " STAT_PAGE=" + stats_page + - " STATS_USER=" + stats_user + " STATS_PASS='" + stats_password + "' HOST=" + serv + - " USER=" + ssh_user_name + " PASS='" + ssh_user_password + "' KEY=" + ssh_key_name] + " STATS_USER=" + stats_user + " STATS_PASS='" + stats_password + "' HOST=" + serv + " VER=" + ver + + " EXP_PROM=" + ext_prom + " USER=" + ssh_user_name + " PASS='" + ssh_user_password + "' KEY=" + ssh_key_name] output, error = funct.subprocess_execute(commands[0]) @@ -1447,6 +1451,8 @@ if form.getvalue('nginx_exp_install'): if form.getvalue('node_exp_install'): serv = form.getvalue('node_exp_install') + ver = form.getvalue('exporter_v') + ext_prom = form.getvalue('ext_prom') script = "install_node_exporter.sh" proxy = sql.get_setting('proxy') ssh_port = 22 @@ -1466,8 +1472,8 @@ if form.getvalue('node_exp_install'): else: proxy_serv = '' - commands = ["chmod +x " + script + " && ./" + script + " PROXY=" + proxy_serv + " SSH_PORT=" + ssh_port + - " HOST=" + serv + " USER=" + ssh_user_name + " PASS='" + ssh_user_password + "' KEY=" + ssh_key_name] + commands = ["chmod +x " + script + " && ./" + script + " PROXY=" + proxy_serv + " SSH_PORT=" + ssh_port + " VER=" + ver + + " EXP_PROM=" + ext_prom + " HOST=" + serv + " USER=" + ssh_user_name + " PASS='" + ssh_user_password + "' KEY=" + ssh_key_name] output, error = funct.subprocess_execute(commands[0]) @@ -1742,7 +1748,7 @@ if form.getvalue('get_nginx_v'): print(funct.ssh_command(serv, cmd)) if form.getvalue('get_exporter_v'): - print(funct.check_service(serv, form.getvalue('get_exporter_v'))) + print(funct.get_service_version(serv, form.getvalue('get_exporter_v'))) if form.getvalue('bwlists'): list_path = os.path.dirname(os.getcwd()) + "/" + sql.get_setting('lists_path') + "/" + form.getvalue('group') + "/" + form.getvalue('color') + "/" + form.getvalue('bwlists') diff --git a/app/scripts/ansible/roles/haproxy_exporter.yml b/app/scripts/ansible/roles/haproxy_exporter.yml index 03b8e0a1..a88c502f 100644 --- a/app/scripts/ansible/roles/haproxy_exporter.yml +++ b/app/scripts/ansible/roles/haproxy_exporter.yml @@ -34,6 +34,6 @@ roles: - - role: bdellegrazie.haproxy_exporter + - role: haproxy_exporter vars: haproxy_exporter_options: ['--haproxy.scrape-uri=http://{{STATS_USER}}:{{STATS_PASS}}@{{variable_host}}:{{STAT_PORT}}/{{STAT_PAGE}};csv'] diff --git a/app/scripts/ansible/roles/haproxy_exporter/defaults/main.yml b/app/scripts/ansible/roles/haproxy_exporter/defaults/main.yml new file mode 100644 index 00000000..7be1481a --- /dev/null +++ b/app/scripts/ansible/roles/haproxy_exporter/defaults/main.yml @@ -0,0 +1,27 @@ +--- +haproxy_exporter_user: haproxy_exporter +haproxy_exporter_user_manage: true +haproxy_exporter_group: "{{ haproxy_exporter_user }}" +haproxy_exporter_group_manage: true + +haproxy_exporter_version: "0.10.0" +haproxy_exporter_platform_suffix: "linux-amd64" + +haproxy_exporter_options: + - '--haproxy.scrape-uri=http://admin:admin@localhost:9101/haproxy?stats;csv' + +haproxy_exporter_signature: "haproxy_exporter-{{ haproxy_exporter_version }}.{{ haproxy_exporter_platform_suffix }}" +haproxy_exporter_dist_dir: "{{ prometheus_exporter_dist_dir }}/{{ haproxy_exporter_signature }}" +haproxy_exporter_tarball_url: "https://github.com/prometheus/haproxy_exporter/releases/download/v{{ haproxy_exporter_version }}/{{ haproxy_exporter_signature }}.tar.gz" +haproxy_exporter_program: "{{ prometheus_exporter_dir }}/haproxy_exporter" +haproxy_exporter_home: "/var/lib/haproxy_exporter" +haproxy_exporter_home_manage: true + +haproxy_exporter_config_file: /etc/default/haproxy_exporter +haproxy_exporter_pid_path: "/var/run" +haproxy_exporter_log_path: "/var/log/haproxy_exporter" + +haproxy_exporter_service_manage: true +haproxy_exporter_service_enable: true +haproxy_exporter_service_state: started +haproxy_exporter_service_notify: true diff --git a/app/scripts/ansible/roles/haproxy_exporter/handlers/main.yml b/app/scripts/ansible/roles/haproxy_exporter/handlers/main.yml new file mode 100644 index 00000000..d710ad1b --- /dev/null +++ b/app/scripts/ansible/roles/haproxy_exporter/handlers/main.yml @@ -0,0 +1,11 @@ +--- +- name: restart haproxy_exporter + become: true + become_user: root + service: + name: haproxy_exporter + state: "{{ (haproxy_exporter_service_state != 'stopped') | ternary('restarted', 'stopped') }}" + use: "{{ prometheus_exporter_service_mgr }}" + when: haproxy_exporter_service_notify and ( + _haproxy_exporter_service_state is not defined or + not ( _haproxy_exporter_service_state is changed )) diff --git a/app/scripts/ansible/roles/haproxy_exporter/meta/main.yml b/app/scripts/ansible/roles/haproxy_exporter/meta/main.yml new file mode 100644 index 00000000..3eeb94e2 --- /dev/null +++ b/app/scripts/ansible/roles/haproxy_exporter/meta/main.yml @@ -0,0 +1,30 @@ +--- +galaxy_info: + author: Brett Delle Grazie + description: Role to install Prometheus HAproxy Exporter + + license: GPLv3 + + min_ansible_version: 2.0 + + platforms: + - name: EL + versions: + - 6 + - 7 + - name: Fedora + versions: + - all + - name: Ubuntu + versions: + - all + - name: Debian + versions: + - all + + galaxy_tags: + - prometheus + - exporter + +dependencies: + - { role: 'bdellegrazie.ansible-role-prometheus_exporter', version: 'v1.1.3' } diff --git a/app/scripts/ansible/roles/haproxy_exporter/tasks/main.yml b/app/scripts/ansible/roles/haproxy_exporter/tasks/main.yml new file mode 100644 index 00000000..a04cc68c --- /dev/null +++ b/app/scripts/ansible/roles/haproxy_exporter/tasks/main.yml @@ -0,0 +1,111 @@ +--- +- name: group + become: true + become_user: root + group: + name: "{{ haproxy_exporter_group }}" + state: present + system: true + when: haproxy_exporter_group_manage | bool + +- name: user + become: true + become_user: root + user: + name: "{{ haproxy_exporter_user }}" + group: "{{ haproxy_exporter_group }}" + home: "{{ haproxy_exporter_home }}" + createhome: false + shell: /sbin/nologin + comment: haproxy_exporter + state: present + system: true + when: haproxy_exporter_user_manage | bool + +- name: home + become: true + become_user: root + file: + path: "{{ haproxy_exporter_home }}" + owner: "{{ haproxy_exporter_user }}" + group: "{{ haproxy_exporter_group }}" + mode: "u=rwx,g=rx,o=" + state: directory + when: haproxy_exporter_home_manage | bool + +- name: logs + become: true + become_user: root + file: + path: "{{ haproxy_exporter_log_path }}" + owner: "{{ haproxy_exporter_user }}" + group: "{{ haproxy_exporter_group }}" + mode: "u=rwx,g=rx,o=" + state: directory + +- name: download tarball + become: true + become_user: root + get_url: + url: "{{ haproxy_exporter_tarball_url }}" + dest: "{{ prometheus_exporter_dist_dir }}/{{ haproxy_exporter_signature }}.tar.gz" + owner: root + group: root + mode: "u=rw,go=r" + +- name: untar tarball + become: true + become_user: root + unarchive: + src: "{{ prometheus_exporter_dist_dir }}/{{ haproxy_exporter_signature }}.tar.gz" + dest: "{{ prometheus_exporter_dist_dir }}" + remote_src: true + owner: root + group: root + mode: "u=rwx,go=rx" + creates: "{{ haproxy_exporter_dist_dir }}/haproxy_exporter" + +- name: symlink + become: true + become_user: root + file: + src: "{{ haproxy_exporter_dist_dir }}/haproxy_exporter" + path: "{{ prometheus_exporter_dir }}/haproxy_exporter" + owner: root + group: root + force: true + state: link + notify: restart haproxy_exporter + +- name: config + become: true + become_user: root + template: + src: "haproxy_exporter.default.conf.j2" + dest: "/etc/default/haproxy_exporter" + owner: root + group: root + mode: "u=rw,go=r" + notify: restart haproxy_exporter + +- name: install service + include: service-{{ prometheus_exporter_service_mgr }}.yml + +- name: Service Enabled + become: true + become_user: root + service: + name: haproxy_exporter + enabled: "{{ haproxy_exporter_service_enable }}" + use: "{{ prometheus_exporter_service_mgr }}" + when: haproxy_exporter_service_manage + +- name: Service State + become: true + become_user: root + service: + name: haproxy_exporter + state: "{{ haproxy_exporter_service_state }}" + use: "{{ prometheus_exporter_service_mgr }}" + register: _haproxy_exporter_service_state + when: haproxy_exporter_service_manage diff --git a/app/scripts/ansible/roles/haproxy_exporter/tasks/service-systemd.yml b/app/scripts/ansible/roles/haproxy_exporter/tasks/service-systemd.yml new file mode 100644 index 00000000..5e6a6e27 --- /dev/null +++ b/app/scripts/ansible/roles/haproxy_exporter/tasks/service-systemd.yml @@ -0,0 +1,12 @@ +--- +- name: systemd service + become: true + template: + src: "haproxy_exporter.systemd.j2" + dest: "/lib/systemd/system/haproxy_exporter.service" + owner: root + group: root + mode: "u=rw,go=r" + notify: + - reload systemd daemon + - restart haproxy_exporter diff --git a/app/scripts/ansible/roles/haproxy_exporter/tasks/service-sysvinit.yml b/app/scripts/ansible/roles/haproxy_exporter/tasks/service-sysvinit.yml new file mode 100644 index 00000000..f250a16a --- /dev/null +++ b/app/scripts/ansible/roles/haproxy_exporter/tasks/service-sysvinit.yml @@ -0,0 +1,11 @@ +--- +- name: sysvinit service + become: true + template: + src: "haproxy_exporter.sysvinit.j2" + dest: "/etc/init.d/haproxy_exporter" + owner: root + group: root + mode: "u=rwx,go=rx" + notify: + - restart haproxy_exporter diff --git a/app/scripts/ansible/roles/haproxy_exporter/tasks/service-upstart.yml b/app/scripts/ansible/roles/haproxy_exporter/tasks/service-upstart.yml new file mode 100644 index 00000000..45913703 --- /dev/null +++ b/app/scripts/ansible/roles/haproxy_exporter/tasks/service-upstart.yml @@ -0,0 +1,11 @@ +--- +- name: upstart service + become: true + template: + src: "haproxy_exporter.upstart.j2" + dest: "/etc/init/haproxy_exporter.conf" + owner: root + group: root + mode: "u=rw,go=r" + notify: + - restart haproxy_exporter diff --git a/app/scripts/ansible/roles/haproxy_exporter/templates/haproxy_exporter.default.conf.j2 b/app/scripts/ansible/roles/haproxy_exporter/templates/haproxy_exporter.default.conf.j2 new file mode 100644 index 00000000..99a68117 --- /dev/null +++ b/app/scripts/ansible/roles/haproxy_exporter/templates/haproxy_exporter.default.conf.j2 @@ -0,0 +1 @@ +OPTIONS="{{ haproxy_exporter_options | join(' ') }}" diff --git a/app/scripts/ansible/roles/haproxy_exporter/templates/haproxy_exporter.systemd.j2 b/app/scripts/ansible/roles/haproxy_exporter/templates/haproxy_exporter.systemd.j2 new file mode 100644 index 00000000..a31febb1 --- /dev/null +++ b/app/scripts/ansible/roles/haproxy_exporter/templates/haproxy_exporter.systemd.j2 @@ -0,0 +1,16 @@ +[Unit] +Description=haproxy_exporter - Exporter for machine metrics. +Documentation=https://github.com/prometheus/haproxy_exporter +After=network.target + +[Service] +User={{ haproxy_exporter_user }} +Group={{ haproxy_exporter_group }} +EnvironmentFile={{ haproxy_exporter_config_file }} +ExecStart={{ haproxy_exporter_program }} $OPTIONS + +SyslogIdentifier=haproxy_exporter +Restart=always + +[Install] +WantedBy=multi-user.target diff --git a/app/scripts/ansible/roles/haproxy_exporter/templates/haproxy_exporter.sysvinit.j2 b/app/scripts/ansible/roles/haproxy_exporter/templates/haproxy_exporter.sysvinit.j2 new file mode 100644 index 00000000..0678c199 --- /dev/null +++ b/app/scripts/ansible/roles/haproxy_exporter/templates/haproxy_exporter.sysvinit.j2 @@ -0,0 +1,119 @@ +#!/bin/sh +# +# haproxy_exporter Start/Stop the haproxy_exporter daemon +# +# chkconfig: - 80 20 +# description: haproxy_exporter is a metrics daemon for Prometheus. +# processname: haproxy_exporter + +### BEGIN INIT INFO +# Provides: haproxy_exporter +# Required-Start: $remote_fs $syslog +# Required-Stop: $remote_fs $syslog +# Default-Start: 2 3 4 5 +# Default-Stop: 0 1 6 +# Short-Description: Start/Stop the haproxy_exporter daemon +# Description: haproxy_exporter is a metrics daemon for Prometheus. +### END INIT INFO + +# Source function library. +if [ -f /etc/init.d/functions ] ; then + . /etc/init.d/functions +fi + +# defaults +OPTIONS="" + +# config +if [ -f "{{ haproxy_exporter_config_file }}" ] ; then + . "{{ haproxy_exporter_config_file }}" +fi + +RETVAL=0 + +# Set up some common variables before we launch into what might be +# considered boilerplate by now. +prog="{{ haproxy_exporter_program }}" +name="$(basename $prog)" +binary="$(readlink -f $prog)" +lockfile="/var/lock/subsys/$name" +logdir="{{ haproxy_exporter_log_path }}" +pidfile="{{ haproxy_exporter_pid_path }}/$name.pid" +user="{{ haproxy_exporter_user }}" +group="{{ haproxy_exporter_group }}" + +start() { + [ -r $binary ] || exit 5 + echo -n $"Starting $name: " + daemonize -a -c '/' -e ${logdir}/${name}.err.log -o ${logdir}/${name}.out.log \ + -p $pidfile -l $lockfile -u $user \ + $binary $OPTIONS + RETVAL=$? + echo + [ $RETVAL -eq 0 ] && touch $lockfile + return $RETVAL +} + +stop() { + echo -n $"Stopping $prog: " + killproc -p $pidfile $binary + RETVAL=$? + echo + [ $RETVAL -eq 0 ] && rm -f $lockfile + return $RETVAL +} + +restart() { + stop + start +} + +reload() { + restart +} + +force_reload() { + restart +} + +rh_status() { + # run checks to determine if the service is running or use generic status + status -p $pidfile -l $lockfile $binary +} + +rh_status_q() { + rh_status >/dev/null 2>&1 +} + +case "$1" in + start) + rh_status_q && exit 0 + start + ;; + stop) + rh_status_q || exit 0 + stop + ;; + restart) + restart + ;; + reload) + rh_status_q || exit 7 + reload + ;; + force-reload) + force_reload + ;; + status) + rh_status + ;; + condrestart|try-restart) + rh_status_q || exit 0 + restart + ;; + *) + echo $"Usage: $0 {start|stop|status|restart|condrestart|try-restart|reload|force-reload}" + exit 2 +esac + +exit $? diff --git a/app/scripts/ansible/roles/haproxy_exporter/templates/haproxy_exporter.upstart.j2 b/app/scripts/ansible/roles/haproxy_exporter/templates/haproxy_exporter.upstart.j2 new file mode 100644 index 00000000..63edec16 --- /dev/null +++ b/app/scripts/ansible/roles/haproxy_exporter/templates/haproxy_exporter.upstart.j2 @@ -0,0 +1,26 @@ +description "Prometheus HAproxy Exporter" +start on (local-filesystems and net-device-up IFACE!=lo) +stop on runlevel [016] + +respawn + +setuid {{ haproxy_exporter_user }} +setgid {{ haproxy_exporter_group }} + +env name=haproxy_exporter +env prog={{ haproxy_exporter_program }} +env logdir={{ haproxy_exporter_log_path }} +env user={{ haproxy_exporter_user }} +env group={{ haproxy_exporter_group }} + +script + if [ -f "{{ haproxy_exporter_config_file }}" ] ; then + . "{{ haproxy_exporter_config_file }}" + fi + + pidfile={{ haproxy_exporter_pid_path }}/$name.pid + lockfile=/var/lock/subsys/$name + + binary=$(readlink -f $prog) + exec $binary $OPTIONS >> "${logdir}/${name}.out.log" 2>> "${logdir}/${name}.err.log" +end script diff --git a/app/scripts/ansible/roles/nginx_exporter.yml b/app/scripts/ansible/roles/nginx_exporter.yml index ba04aa7b..f026665b 100644 --- a/app/scripts/ansible/roles/nginx_exporter.yml +++ b/app/scripts/ansible/roles/nginx_exporter.yml @@ -32,7 +32,7 @@ roles: - - role: bdellegrazie.nginx_exporter + - role: nginx_exporter environment: http_proxy: "{{PROXY}}" https_proxy: "{{PROXY}}" diff --git a/app/scripts/ansible/roles/nginx_exporter/defaults/main.yml b/app/scripts/ansible/roles/nginx_exporter/defaults/main.yml new file mode 100644 index 00000000..738b905d --- /dev/null +++ b/app/scripts/ansible/roles/nginx_exporter/defaults/main.yml @@ -0,0 +1,31 @@ +--- +nginx_exporter_user: nginx_exporter +nginx_exporter_user_manage: true +nginx_exporter_group: nginx_exporter +nginx_exporter_group_manage: true + +nginx_exporter_version: "0.5.0" +nginx_exporter_platform_suffix: "linux_amd64" +nginx_exporter_platform_suffix_alt: "linux-amd64" + +nginx_exporter_signature: "nginx-prometheus-exporter_{{ nginx_exporter_version }}_{{ nginx_exporter_platform_suffix }}" +nginx_exporter_signature_alt: "nginx-prometheus-exporter-{{ nginx_exporter_version }}-{{ nginx_exporter_platform_suffix_alt }}" +nginx_exporter_dist_dir: "{{ prometheus_exporter_dist_dir }}/{{ nginx_exporter_signature }}" +nginx_exporter_dist_dir_alt: "{{ prometheus_exporter_dist_dir }}/{{ nginx_exporter_signature_alt }}" +nginx_exporter_tarball_url: "https://github.com/nginxinc/nginx-prometheus-exporter/releases/download/v{{ nginx_exporter_version }}/{{ nginx_exporter_signature }}.tar.gz" +nginx_exporter_tarball_url_alt: "https://github.com/nginxinc/nginx-prometheus-exporter/releases/download/v{{ nginx_exporter_version }}/{{ nginx_exporter_signature_alt }}.tar.gz" +nginx_exporter_program: "{{ prometheus_exporter_dir }}/nginx_exporter" +nginx_exporter_home: "/var/lib/nginx_exporter" +nginx_exporter_home_manage: true +nginx_exporter_options: + - '-nginx.retries 32768' + - '-nginx.scrape-uri http://localhost/nginx_stats' + +nginx_exporter_config_file: /etc/default/nginx_exporter +nginx_exporter_pid_path: "/var/run" +nginx_exporter_log_path: "/var/log/nginx_exporter" + +nginx_exporter_service_manage: true +nginx_exporter_service_enable: true +nginx_exporter_service_state: started +nginx_exporter_service_notify: true diff --git a/app/scripts/ansible/roles/nginx_exporter/handlers/main.yml b/app/scripts/ansible/roles/nginx_exporter/handlers/main.yml new file mode 100644 index 00000000..67f4c6f2 --- /dev/null +++ b/app/scripts/ansible/roles/nginx_exporter/handlers/main.yml @@ -0,0 +1,11 @@ +--- +- name: restart nginx_exporter + become: true + become_user: root + service: + name: nginx_exporter + state: "{{ (nginx_exporter_service_state != 'stopped') | ternary('restarted', 'stopped') }}" + use: "{{ prometheus_exporter_service_mgr }}" + when: nginx_exporter_service_notify and ( + _nginx_exporter_service_state is not defined or + not ( _nginx_exporter_service_state is changed )) diff --git a/app/scripts/ansible/roles/nginx_exporter/meta/main.yml b/app/scripts/ansible/roles/nginx_exporter/meta/main.yml new file mode 100644 index 00000000..d32ad28c --- /dev/null +++ b/app/scripts/ansible/roles/nginx_exporter/meta/main.yml @@ -0,0 +1,31 @@ +--- +galaxy_info: + author: Brett Delle Grazie + description: Role to install Prometheus Nginx Exporter + + license: GPLv3 + + min_ansible_version: 2.0 + + platforms: + - name: EL + versions: + - 6 + - 7 + - name: Fedora + versions: + - all + - name: Ubuntu + versions: + - all + - name: Debian + versions: + - all + + galaxy_tags: + - prometheus + - exporter + - nginx + +dependencies: + - { role: 'bdellegrazie.ansible-role-prometheus_exporter', version: 'v1.1.3' } diff --git a/app/scripts/ansible/roles/nginx_exporter/tasks/main.yml b/app/scripts/ansible/roles/nginx_exporter/tasks/main.yml new file mode 100644 index 00000000..37115a59 --- /dev/null +++ b/app/scripts/ansible/roles/nginx_exporter/tasks/main.yml @@ -0,0 +1,161 @@ +--- +- name: group + become: true + become_user: root + group: + name: "{{ nginx_exporter_group }}" + state: present + system: true + when: nginx_exporter_group_manage | bool + +- name: user + become: true + become_user: root + user: + name: "{{ nginx_exporter_user }}" + group: "{{ nginx_exporter_group }}" + home: "{{ nginx_exporter_home }}" + createhome: false + move_home: false + comment: nginx_exporter + state: present + system: true + when: nginx_exporter_user_manage | bool + +- name: home + become: true + become_user: root + file: + path: "{{ nginx_exporter_home }}" + owner: "{{ nginx_exporter_user }}" + group: "{{ nginx_exporter_group }}" + mode: "u=rwx,g=rx,o=" + state: directory + when: nginx_exporter_home_manage | bool + +- name: logs + become: true + become_user: root + file: + path: "{{ nginx_exporter_log_path }}" + owner: "{{ nginx_exporter_user }}" + group: "{{ nginx_exporter_group }}" + mode: "u=rwx,g=rx,o=" + state: directory + +- name: download tarball + become: true + become_user: root + ignore_errors: yes + get_url: + url: "{{ nginx_exporter_tarball_url }}" + dest: "{{ prometheus_exporter_dist_dir }}/{{ nginx_exporter_signature }}.tar.gz" + owner: root + group: root + mode: "u=rwx,go=rx" + when: nginx_exporter_version is version('0.9.0', '>=') + +- name: download tarball alt + become: true + become_user: root + ignore_errors: yes + get_url: + url: "{{ nginx_exporter_tarball_url_alt }}" + dest: "{{ prometheus_exporter_dist_dir }}/{{ nginx_exporter_signature }}.tar.gz" + owner: root + group: root + mode: "u=rwx,go=rx" + when: nginx_exporter_version is version('0.8.0', '<=') + +- name: make distribution directory + become: true + become_user: root + file: + path: "{{ nginx_exporter_dist_dir }}" + owner: root + group: root + mode: "u=rwx,go=rx" + state: directory + when: nginx_exporter_version is version('0.9.0', '>=') + +- name: make distribution directory alt + become: true + become_user: root + file: + path: "{{ nginx_exporter_dist_dir_alt }}" + owner: root + group: root + mode: "u=rwx,go=rx" + state: directory + when: nginx_exporter_version is version('0.9.0', '<=') + +- name: untar tarball + become: true + become_user: root + unarchive: + src: "{{ prometheus_exporter_dist_dir }}/{{ nginx_exporter_signature }}.tar.gz" + dest: "{{ nginx_exporter_dist_dir }}" + remote_src: true + owner: root + group: root + mode: "u=rwx,go=rx" + creates: "{{ nginx_exporter_dist_dir }}/nginx-prometheus-exporter" +# when: nginx_exporter_version is version('0.9.0', '>=') +# +#- name: untar tarball alt +# become: true +# become_user: root +# unarchive: +# src: "{{ prometheus_exporter_dist_dir }}/{{ nginx_exporter_signature_alt }}.tar.gz" +# dest: "{{ nginx_exporter_dist_dir }}" +# remote_src: true +# owner: root +# group: root +# mode: "u=rwx,go=rx" +# creates: "{{ nginx_exporter_dist_dir }}/nginx-prometheus-exporter" +# when: nginx_exporter_version is version('0.8.0', '<=') + +- name: symlink + become: true + become_user: root + file: + src: "{{ nginx_exporter_dist_dir }}/nginx-prometheus-exporter" + path: "{{ prometheus_exporter_dir }}/nginx_exporter" + owner: root + group: root + force: true + state: link + notify: restart nginx_exporter + +- name: config + become: true + become_user: root + template: + src: "nginx_exporter.default.conf.j2" + dest: "/etc/default/nginx_exporter" + owner: root + group: root + mode: "u=rw,go=r" + notify: restart nginx_exporter + +- name: install service + include: service-{{ prometheus_exporter_service_mgr }}.yml + +- name: Service Enabled + become: true + become_user: root + service: + name: nginx_exporter + enabled: "{{ nginx_exporter_service_enable }}" + use: "{{ prometheus_exporter_service_mgr }}" + when: nginx_exporter_service_manage + +- name: Service State + become: true + become_user: root + service: + name: nginx_exporter + state: "{{ nginx_exporter_service_state }}" + use: "{{ prometheus_exporter_service_mgr }}" + register: _nginx_exporter_service_state + when: nginx_exporter_service_manage diff --git a/app/scripts/ansible/roles/nginx_exporter/tasks/service-systemd.yml b/app/scripts/ansible/roles/nginx_exporter/tasks/service-systemd.yml new file mode 100644 index 00000000..47129974 --- /dev/null +++ b/app/scripts/ansible/roles/nginx_exporter/tasks/service-systemd.yml @@ -0,0 +1,12 @@ +--- +- name: systemd service + become: true + template: + src: "nginx_exporter.systemd.j2" + dest: "/lib/systemd/system/nginx_exporter.service" + owner: root + group: root + mode: "u=rw,go=r" + notify: + - reload systemd daemon + - restart nginx_exporter diff --git a/app/scripts/ansible/roles/nginx_exporter/tasks/service-sysvinit.yml b/app/scripts/ansible/roles/nginx_exporter/tasks/service-sysvinit.yml new file mode 100644 index 00000000..efc09633 --- /dev/null +++ b/app/scripts/ansible/roles/nginx_exporter/tasks/service-sysvinit.yml @@ -0,0 +1,11 @@ +--- +- name: sysvinit service + become: true + template: + src: "nginx_exporter.sysvinit.j2" + dest: "/etc/init.d/nginx_exporter" + owner: root + group: root + mode: "u=rwx,go=rx" + notify: + - restart nginx_exporter diff --git a/app/scripts/ansible/roles/nginx_exporter/tasks/service-upstart.yml b/app/scripts/ansible/roles/nginx_exporter/tasks/service-upstart.yml new file mode 100644 index 00000000..4c2e8394 --- /dev/null +++ b/app/scripts/ansible/roles/nginx_exporter/tasks/service-upstart.yml @@ -0,0 +1,11 @@ +--- +- name: upstart service + become: true + template: + src: "nginx_exporter.upstart.j2" + dest: "/etc/init/nginx_exporter.conf" + owner: root + group: root + mode: "u=rw,go=r" + notify: + - restart nginx_exporter diff --git a/app/scripts/ansible/roles/nginx_exporter/templates/nginx_exporter.default.conf.j2 b/app/scripts/ansible/roles/nginx_exporter/templates/nginx_exporter.default.conf.j2 new file mode 100644 index 00000000..12093651 --- /dev/null +++ b/app/scripts/ansible/roles/nginx_exporter/templates/nginx_exporter.default.conf.j2 @@ -0,0 +1 @@ +OPTIONS="{{ nginx_exporter_options | join(' ') }}" diff --git a/app/scripts/ansible/roles/nginx_exporter/templates/nginx_exporter.systemd.j2 b/app/scripts/ansible/roles/nginx_exporter/templates/nginx_exporter.systemd.j2 new file mode 100644 index 00000000..ba119d68 --- /dev/null +++ b/app/scripts/ansible/roles/nginx_exporter/templates/nginx_exporter.systemd.j2 @@ -0,0 +1,16 @@ +[Unit] +Description=nginx_exporter - Exporter for nginx metrics. +Documentation=https://github.com/nginxinc/nginx-prometheus-exporter +After=network.target + +[Service] +User={{ nginx_exporter_user }} +Group={{ nginx_exporter_group }} +EnvironmentFile={{ nginx_exporter_config_file }} +ExecStart={{ nginx_exporter_program }} $OPTIONS + +SyslogIdentifier=nginx_exporter +Restart=always + +[Install] +WantedBy=multi-user.target diff --git a/app/scripts/ansible/roles/nginx_exporter/templates/nginx_exporter.sysvinit.j2 b/app/scripts/ansible/roles/nginx_exporter/templates/nginx_exporter.sysvinit.j2 new file mode 100644 index 00000000..144d435b --- /dev/null +++ b/app/scripts/ansible/roles/nginx_exporter/templates/nginx_exporter.sysvinit.j2 @@ -0,0 +1,125 @@ +#!/bin/sh +# +# nginx_exporter Start/Stop the nginx_exporter daemon +# +# chkconfig: - 80 20 +# description: nginx_exporter is a metrics daemon for Prometheus. +# processname: nginx_exporter + +### BEGIN INIT INFO +# Provides: nginx_exporter +# Required-Start: $remote_fs $syslog +# Required-Stop: $remote_fs $syslog +# Default-Start: 2 3 4 5 +# Default-Stop: 0 1 6 +# Short-Description: Start/Stop the nginx_exporter daemon +# Description: nginx_exporter is a metrics daemon for Prometheus. +### END INIT INFO + +# Source function library. +if [ -f /etc/init.d/functions ] ; then + . /etc/init.d/functions +fi + +# defaults +FLAGS="" + +# config +if [ -f "{{ nginx_exporter_config_file }}" ] ; then + . "{{ nginx_exporter_config_file }}" +fi + +RETVAL=0 + +# Set up some common variables before we launch into what might be +# considered boilerplate by now. +prog="{{ nginx_exporter_program }}" +name="$(basename $prog)" +binary="$(readlink -f $prog)" +lockfile="/var/lock/subsys/$name" +logdir="{{ nginx_exporter_log_path }}" +pidfile="{{ nginx_exporter_pid_path }}/$name.pid" +user="{{ nginx_exporter_user }}" +group="{{ nginx_exporter_group }}" + +start() { + [ -r $binary ] || exit 5 + [ -d $logdir ] || ( + mkdir -p $logdir + chmod 0750 $logdir + chown $user:$group $logdir + ) + echo -n $"Starting $name: " + export DATA_SOURCE_NAME + daemonize -a -c '/' -e ${logdir}/${name}.err.log -o ${logdir}/${name}.out.log \ + -p $pidfile -l $lockfile -u $user \ + $prog $OPTIONS + RETVAL=$? + echo + [ $RETVAL -eq 0 ] && touch $lockfile + return $RETVAL +} + +stop() { + echo -n $"Stopping $prog: " + killproc -p $pidfile $binary + RETVAL=$? + echo + [ $RETVAL -eq 0 ] && rm -f $lockfile + return $RETVAL +} + +restart() { + stop + start +} + +reload() { + restart +} + +force_reload() { + restart +} + +rh_status() { + # run checks to determine if the service is running or use generic status + status -p $pidfile -l $lockfile $binary +} + +rh_status_q() { + rh_status >/dev/null 2>&1 +} + +case "$1" in + start) + rh_status_q && exit 0 + start + ;; + stop) + rh_status_q || exit 0 + stop + ;; + restart) + restart + ;; + reload) + rh_status_q || exit 7 + reload + ;; + force-reload) + force_reload + ;; + status) + rh_status + ;; + condrestart|try-restart) + rh_status_q || exit 0 + restart + ;; + *) + echo $"Usage: $0 {start|stop|status|restart|condrestart|try-restart|reload|force-reload}" + exit 2 +esac + +exit $? diff --git a/app/scripts/ansible/roles/nginx_exporter/templates/nginx_exporter.upstart.j2 b/app/scripts/ansible/roles/nginx_exporter/templates/nginx_exporter.upstart.j2 new file mode 100644 index 00000000..54bad4a6 --- /dev/null +++ b/app/scripts/ansible/roles/nginx_exporter/templates/nginx_exporter.upstart.j2 @@ -0,0 +1,26 @@ +description "Prometheus NGINX Exporter" +start on (local-filesystems and net-device-up IFACE!=lo) +stop on runlevel [016] + +respawn + +setuid {{ nginx_exporter_user }} +setgid {{ nginx_exporter_group }} + +env name=nginx_exporter +env prog={{ nginx_exporter_program }} +env logdir={{ nginx_exporter_log_path }} +env user={{ nginx_exporter_user }} +env group={{ nginx_exporter_group }} + +script + if [ -f "{{ nginx_exporter_config_file }}" ] ; then + . "{{ nginx_exporter_config_file }}" + fi + + pidfile={{ nginx_exporter_pid_path }}/$name.pid + lockfile=/var/lock/subsys/$name + + binary=$(readlink -f $prog) + exec $binary $OPTIONS >> "${logdir}/${name}.out.log" 2>> "${logdir}/${name}.err.log" +end script diff --git a/app/scripts/ansible/roles/node_exporter.yml b/app/scripts/ansible/roles/node_exporter.yml index d9931e45..d9e0b80e 100644 --- a/app/scripts/ansible/roles/node_exporter.yml +++ b/app/scripts/ansible/roles/node_exporter.yml @@ -32,7 +32,7 @@ roles: - - role: cloudalchemy.node_exporter + - role: node_exporter environment: http_proxy: "{{PROXY}}" https_proxy: "{{PROXY}}" diff --git a/app/scripts/ansible/roles/node_exporter/defaults/main.yml b/app/scripts/ansible/roles/node_exporter/defaults/main.yml new file mode 100644 index 00000000..0f8e6d9a --- /dev/null +++ b/app/scripts/ansible/roles/node_exporter/defaults/main.yml @@ -0,0 +1,28 @@ +--- +node_exporter_version: 1.1.2 +node_exporter_binary_local_dir: "" +node_exporter_web_listen_address: "0.0.0.0:9100" +node_exporter_web_telemetry_path: "/metrics" + +node_exporter_textfile_dir: "/var/lib/node_exporter" + +node_exporter_tls_server_config: {} + +node_exporter_http_server_config: {} + +node_exporter_basic_auth_users: {} + +node_exporter_enabled_collectors: + - systemd + - textfile: + directory: "{{ node_exporter_textfile_dir }}" +# - filesystem: +# ignored-mount-points: "^/(sys|proc|dev)($|/)" +# ignored-fs-types: "^(sys|proc|auto)fs$" + +node_exporter_disabled_collectors: [] + +# Internal variables. +_node_exporter_binary_install_dir: "/usr/local/bin" +_node_exporter_system_group: "node-exp" +_node_exporter_system_user: "{{ _node_exporter_system_group }}" diff --git a/app/scripts/ansible/roles/node_exporter/meta/main.yml b/app/scripts/ansible/roles/node_exporter/meta/main.yml new file mode 100644 index 00000000..f6b8d403 --- /dev/null +++ b/app/scripts/ansible/roles/node_exporter/meta/main.yml @@ -0,0 +1,33 @@ +--- +galaxy_info: + author: cloudalchemy + role_name: node_exporter + description: Prometheus Node Exporter + license: MIT + company: none + min_ansible_version: 2.7 + platforms: + - name: Ubuntu + versions: + - bionic + - xenial + - name: Debian + versions: + - stretch + - buster + - name: EL + versions: + - 7 + - 8 + - name: Fedora + versions: + - 30 + - 31 + galaxy_tags: + - monitoring + - prometheus + - exporter + - metrics + - system + +dependencies: [] diff --git a/app/scripts/ansible/roles/node_exporter/tasks/install.yml b/app/scripts/ansible/roles/node_exporter/tasks/install.yml new file mode 100644 index 00000000..42ef003e --- /dev/null +++ b/app/scripts/ansible/roles/node_exporter/tasks/install.yml @@ -0,0 +1,61 @@ +--- +- name: Create the node_exporter group + group: + name: "{{ _node_exporter_system_group }}" + state: present + system: true + when: _node_exporter_system_group != "root" + +- name: Create the node_exporter user + user: + name: "{{ _node_exporter_system_user }}" + groups: "{{ _node_exporter_system_group }}" + append: true + shell: /usr/sbin/nologin + system: true + create_home: false + home: / + when: _node_exporter_system_user != "root" + +- block: + - name: Download node_exporter binary to local folder + get_url: + url: "https://github.com/prometheus/node_exporter/releases/download/v{{ node_exporter_version }}/node_exporter-{{ node_exporter_version }}.linux-{{ go_arch }}.tar.gz" + dest: "/tmp/node_exporter-{{ node_exporter_version }}.linux-{{ go_arch }}.tar.gz" + checksum: "sha256:{{ node_exporter_checksum }}" + mode: '0644' + register: _download_binary + until: _download_binary is succeeded + retries: 5 + delay: 2 + check_mode: false + + - name: Unpack node_exporter binary + unarchive: + src: "/tmp/node_exporter-{{ node_exporter_version }}.linux-{{ go_arch }}.tar.gz" + dest: "/tmp" + creates: "/tmp/node_exporter-{{ node_exporter_version }}.linux-{{ go_arch }}/node_exporter" + remote_src: true + check_mode: false + + - name: Propagate node_exporter binaries + copy: + src: "/tmp/node_exporter-{{ node_exporter_version }}.linux-{{ go_arch }}/node_exporter" + dest: "{{ _node_exporter_binary_install_dir }}/node_exporter" + mode: 0755 + owner: root + group: root + remote_src: true + notify: restart node_exporter + when: not ansible_check_mode + when: node_exporter_binary_local_dir | length == 0 + +- name: propagate locally distributed node_exporter binary + copy: + src: "{{ node_exporter_binary_local_dir }}/node_exporter" + dest: "{{ _node_exporter_binary_install_dir }}/node_exporter" + mode: 0755 + owner: root + group: root + when: node_exporter_binary_local_dir | length > 0 + notify: restart node_exporter diff --git a/app/scripts/ansible/roles/node_exporter/tasks/main.yml b/app/scripts/ansible/roles/node_exporter/tasks/main.yml new file mode 100644 index 00000000..74d0ad84 --- /dev/null +++ b/app/scripts/ansible/roles/node_exporter/tasks/main.yml @@ -0,0 +1,38 @@ +--- +- import_tasks: preflight.yml + tags: + - node_exporter_install + - node_exporter_configure + - node_exporter_run + +- import_tasks: install.yml + become: true +# when: +# ( not __node_exporter_is_installed.stat.exists ) or +# ( __node_exporter_current_version_output.stderr_lines[0].split(" ")[2] != node_exporter_version ) or +# ( node_exporter_binary_local_dir | length > 0 ) + tags: + - node_exporter_install + +- import_tasks: selinux.yml + become: true + when: ansible_selinux.status == "enabled" + tags: + - node_exporter_configure + +- import_tasks: configure.yml + become: true + tags: + - node_exporter_configure + +- name: Ensure Node Exporter is enabled on boot + become: true + systemd: + daemon_reload: true + name: node_exporter + enabled: true + state: started + when: + - not ansible_check_mode + tags: + - node_exporter_run diff --git a/app/scripts/ansible/roles/node_exporter/tasks/preflight.yml b/app/scripts/ansible/roles/node_exporter/tasks/preflight.yml new file mode 100644 index 00000000..aff6395d --- /dev/null +++ b/app/scripts/ansible/roles/node_exporter/tasks/preflight.yml @@ -0,0 +1,86 @@ +--- +- name: Assert usage of systemd as an init system + assert: + that: ansible_service_mgr == 'systemd' + msg: "This role only works with systemd" + +- name: Get systemd version + command: systemctl --version + changed_when: false + check_mode: false + register: __systemd_version + tags: + - skip_ansible_lint + +- name: Set systemd version fact + set_fact: + node_exporter_systemd_version: "{{ __systemd_version.stdout_lines[0] | regex_replace('^systemd\\s(\\d+).*$', '\\1') }}" + +- name: Naive assertion of proper listen address + assert: + that: + - "':' in node_exporter_web_listen_address" + +- name: Assert collectors are not both disabled and enabled at the same time + assert: + that: + - "item not in node_exporter_enabled_collectors" + with_items: "{{ node_exporter_disabled_collectors }}" + +- block: + - name: Assert that TLS key and cert path are set + assert: + that: + - "node_exporter_tls_server_config.cert_file is defined" + - "node_exporter_tls_server_config.key_file is defined" + + - name: Check existence of TLS cert file + stat: + path: "{{ node_exporter_tls_server_config.cert_file }}" + register: __node_exporter_cert_file + + - name: Check existence of TLS key file + stat: + path: "{{ node_exporter_tls_server_config.key_file }}" + register: __node_exporter_key_file + + - name: Assert that TLS key and cert are present + assert: + that: + - "{{ __node_exporter_cert_file.stat.exists }}" + - "{{ __node_exporter_key_file.stat.exists }}" + when: node_exporter_tls_server_config | length > 0 + +- name: Check if node_exporter is installed + stat: + path: "{{ _node_exporter_binary_install_dir }}/node_exporter" + register: __node_exporter_is_installed + check_mode: false + tags: + - node_exporter_install + +- name: Gather currently installed node_exporter version (if any) + command: "{{ _node_exporter_binary_install_dir }}/node_exporter --version" + args: + warn: false + changed_when: false + register: __node_exporter_current_version_output + check_mode: false + when: __node_exporter_is_installed.stat.exists + tags: + - node_exporter_install + - skip_ansible_lint + +- block: + - name: Get checksum list from github + set_fact: + _checksums: "{{ lookup('url', 'https://github.com/prometheus/node_exporter/releases/download/v' + node_exporter_version + '/sha256sums.txt', wantlist=True) | list }}" + run_once: true + + - name: "Get checksum for {{ go_arch }} architecture" + set_fact: + node_exporter_checksum: "{{ item.split(' ')[0] }}" + with_items: "{{ _checksums }}" + when: + - "('linux-' + go_arch + '.tar.gz') in item" + when: node_exporter_binary_local_dir | length == 0 diff --git a/app/scripts/ansible/roles/node_exporter/tasks/selinux.yml b/app/scripts/ansible/roles/node_exporter/tasks/selinux.yml new file mode 100644 index 00000000..e5efae54 --- /dev/null +++ b/app/scripts/ansible/roles/node_exporter/tasks/selinux.yml @@ -0,0 +1,39 @@ +--- +- name: Install selinux python packages [RHEL] + package: + name: + - "{{ ( (ansible_facts.distribution_major_version | int) < 8) | ternary('libselinux-python','python3-libselinux') }}" + - "{{ ( (ansible_facts.distribution_major_version | int) < 8) | ternary('policycoreutils-python','python3-policycoreutils') }}" + state: present + register: _install_selinux_packages + until: _install_selinux_packages is success + retries: 5 + delay: 2 + when: + - (ansible_distribution | lower == "redhat") or + (ansible_distribution | lower == "centos") + +- name: Install selinux python packages [Fedora] + package: + name: + - "{{ ( (ansible_facts.distribution_major_version | int) < 29) | ternary('libselinux-python','python3-libselinux') }}" + - "{{ ( (ansible_facts.distribution_major_version | int) < 29) | ternary('policycoreutils-python','python3-policycoreutils') }}" + state: present + register: _install_selinux_packages + until: _install_selinux_packages is success + retries: 5 + delay: 2 + + when: + - ansible_distribution | lower == "fedora" + +- name: Install selinux python packages [clearlinux] + package: + name: sysadmin-basic + state: present + register: _install_selinux_packages + until: _install_selinux_packages is success + retries: 5 + delay: 2 + when: + - ansible_distribution | lower == "clearlinux" diff --git a/app/scripts/ansible/roles/node_exporter/templates/config.yaml.j2 b/app/scripts/ansible/roles/node_exporter/templates/config.yaml.j2 new file mode 100644 index 00000000..9013722c --- /dev/null +++ b/app/scripts/ansible/roles/node_exporter/templates/config.yaml.j2 @@ -0,0 +1,18 @@ +--- +{{ ansible_managed | comment }} +{% if node_exporter_tls_server_config | length > 0 %} +tls_server_config: +{{ node_exporter_tls_server_config | to_nice_yaml | indent(2, true) }} +{% endif %} + +{% if node_exporter_http_server_config | length > 0 %} +http_server_config: +{{ node_exporter_http_server_config | to_nice_yaml | indent(2, true) }} +{% endif %} + +{% if node_exporter_basic_auth_users | length > 0 %} +basic_auth_users: +{% for k, v in node_exporter_basic_auth_users.items() %} + {{ k }}: {{ v | password_hash('bcrypt', ('abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890' | shuffle(seed=inventory_hostname) | join)[:22], rounds=9) }} +{% endfor %} +{% endif %} diff --git a/app/scripts/ansible/roles/node_exporter/templates/node_exporter.service.j2 b/app/scripts/ansible/roles/node_exporter/templates/node_exporter.service.j2 new file mode 100644 index 00000000..003b474c --- /dev/null +++ b/app/scripts/ansible/roles/node_exporter/templates/node_exporter.service.j2 @@ -0,0 +1,54 @@ +{{ ansible_managed | comment }} + +[Unit] +Description=Prometheus Node Exporter +After=network-online.target + +[Service] +Type=simple +User={{ _node_exporter_system_user }} +Group={{ _node_exporter_system_group }} +ExecStart={{ _node_exporter_binary_install_dir }}/node_exporter \ +{% for collector in node_exporter_enabled_collectors -%} +{% if not collector is mapping %} + --collector.{{ collector }} \ +{% else -%} +{% set name, options = (collector.items()|list)[0] -%} + --collector.{{ name }} \ +{% for k,v in options|dictsort %} + --collector.{{ name }}.{{ k }}={{ v | quote }} \ +{% endfor -%} +{% endif -%} +{% endfor -%} +{% for collector in node_exporter_disabled_collectors %} + --no-collector.{{ collector }} \ +{% endfor %} +{% if node_exporter_tls_server_config | length > 0 or node_exporter_http_server_config | length > 0 or node_exporter_basic_auth_users | length > 0 %} + --web.config=/etc/node_exporter/config.yaml \ +{% endif %} + --web.listen-address={{ node_exporter_web_listen_address }} \ + --web.telemetry-path={{ node_exporter_web_telemetry_path }} + +SyslogIdentifier=node_exporter +Restart=always +RestartSec=1 +StartLimitInterval=0 + +{% for m in ansible_mounts if m.mount == '/home' %} +ProtectHome=read-only +{% else %} +ProtectHome=yes +{% endfor %} +NoNewPrivileges=yes + +{% if node_exporter_systemd_version | int >= 232 %} +ProtectSystem=strict +ProtectControlGroups=true +ProtectKernelModules=true +ProtectKernelTunables=yes +{% else %} +ProtectSystem=full +{% endif %} + +[Install] +WantedBy=multi-user.target diff --git a/app/scripts/ansible/roles/node_exporter/vars/main.yml b/app/scripts/ansible/roles/node_exporter/vars/main.yml new file mode 100644 index 00000000..fdcd1265 --- /dev/null +++ b/app/scripts/ansible/roles/node_exporter/vars/main.yml @@ -0,0 +1,9 @@ +--- +go_arch_map: + i386: '386' + x86_64: 'amd64' + aarch64: 'arm64' + armv7l: 'armv7' + armv6l: 'armv6' + +go_arch: "{{ go_arch_map[ansible_architecture] | default(ansible_architecture) }}" diff --git a/app/scripts/install_geoip.sh b/app/scripts/install_geoip.sh index 1d96dcac..be29174b 100644 --- a/app/scripts/install_geoip.sh +++ b/app/scripts/install_geoip.sh @@ -34,7 +34,7 @@ if [[ $maxmind_key == "" ]]; then fi if [[ $KEY == "" ]]; then - ansible-playbook $PWD/roles/geoip.yml -e "ansible_user=$USER ansible_ssh_pass=$PASS variable_host=$HOST PROXY=$PROXY UPDATE=$UPDATE haproxy_dir=$haproxy_dir maxmind_key=$maxmind_key SSH_PORT=$SSH_PORT" -i $PWD/$HOST + ansible-playbook $PWD/roles/geoip.yml -e "ansible_user=$USER ansible_ssh_pass='$PASS' variable_host=$HOST PROXY=$PROXY UPDATE=$UPDATE haproxy_dir=$haproxy_dir maxmind_key=$maxmind_key SSH_PORT=$SSH_PORT" -i $PWD/$HOST else ansible-playbook $PWD/roles/geoip.yml --key-file $KEY -e "ansible_user=$USER variable_host=$HOST PROXY=$PROXY UPDATE=$UPDATE haproxy_dir=$haproxy_dir maxmind_key=$maxmind_key SSH_PORT=$SSH_PORT" -i $PWD/$HOST fi diff --git a/app/scripts/install_haproxy_exporter.sh b/app/scripts/install_haproxy_exporter.sh index 66a1e0f6..d6569c76 100644 --- a/app/scripts/install_haproxy_exporter.sh +++ b/app/scripts/install_haproxy_exporter.sh @@ -10,21 +10,23 @@ do USER) USER=${VALUE} ;; PASS) PASS=${VALUE} ;; KEY) KEY=${VALUE} ;; + VER) VER=${VALUE} ;; STAT_PORT) STAT_PORT=${VALUE} ;; STAT_PAGE) STAT_PAGE=${VALUE} ;; STATS_USER) STATS_USER=${VALUE} ;; STATS_PASS) STATS_PASS=${VALUE} ;; + EXP_PROM) EXP_PROM=${VALUE} ;; SSH_PORT) SSH_PORT=${VALUE} ;; *) esac done -if [ ! -d "/var/www/haproxy-wi/app/scripts/ansible/roles/bdellegrazie.haproxy_exporter" ]; then +if [ ! -d "/var/www/haproxy-wi/app/scripts/ansible/roles/bdellegrazie.ansible-role-prometheus_exporter" ]; then if [[ -n $PROXY ]];then export https_proxy="$PROXY" export http_proxy="$PROXY" fi - ansible-galaxy install bdellegrazie.haproxy_exporter --roles-path /var/www/haproxy-wi/app/scripts/ansible/roles/ + ansible-galaxy install bdellegrazie.ansible-role-prometheus_exporter --roles-path /var/www/haproxy-wi/app/scripts/ansible/roles/ bash -c cat << EOF >> /var/www/haproxy-wi/app/scripts/ansible/roles/bdellegrazie.ansible-role-prometheus_exporter/vars/vars-family-redhat-8.yml --- prometheus_exporter_ansible_packages: @@ -41,9 +43,9 @@ PWD=$PWD/scripts/ansible/ echo "$HOST ansible_port=$SSH_PORT" > "$PWD"/"$HOST" if [[ $KEY == "" ]]; then - ansible-playbook "$PWD"/roles/haproxy_exporter.yml -e "ansible_user=$USER ansible_ssh_pass=$PASS variable_host=$HOST PROXY=$PROXY STAT_PAGE=$STAT_PAGE STAT_PORT=$STAT_PORT STATS_USER=$STATS_USER STATS_PASS=$STATS_PASS SSH_PORT=$SSH_PORT" -i "$PWD"/"$HOST" + ansible-playbook "$PWD"/roles/haproxy_exporter.yml -e "ansible_user=$USER ansible_ssh_pass='$PASS' variable_host=$HOST PROXY=$PROXY STAT_PAGE=$STAT_PAGE STAT_PORT=$STAT_PORT STATS_USER=$STATS_USER STATS_PASS=$STATS_PASS SSH_PORT=$SSH_PORT haproxy_exporter_version=$VER" -i "$PWD"/"$HOST" else - ansible-playbook "$PWD"/roles/haproxy_exporter.yml --key-file "$KEY" -e "ansible_user=$USER variable_host=$HOST PROXY=$PROXY STAT_PAGE=$STAT_PAGE STAT_PORT=$STAT_PORT STATS_USER=$STATS_USER STATS_PASS=$STATS_PASS SSH_PORT=$SSH_PORT" -i "$PWD"/"$HOST" + ansible-playbook "$PWD"/roles/haproxy_exporter.yml --key-file "$KEY" -e "ansible_user=$USER variable_host=$HOST PROXY=$PROXY STAT_PAGE=$STAT_PAGE STAT_PORT=$STAT_PORT STATS_USER=$STATS_USER STATS_PASS=$STATS_PASS SSH_PORT=$SSH_PORT haproxy_exporter_version=$VER" -i "$PWD"/"$HOST" fi if [ $? -gt 0 ] @@ -52,9 +54,12 @@ then exit 1 fi -if ! sudo grep -Fxq " - $HOST:9101" /etc/prometheus/prometheus.yml; then - sudo echo " - $HOST:9101" | sudo tee -a /etc/prometheus/prometheus.yml > /dev/null +if [ "$EXP_PROM" == 0 ] +then + if ! sudo grep -Fxq " - $HOST:9101" /etc/prometheus/prometheus.yml; then + sudo echo " - $HOST:9101" | sudo tee -a /etc/prometheus/prometheus.yml > /dev/null + sudo systemctl reload prometheus 2>> /dev/null + fi fi -sudo systemctl reload prometheus rm -f "$PWD"/"$HOST" diff --git a/app/scripts/install_keepalived.sh b/app/scripts/install_keepalived.sh index 783a5106..e718f747 100644 --- a/app/scripts/install_keepalived.sh +++ b/app/scripts/install_keepalived.sh @@ -32,7 +32,7 @@ PWD=$PWD/scripts/ansible/ echo "$HOST ansible_port=$SSH_PORT" > $PWD/$HOST if [[ $KEY == "" ]]; then - ansible-playbook $PWD/roles/keepalived.yml -e "ansible_user=$USER ansible_ssh_pass=$PASS variable_host=$HOST SYN_FLOOD=$SYN_FLOOD PROXY=$PROXY MASTER=$MASTER ETH=$ETH IP=$IP RESTART=$RESTART ADD_VRRP=$ADD_VRRP SSH_PORT=$SSH_PORT" -i $PWD/$HOST + ansible-playbook $PWD/roles/keepalived.yml -e "ansible_user=$USER ansible_ssh_pass='$PASS' variable_host=$HOST SYN_FLOOD=$SYN_FLOOD PROXY=$PROXY MASTER=$MASTER ETH=$ETH IP=$IP RESTART=$RESTART ADD_VRRP=$ADD_VRRP SSH_PORT=$SSH_PORT" -i $PWD/$HOST else ansible-playbook $PWD/roles/keepalived.yml --key-file $KEY -e "ansible_user=$USER variable_host=$HOST SYN_FLOOD=$SYN_FLOOD PROXY=$PROXY MASTER=$MASTER ETH=$ETH IP=$IP RESTART=$RESTART ADD_VRRP=$ADD_VRRP SSH_PORT=$SSH_PORT" -i $PWD/$HOST fi diff --git a/app/scripts/install_nginx.sh b/app/scripts/install_nginx.sh index e7d5c24a..1633132a 100644 --- a/app/scripts/install_nginx.sh +++ b/app/scripts/install_nginx.sh @@ -48,7 +48,7 @@ PWD=$PWD/scripts/ansible/ echo "$HOST ansible_port=$SSH_PORT" > $PWD/$HOST if [[ $KEY == "" ]]; then - ansible-playbook $PWD/roles/nginx.yml -e "ansible_user=$USER ansible_ssh_pass=$PASS variable_host=$HOST PROXY=$PROXY CONT_NAME=$CONT_NAME SYN_FLOOD=$SYN_FLOOD STAT_PAGE=$STAT_PAGE STAT_PORT=$STAT_PORT STATS_USER=$STATS_USER STATS_PASS=$STATS_PASS CONFIG_PATH=$CONFIG_PATH SSH_PORT=$SSH_PORT" -i $PWD/$HOST -t $tags + ansible-playbook $PWD/roles/nginx.yml -e "ansible_user=$USER ansible_ssh_pass='$PASS' variable_host=$HOST PROXY=$PROXY CONT_NAME=$CONT_NAME SYN_FLOOD=$SYN_FLOOD STAT_PAGE=$STAT_PAGE STAT_PORT=$STAT_PORT STATS_USER=$STATS_USER STATS_PASS=$STATS_PASS CONFIG_PATH=$CONFIG_PATH SSH_PORT=$SSH_PORT" -i $PWD/$HOST -t $tags else ansible-playbook $PWD/roles/nginx.yml --key-file $KEY -e "ansible_user=$USER variable_host=$HOST PROXY=$PROXY CONT_NAME=$CONT_NAME SYN_FLOOD=$SYN_FLOOD STAT_PAGE=$STAT_PAGE STAT_PORT=$STAT_PORT STATS_USER=$STATS_USER STATS_PASS=$STATS_PASS CONFIG_PATH=$CONFIG_PATH SSH_PORT=$SSH_PORT" -i $PWD/$HOST -t $tags fi diff --git a/app/scripts/install_nginx_exporter.sh b/app/scripts/install_nginx_exporter.sh index 29a6abf7..a7e2873e 100644 --- a/app/scripts/install_nginx_exporter.sh +++ b/app/scripts/install_nginx_exporter.sh @@ -9,22 +9,29 @@ do HOST) HOST=${VALUE} ;; USER) USER=${VALUE} ;; PASS) PASS=${VALUE} ;; - KEY) KEY=${VALUE} ;; - STAT_PORT) STAT_PORT=${VALUE} ;; - STAT_PAGE) STAT_PAGE=${VALUE} ;; - STATS_USER) STATS_USER=${VALUE} ;; + KEY) KEY=${VALUE} ;; + VER) VER=${VALUE} ;; + EXP_PROM) EXP_PROM=${VALUE} ;; + STAT_PORT) STAT_PORT=${VALUE} ;; + STAT_PAGE) STAT_PAGE=${VALUE} ;; + STATS_USER) STATS_USER=${VALUE} ;; STATS_PASS) STATS_PASS=${VALUE} ;; - SSH_PORT) SSH_PORT=${VALUE} ;; + SSH_PORT) SSH_PORT=${VALUE} ;; *) esac done -if [ ! -d "/var/www/haproxy-wi/app/scripts/ansible/roles/bdellegrazie.nginx_exporter" ]; then +if [ ! -d "/var/www/haproxy-wi/app/scripts/ansible/roles/bdellegrazie.ansible-role-prometheus_exporter" ]; then if [ ! -z $PROXY ];then export https_proxy="$PROXY" export http_proxy="$PROXY" fi - ansible-galaxy install bdellegrazie.nginx_exporter --roles-path /var/www/haproxy-wi/app/scripts/ansible/roles/ + ansible-galaxy install bdellegrazie.ansible-role-prometheus_exporter --roles-path /var/www/haproxy-wi/app/scripts/ansible/roles/ + bash -c cat << EOF >> /var/www/haproxy-wi/app/scripts/ansible/roles/bdellegrazie.ansible-role-prometheus_exporter/vars/vars-family-redhat-8.yml +--- +prometheus_exporter_ansible_packages: + - libselinux-python3 +EOF fi export ANSIBLE_HOST_KEY_CHECKING=False @@ -38,9 +45,9 @@ PWD=$PWD/scripts/ansible/ echo "$HOST ansible_port=$SSH_PORT" > $PWD/$HOST if [[ $KEY == "" ]]; then - ansible-playbook $PWD/roles/nginx_exporter.yml -e "ansible_user=$USER ansible_ssh_pass=$PASS variable_host=$HOST PROXY=$PROXY STAT_PAGE=$STAT_PAGE STAT_PORT=$STAT_PORT STATS_USER=$STATS_USER STATS_PASS=$STATS_PASS SSH_PORT=$SSH_PORT" -i $PWD/$HOST + ansible-playbook $PWD/roles/nginx_exporter.yml -e "ansible_user=$USER ansible_ssh_pass='$PASS' variable_host=$HOST PROXY=$PROXY STAT_PAGE=$STAT_PAGE STAT_PORT=$STAT_PORT STATS_USER=$STATS_USER STATS_PASS=$STATS_PASS SSH_PORT=$SSH_PORT nginx_exporter_version=$VER" -i $PWD/$HOST else - ansible-playbook $PWD/roles/nginx_exporter.yml --key-file $KEY -e "ansible_user=$USER variable_host=$HOST PROXY=$PROXY STAT_PAGE=$STAT_PAGE STAT_PORT=$STAT_PORT STATS_USER=$STATS_USER STATS_PASS=$STATS_PASS SSH_PORT=$SSH_PORT" -i $PWD/$HOST + ansible-playbook $PWD/roles/nginx_exporter.yml --key-file $KEY -e "ansible_user=$USER variable_host=$HOST PROXY=$PROXY STAT_PAGE=$STAT_PAGE STAT_PORT=$STAT_PORT STATS_USER=$STATS_USER STATS_PASS=$STATS_PASS SSH_PORT=$SSH_PORT nginx_exporter_version=$VER" -i $PWD/$HOST fi if [ $? -gt 0 ] @@ -49,9 +56,12 @@ then exit 1 fi -if ! sudo grep -Fxq " - $HOST:9113" /etc/prometheus/prometheus.yml; then - sudo echo " - $HOST:9113" | sudo tee -a /etc/prometheus/prometheus.yml > /dev/null +if [ "$EXP_PROM" == 0 ] +then + if ! sudo grep -Fxq " - $HOST:9113" /etc/prometheus/prometheus.yml; then + sudo echo " - $HOST:9113" | sudo tee -a /etc/prometheus/prometheus.yml > /dev/null + sudo systemctl reload prometheus 2>> /dev/null + fi fi -sudo systemctl reload prometheus rm -f $PWD/$HOST diff --git a/app/scripts/install_node_exporter.sh b/app/scripts/install_node_exporter.sh index 76ffc50f..a392463b 100644 --- a/app/scripts/install_node_exporter.sh +++ b/app/scripts/install_node_exporter.sh @@ -9,20 +9,14 @@ do HOST) HOST=${VALUE} ;; USER) USER=${VALUE} ;; PASS) PASS=${VALUE} ;; - KEY) KEY=${VALUE} ;; + KEY) KEY=${VALUE} ;; + VER) VER=${VALUE} ;; + EXP_PROM) EXP_PROM=${VALUE} ;; SSH_PORT) SSH_PORT=${VALUE} ;; *) esac done -if [ ! -d "/var/www/haproxy-wi/app/scripts/ansible/roles/cloudalchemy.node_exporterr" ]; then - if [ ! -z $PROXY ];then - export https_proxy="$PROXY" - export http_proxy="$PROXY" - fi - ansible-galaxy install cloudalchemy.node_exporter --roles-path /var/www/haproxy-wi/app/scripts/ansible/roles/ -fi - export ANSIBLE_HOST_KEY_CHECKING=False export ANSIBLE_DISPLAY_SKIPPED_HOSTS=False export ACTION_WARNINGS=False @@ -34,9 +28,9 @@ PWD=$PWD/scripts/ansible/ echo "$HOST ansible_port=$SSH_PORT" > $PWD/$HOST if [[ $KEY == "" ]]; then - ansible-playbook $PWD/roles/node_exporter.yml -e "ansible_user=$USER ansible_ssh_pass=$PASS variable_host=$HOST PROXY=$PROXY SSH_PORT=$SSH_PORT" -i $PWD/$HOST + ansible-playbook $PWD/roles/node_exporter.yml -e "ansible_user=$USER ansible_ssh_pass='$PASS' variable_host=$HOST PROXY=$PROXY SSH_PORT=$SSH_PORT node_exporter_version=$VER" -i $PWD/$HOST else - ansible-playbook $PWD/roles/node_exporter.yml --key-file $KEY -e "ansible_user=$USER variable_host=$HOST PROXY=$PROXY SSH_PORT=$SSH_PORT" -i $PWD/$HOST + ansible-playbook $PWD/roles/node_exporter.yml --key-file $KEY -e "ansible_user=$USER variable_host=$HOST PROXY=$PROXY SSH_PORT=$SSH_PORT node_exporter_version=$VER" -i $PWD/$HOST fi if [ $? -gt 0 ] @@ -44,10 +38,12 @@ then echo "error: Can't install Node exporter

" exit 1 fi - -if ! sudo grep -Fxq " - $HOST:9100" /etc/prometheus/prometheus.yml; then - sudo echo " - $HOST:9100" | sudo tee -a /etc/prometheus/prometheus.yml > /dev/null +if [ "$EXP_PROM" == 0 ] +then + if ! sudo grep -Fxq " - $HOST:9100" /etc/prometheus/prometheus.yml; then + sudo echo " - $HOST:9100" | sudo tee -a /etc/prometheus/prometheus.yml > /dev/null + sudo systemctl reload prometheus 2>> /dev/null + fi fi -sudo systemctl reload prometheus rm -f $PWD/$HOST diff --git a/app/templates/include/mon_installation.html b/app/templates/include/mon_installation.html index 8952f77c..cfe40c6f 100644 --- a/app/templates/include/mon_installation.html +++ b/app/templates/include/mon_installation.html @@ -11,7 +11,7 @@ {% if grafana == "active" %} - Grafana and Prometheus servers have already installed + Grafana and Prometheus servers have benn installed {% else %} There are no Grafana and Prometheus servers {% endif %} @@ -35,17 +35,20 @@

Install HAProxy Exporter

Current installation - Available Versions + Available Versions + External Prometheus Server - - - + - Roxy-WI will try to install the latest HAProxy Exporter version + {% set values = dict() %} + {% set values = {'0.7.0':'0.7.0','0.7.1':'0.7.1', '0.8.0':'0.8.0', '0.9.0':'0.9.0', '0.10.0':'0.10.0', + '0.11.0':'0.11.0', '0.12.0':'0.12.0', '0.13.0':'0.13.0'} %} + {{ select('hapexpver', values=values, selected='0.13.0') }} + {{ checkbox('haproxy_ext_prom', title="This exporter will be used by an external Prometheus. Also use this checkbox if you update the Exporter") }} - - Install @@ -65,17 +66,20 @@

Install Nginx Exporter

Current installation - Available Versions + Available Versions + External Prometheus Server - - + - Roxy-WI will try to install the latest Nginx Exporter version + {% set values = dict() %} + {% set values = {'0.5.0':'0.5.0', '0.6.0':'0.6.0', '0.7.0':'0.7.0', '0.9.0':'0.9.0'} %} + {{ select('nginxexpver', values=values, selected='0.9.0') }} + {{ checkbox('nginx_ext_prom', title="This exporter will be used by an external Prometheus. Also use this checkbox if you update the Exporter") }} - - Install @@ -95,17 +97,21 @@

Install Node Exporter

Current installation - Available Versions + Available Versions + External Prometheus Server - - + - Roxy-WI will try to install the latest Node Exporter version + {% set values = dict() %} + {% set values = {'1.0.0':'1.0.0','1.1.0':'1.1.0', '1.1.1':'1.1.1', '1.1.2':'1.1.2', '1.2.0':'1.2.0', + '1.2.2':'1.2.2', '1.3.0':'1.3.0'} %} + {{ select('nodeexpver', values=values, selected='1.3.0') }} + {{ checkbox('node_ext_prom', title="This exporter will be used by an external Prometheus. Also use this checkbox if you update the Exporter") }} - - Install
+
+ Read About Grafana and Prometheus servers + and About Exporters +
\ No newline at end of file diff --git a/app/templates/servers.html b/app/templates/servers.html index 9f61c2f4..9d7619f0 100644 --- a/app/templates/servers.html +++ b/app/templates/servers.html @@ -59,8 +59,8 @@ {% set values = {'2.0.5-1':'2.0.5-1','2.0.6-1':'2.0.6-1', '2.0.7-1':'2.0.7-1', '2.0.9-1':'2.0.9-1', '2.0.11-1':'2.0.11-1', '2.0.12-1':'2.0.12-1', '2.0.13-1':'2.0.13-1', '2.0.14-1':'2.0.14-1', '2.0.17-1':'2.0.17-1','2.0.18-1':'2.0.18-1','2.2.4-1':'2.2.4-1','2.3.0-1':'2.3.0-1','2.3.10-1':'2.3.10-1', - '2.4.0-1':'2.4.0-1'} %} - {{ select('hapver', values=values, selected='2.4.0-1', required='required') }} + '2.4.0-1':'2.4.0-1','2.4.9-1':'2.4.9-1'} %} + {{ select('hapver', values=values, selected='2.4.9-1', required='required') }}