Changelog: https://roxy-wi.org/changelog#6_3_4
pull/355/head
Pavel Loginov 2023-01-18 10:37:23 +03:00
parent 5b1230e96f
commit 7e3dd0c56c
18 changed files with 500 additions and 7 deletions

View File

@ -976,7 +976,7 @@ def update_db_v_6_3_4():
for i in sql:
try:
cursor.execute(i)
except Exception as e:
except Exception:
pass
else:
print('Updating... DB has been updated to version 6.3.4.0')

View File

@ -22,7 +22,7 @@ def backup(serv, rpath, time, backup_type, rserver, cred, deljob, update, descri
deljob = ''
if sql.check_exists_backup(serv):
print(f'warning: Backup job for {serv} already exists')
sys.exit()
return None
os.system(f"cp scripts/{script} .")

View File

@ -57,6 +57,8 @@ def get_exp_version(server_ip: str, service_name: str) -> str:
commands = ["node_exporter --version 2>&1 |head -1|awk '{print $3}'"]
elif service_name == 'apache_exporter':
commands = ["/opt/prometheus/exporters/apache_exporter --version 2>&1 |head -1|awk '{print $3}'"]
elif service_name == 'keepalived_exporter':
commands = ["systemctl list-units --full -all |grep keepalived_exporter"]
ver = server_mod.ssh_command(server_ip, commands)

View File

@ -78,11 +78,11 @@ def nginx_apache_exp_installation():
os.remove(script)
def node_exp_installation():
serv = common.is_ip_or_dns(form.getvalue('node_exp_install'))
def node_keepalived_exp_installation(service: str) -> None:
serv = common.is_ip_or_dns(form.getvalue(f'{service}_exp_install'))
ver = common.checkAjaxInput(form.getvalue('exporter_v'))
ext_prom = common.checkAjaxInput(form.getvalue('ext_prom'))
script = "install_node_exporter.sh"
script = f"install_{service}_exporter.sh"
proxy = sql.get_setting('proxy')
proxy_serv = ''
ssh_settings = return_ssh_keys_path(serv)
@ -93,7 +93,7 @@ def node_exp_installation():
proxy_serv = proxy
commands = [
f"chmod +x {script} && ./{script} PROXY={proxy_serv} SSH_PORT={ssh_settings['port']} VER={ver} EXP_PROM={ext_prom} "
f"chmod +x {script} && ./{script} PROXY={proxy_serv} SSH_PORT={ssh_settings['port']} VER={ver} EXP_PROM={ext_prom} "
f"HOST={serv} USER={ssh_settings['user']} PASS='{ssh_settings['password']}' KEY={ssh_settings['key']}"
]

View File

@ -419,7 +419,14 @@ if form.getvalue('nginx_exp_install') or form.getvalue('apache_exp_install'):
if form.getvalue('node_exp_install'):
import modules.service.exporter_installation as exp_installation
exp_installation.node_exp_installation()
service = 'node'
exp_installation.node_keepalived_exp_installation(service)
if form.getvalue('keepalived_exp_install'):
import modules.service.exporter_installation as exp_installation
service = 'keepalived'
exp_installation.node_keepalived_exp_installation(service)
if form.getvalue('backup') or form.getvalue('deljob') or form.getvalue('backupupdate'):
import modules.service.backup as backup_mod

View File

@ -0,0 +1,21 @@
- hosts: "{{ variable_host }}"
become: yes
become_method: sudo
tasks:
- name: Set SSH port
set_fact:
ansible_port: "{{SSH_PORT}}"
- name: Open stat port for iptables
iptables:
chain: INPUT
destination_port: "9650"
jump: ACCEPT
protocol: tcp
ignore_errors: yes
roles:
- role: keepalived_exporter
environment:
http_proxy: "{{PROXY}}"
https_proxy: "{{PROXY}}"

View File

@ -0,0 +1,12 @@
---
keepalived_exporter_version: 0.3.0
keepalived_exporter_binary_local_dir: ""
keepalived_exporter_web_listen_address: "0.0.0.0:9650"
keepalived_exporter_enabled_collectors: []
keepalived_exporter_disabled_collectors: []
keepalived_exporter_binary_install_dir: "/usr/local/bin"
keepalived_exporter_system_group: "keepalived-exp"
keepalived_exporter_system_user: "{{ keepalived_exporter_system_group }}"
keepalived_exporter_create_usergroup: true

View File

@ -0,0 +1,7 @@
---
- name: restart keepalived_exporter
become: true
systemd:
daemon_reload: true
name: keepalived_exporter
state: restarted

View File

@ -0,0 +1,19 @@
---
- name: Copy the Keepalived Exporter systemd service file
template:
src: keepalived_exporter.service.j2
dest: /etc/systemd/system/keepalived_exporter.service
owner: root
group: root
mode: 0644
notify: restart keepalived_exporter
- name: Allow Keepalived Exporter port in SELinux on RedHat OS family
seport:
ports: "{{ keepalived_exporter_web_listen_address.split(':')[-1] }}"
proto: tcp
setype: http_port_t
state: present
when:
- ansible_version.full is version_compare('2.4', '>=')
- ansible_selinux.status == "enabled"

View File

@ -0,0 +1,69 @@
---
- name: Create the keepalived_exporter group
group:
name: "{{ keepalived_exporter_system_group }}"
state: present
system: true
when:
- keepalived_exporter_system_group != "root"
- keepalived_exporter_create_usergroup
- name: Create the keepalived_exporter user
user:
name: "{{ keepalived_exporter_system_user }}"
groups: "{{ keepalived_exporter_system_group }}"
append: true
shell: /usr/sbin/nologin
system: true
create_home: false
home: /
when:
- keepalived_exporter_system_user != "root"
- keepalived_exporter_create_usergroup
- name: Download keepalived_exporter from localhost
block:
- name: Download keepalived_exporter binary to local folder
become: false
get_url:
url: "https://github.com/gen2brain/keepalived_exporter/releases/download/{{ keepalived_exporter_version }}/keepalived_exporter-{{ keepalived_exporter_version }}-{{ go_arch }}.tar.gz"
dest: "/tmp/keepalived_exporter-{{ keepalived_exporter_version }}-{{ go_arch }}.tar.gz"
#checksum: "sha256:{{ keepalived_exporter_checksum }}"
register: _download_binary
until: _download_binary is succeeded
retries: 5
delay: 2
delegate_to: localhost
check_mode: false
- name: Unpack keepalived_exporter binary
become: false
unarchive:
src: "/tmp/keepalived_exporter-{{ keepalived_exporter_version }}-{{ go_arch }}.tar.gz"
dest: "/tmp"
creates: "/tmp/keepalived_exporter-{{ keepalived_exporter_version }}-{{ go_arch }}/keepalived_exporter"
remote_src: true
delegate_to: localhost
check_mode: false
- name: Propagate keepalived_exporter binaries
copy:
src: "/tmp/keepalived_exporter-{{ keepalived_exporter_version }}-{{ go_arch }}/keepalived_exporter"
dest: "{{ keepalived_exporter_binary_install_dir }}/keepalived_exporter"
mode: 0755
owner: root
group: root
remote_src: true
notify: restart keepalived_exporter
when: not ansible_check_mode
when: keepalived_exporter_binary_local_dir | length == 0
- name: propagate locally distributed keepalived_exporter binary
copy:
src: "{{ keepalived_exporter_binary_local_dir }}/keepalived_exporter"
dest: "{{ keepalived_exporter_binary_install_dir }}/keepalived_exporter"
mode: 0755
owner: root
group: root
when: keepalived_exporter_binary_local_dir | length > 0
notify: restart keepalived_exporter

View File

@ -0,0 +1,33 @@
---
- import_tasks: preflight.yml
tags:
- keepalived_exporter_install
- keepalived_exporter_configure
- keepalived_exporter_run
- import_tasks: install.yml
become: true
when: (not __keepalived_exporter_is_installed.stat.exists) or (__keepalived_exporter_current_version_output.stderr_lines[0].split(" ")[2] != keepalived_exporter_version)
tags:
- keepalived_exporter_install
- import_tasks: selinux.yml
become: true
when: ansible_selinux.status == "enabled"
tags:
- keepalived_exporter_configure
- import_tasks: configure.yml
become: true
tags:
- keepalived_exporter_configure
- name: Ensure Keepalived Exporter is enabled on boot
become: true
systemd:
daemon_reload: true
name: keepalived_exporter
enabled: true
state: started
tags:
- keepalived_exporter_run

View File

@ -0,0 +1,88 @@
---
- 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:
keepalived_exporter_systemd_version: "{{ __systemd_version.stdout_lines[0] | regex_replace('^systemd\\s(\\d+).*$', '\\1') }}"
- name: Naive assertion of proper listen address
assert:
that:
- "':' in keepalived_exporter_web_listen_address"
- name: Assert collectors are not both disabled and enabled at the same time
assert:
that:
- "item not in keepalived_exporter_enabled_collectors"
with_items: "{{ keepalived_exporter_disabled_collectors }}"
- name: Check if keepalived_exporter is installed
stat:
path: "{{ keepalived_exporter_binary_install_dir }}/keepalived_exporter"
register: __keepalived_exporter_is_installed
check_mode: false
tags:
- keepalived_exporter_install
- name: Gather currently installed keepalived_exporter version (if any)
command: "{{ keepalived_exporter_binary_install_dir }}/keepalived_exporter --version"
args:
warn: false
changed_when: false
register: __keepalived_exporter_current_version_output
check_mode: false
when: __keepalived_exporter_is_installed.stat.exists
tags:
- keepalived_exporter_install
- skip_ansible_lint
- name: Get latest release version
block:
- name: Get latest release
uri:
url: "https://api.github.com/repos/gen2brain/keepalived_exporter/releases/latest"
method: GET
return_content: true
status_code: 200
body_format: json
validate_certs: false
user: "{{ lookup('env', 'GH_USER') | default(omit) }}"
password: "{{ lookup('env', 'GH_TOKEN') | default(omit) }}"
no_log: "{{ not lookup('env', 'MOLECULE_DEBUG') | bool }}"
register: _latest_release
until: _latest_release.status == 200
retries: 5
- name: "Set keepalived_exporter version to {{ _latest_release.json.tag_name[1:] }}"
set_fact:
keepalived_exporter_version: "{{ _latest_release.json.tag_name[1:] }}"
when:
- keepalived_exporter_version == "latest"
- keepalived_exporter_binary_local_dir | length == 0
delegate_to: localhost
run_once: true
#- name: Get checksum list from github according to version
# block:
# - name: Get checksum list from github
# set_fact:
# _checksums: "{{ lookup('url', 'https://github.com/gen2brain/keepalived_exporter/releases/download/v' + keepalived_exporter_version + '/keepalived_exporter_0.3.0_checksums.txt', wantlist=True) | list }}"
# run_once: true
#
# - name: "Get checksum for {{ go_arch }} architecture"
# set_fact:
# keepalived_exporter_checksum: "{{ item.split(' ')[0] }}"
# with_items: "{{ _checksums }}"
# when:
# - "('linux-' + go_arch + '.tar.gz') in item"
# when: keepalived_exporter_binary_local_dir | length == 0

View File

@ -0,0 +1,38 @@
---
- 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('libselinux-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('libselinux-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"

View File

@ -0,0 +1,51 @@
{{ ansible_managed | comment }}
[Unit]
Description=Prometheus Keepalived Exporter
After=network-online.target
#StartLimitInterval=0
[Service]
Type=simple
#User={{ keepalived_exporter_system_user }}
#Group={{ keepalived_exporter_system_group }}
ExecStart={{ keepalived_exporter_binary_install_dir }}/keepalived_exporter \
{% for collector in keepalived_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 }} \
{% endfor -%}
{% endif -%}
{% endfor -%}
{% for collector in keepalived_exporter_disabled_collectors %}
--no-collector.{{ collector }} \
{% endfor %}
--web.listen-address={{ keepalived_exporter_web_listen_address }}
SyslogIdentifier=keepalived_exporter
Restart=always
RestartSec=1
#PrivateTmp=yes
{% for m in ansible_mounts if m.mount == '/home' %}
#ProtectHome=read-only
{% else %}
#ProtectHome=yes
{% endfor %}
#NoNewPrivileges=yes
{% if keepalived_exporter_systemd_version | int >= 232 %}
ProtectSystem=strict
ProtectControlGroups=true
ProtectKernelModules=true
ProtectKernelTunables=yes
{% else %}
ProtectSystem=full
{% endif %}
[Install]
WantedBy=multi-user.target

View File

@ -0,0 +1,5 @@
---
go_arch_map:
x86_64: "amd64"
go_arch: "{{ go_arch_map[ansible_architecture] | default(ansible_architecture) }}"

View File

@ -0,0 +1,49 @@
#!/bin/bash
for ARGUMENT in "$@"
do
KEY=$(echo $ARGUMENT | cut -f1 -d=)
VALUE=$(echo $ARGUMENT | cut -f2 -d=)
case "$KEY" in
PROXY) PROXY=${VALUE} ;;
HOST) HOST=${VALUE} ;;
USER) USER=${VALUE} ;;
PASS) PASS=${VALUE} ;;
KEY) KEY=${VALUE} ;;
VER) VER=${VALUE} ;;
EXP_PROM) EXP_PROM=${VALUE} ;;
SSH_PORT) SSH_PORT=${VALUE} ;;
*)
esac
done
export ANSIBLE_HOST_KEY_CHECKING=False
export ANSIBLE_DISPLAY_SKIPPED_HOSTS=False
export ACTION_WARNINGS=False
export LOCALHOST_WARNING=False
export COMMAND_WARNINGS=False
PWD=`pwd`
PWD=$PWD/scripts/ansible/
echo "$HOST ansible_port=$SSH_PORT" > $PWD/$HOST
if [[ $KEY == "" ]]; then
ansible-playbook $PWD/roles/keepalived_exporter.yml -e "ansible_user=$USER ansible_ssh_pass='$PASS' variable_host=$HOST PROXY=$PROXY SSH_PORT=$SSH_PORT keepalived_exporter_version=$VER" -i $PWD/$HOST
else
ansible-playbook $PWD/roles/keepalived_exporter.yml --key-file $KEY -e "ansible_user=$USER variable_host=$HOST PROXY=$PROXY SSH_PORT=$SSH_PORT keepalived_exporter_version=$VER" -i $PWD/$HOST
fi
if [ $? -gt 0 ]
then
echo "error: Can't install Keepalived exporter <br /><br />"
exit 1
fi
if [ "$EXP_PROM" == 0 ]
then
if ! sudo grep -Fxq " - $HOST:9650" /etc/prometheus/prometheus.yml; then
sudo echo " - $HOST:9650" | sudo tee -a /etc/prometheus/prometheus.yml > /dev/null
sudo systemctl reload prometheus 2>> /dev/null
fi
fi
rm -f $PWD/$HOST

View File

@ -133,6 +133,37 @@
</td>
</tr>
</table>
<table id="keepalived-table">
<caption><h3>Install Keepalived Exporter</h3></caption>
<tr class="overviewHead">
<td class="padding10 first-collumn" style="width: 20%;">Current installation</td>
<td class="padding10 first-collumn" style="width: 30%;">Available Versions</td>
<td class="padding10 first-collumn" style="width: 30%;">Server</td>
<td class="help_cursor" style="width: 20%;" title="This exporter will be used by an external Prometheus. Also use this checkbox if you update the Exporter">External Prometheus</td>
<td></td>
<td></td>
</tr>
<tr>
<td id="cur_keepalived_exp_ver" class="padding10 first-collumn"></td>
<td class="padding10 first-collumn" style="width: 20%;">
{% set values = dict() %}
{% set values = {'0.1.0':'0.1.0', '0.2.0':'0.2.0', '0.3.0':'0.3.0', '0.4.0':'0.4.0', '0.5.0':'0.5.0'} %}
{{ select('keepalivedexpver', values=values, selected='0.5.0') }}
</td>
<td class="padding10 first-collumn">
<select autofocus required name="keepalived_exp_addserv" id="keepalived_exp_addserv">
<option disabled selected>------</option>
{% for select in servers %}
<option value="{{ select.2 }}">{{ select.1 }}</option>
{% endfor %}
</select>
</td>
<td style="padding-left: 50px;">{{ checkbox('keepalived_ext_prom', title="This exporter will be used by an external Prometheus. Also use this checkbox if you update the Exporter") }}</td>
<td>
<span class="ui-button ui-widget ui-corner-all" id="keepalived_exp_install" title="Install Keepalived Exporter">Install</span>
</td>
</tr>
</table>
<table style="margin-top: 20px" id="node-table">
<caption><h3>Install Node Exporter</h3></caption>
<tr class="overviewHead">

View File

@ -196,6 +196,43 @@ $( function() {
}
} );
});
$('#keepalived_exp_install').click(function() {
$("#ajaxmon").html('')
$("#ajaxmon").html(wait_mess);
var ext_prom = 0;
if ($('#keepalived_ext_prom').is(':checked')) {
ext_prom = '1';
}
$.ajax( {
url: "options.py",
data: {
keepalived_exp_install: $('#keepalived_exp_addserv').val(),
exporter_v: $('#keepalivedexpver').val(),
ext_prom: ext_prom,
token: $('#token').val()
},
type: "POST",
success: function( data ) {
data = data.replace(/\s+/g,' ');
$("#ajaxmon").html('');
if (data.indexOf('error:') != '-1' || data.indexOf('FAILED') != '-1' || data.indexOf('UNREACHABLE') != '-1') {
var p_err = show_pretty_ansible_error(data);
toastr.error(p_err);
} else if (data.indexOf('success') != '-1' ){
toastr.clear();
toastr.success(data);
$('#cur_keepalived_exp_ver').text('Keepalived exporter is installed');
$("#keepalived_exp_addserv").trigger( "selectmenuchange" );
} else if (data.indexOf('Info') != '-1' ){
toastr.clear();
toastr.info(data);
} else {
toastr.clear();
toastr.info(data);
}
}
} );
});
$('#node_exp_install').click(function() {
$("#ajaxmon").html('')
$("#ajaxmon").html(wait_mess);
@ -308,6 +345,30 @@ $( function() {
}
} );
});
$( "#keepalived_exp_addserv" ).on('selectmenuchange',function() {
$.ajax( {
url: "options.py",
data: {
get_exporter_v: 'keepalived_exporter',
serv: $('#keepalived_exp_addserv option:selected').val(),
token: $('#token').val()
},
type: "POST",
success: function( data ) {
data = data.replace(/^\s+|\s+$/g,'');
if (data.indexOf('error:') != '-1') {
toastr.clear();
toastr.error(data);
} else if (data.indexOf('keepalived_exporter.service') != '-1') {
$('#cur_keepalived_exp_ver').text('Keepalived exporter has been installed');
} else if(data == 'no' || data == '' || data.indexOf('No') != '-1') {
$('#cur_keepalived_exp_ver').text('Keepalived exporter has not been installed');
} else {
$('#cur_keepalived_exp_ver').text(data);
}
}
} );
});
$( "#node_exp_addserv" ).on('selectmenuchange',function() {
$.ajax( {
url: "options.py",