Skip to content

Instantly share code, notes, and snippets.

@afilina
Last active December 4, 2024 22:32
Show Gist options
  • Save afilina/249051bf9e265316e7ee8632c4c45eac to your computer and use it in GitHub Desktop.
Save afilina/249051bf9e265316e7ee8632c4c45eac to your computer and use it in GitHub Desktop.
#!/bin/bash
# Prometheus Exporters install script for RHEL/CentOS based environment
# Always the latest exporter versions will be installed!
DEFAULT_APACHE_PORT=9117
DEFAULT_NGINX_PORT=9113
DEFAULT_PHPFPM_PORT=9001
DEFAULT_SYSTEM_PORT=9100
check_selinux() {
if sestatus | grep -q "enabled"; then
echo "SELinux is enabled, adjusting contexts..."
SELINUX_ENABLED=true
else
SELINUX_ENABLED=false
fi
}
adjust_selinux_context() {
local binary_path=$1
sudo semanage fcontext -a -t bin_t $binary_path
sudo restorecon -v $binary_path
}
install_apache_exporter() {
local port=${1:-$DEFAULT_APACHE_PORT}
if ! command -v wget &> /dev/null; then
echo "wget is required but not installed. Please install wget."
exit 1
fi
latest_version=$(curl -s https://api.github.com/repos/Lusitaniae/apache_exporter/releases/latest | grep -oP '"tag_name": "\K(.*)(?=")')
download_url=$(curl -s https://api.github.com/repos/Lusitaniae/apache_exporter/releases/latest | grep browser_download_url | grep linux-amd64.tar.gz | cut -d '"' -f 4)
wget "$download_url" -O /tmp/apache_exporter.tar.gz
tar xvf /tmp/apache_exporter.tar.gz -C /tmp/
extracted_dir=$(tar -tf /tmp/apache_exporter.tar.gz | head -n 1 | cut -d "/" -f 1)
sudo mv "/tmp/$extracted_dir/apache_exporter" /usr/local/bin/
rm -rf /tmp/apache_exporter.tar.gz "/tmp/$extracted_dir"
sudo chmod 755 /usr/local/bin/apache_exporter
sudo chown apache:apache /usr/local/bin/apache_exporter
if [ "$SELINUX_ENABLED" = true ]; then
adjust_selinux_context /usr/local/bin/apache_exporter
fi
cat <<EOF | sudo tee /etc/systemd/system/apache_exporter.service >/dev/null
[Unit]
Description=Apache Exporter
Wants=network-online.target
After=network-online.target
[Service]
User=apache
Group=apache
Type=simple
ExecStart=/usr/local/bin/apache_exporter --insecure --scrape_uri=http://localhost/server-status/?auto --telemetry.endpoint=/metrics --web.listen-address=:${port}
[Install]
WantedBy=multi-user.target
EOF
sudo systemctl daemon-reload
sudo systemctl enable apache_exporter
sudo systemctl start apache_exporter
echo "Apache exporter has been installed and configured to run as a service on port $port."
}
install_nginx_exporter() {
local port=${1:-$DEFAULT_NGINX_PORT}
sudo yum install -y epel-release
sudo yum install -y snapd
sudo ln -s /var/lib/snapd/snap /snap
sudo snap install nginx-prometheus-exporter
if [ "$SELINUX_ENABLED" = true ]; then
adjust_selinux_context /snap/bin/nginx-prometheus-exporter
fi
cat <<EOF | sudo tee /etc/systemd/system/nginx_exporter.service >/dev/null
[Unit]
Description=Nginx Exporter
Wants=network-online.target
After=network-online.target
[Service]
Type=simple
ExecStart=/snap/bin/nginx-prometheus-exporter --nginx.scrape-uri=http://127.0.0.1:8080/stub_status --web.listen-address=:$port
[Install]
WantedBy=multi-user.target
EOF
sudo systemctl daemon-reload
sudo systemctl enable nginx_exporter
sudo systemctl start nginx_exporter
echo "Nginx exporter has been installed and configured to run as a service on port $port."
}
install_phpfpm_exporter() {
local port=${1:-$DEFAULT_PHPFPM_PORT}
latest_version=$(curl -sI https://github.com/hipages/php-fpm_exporter/releases/latest | grep -i location | awk -F'/' '{print $NF}' | tr -d '\r\n[:space:]')
version_without_v=${latest_version#?}
download_url="https://github.com/hipages/php-fpm_exporter/releases/download/$latest_version/php-fpm_exporter_${version_without_v}_linux_amd64.tar.gz"
temp_dir=$(mktemp -d)
wget "$download_url" -O "$temp_dir/php-fpm_exporter.tar.gz"
tar -xzvf "$temp_dir/php-fpm_exporter.tar.gz" -C "$temp_dir"
sudo mv "$temp_dir/php-fpm_exporter" /usr/local/bin/
chmod a+x /usr/local/bin/php-fpm_exporter
rm -rf "$temp_dir"
if [ "$SELINUX_ENABLED" = true ]; then
adjust_selinux_context /usr/local/bin/php-fpm_exporter
fi
cat <<EOF | sudo tee /etc/systemd/system/php-fpm_exporter.service >/dev/null
[Unit]
Description=PHP-FPM Exporter
Wants=network-online.target
After=network-online.target
[Service]
Type=simple
ExecStart=/usr/local/bin/php-fpm_exporter server --phpfpm.scrape-uri unix:///var/opt/zend/php80zend/run/php-fpm/www.sock;/status --web.listen-address=":$port"
[Install]
WantedBy=multi-user.target
EOF
sudo systemctl daemon-reload
sudo systemctl enable php-fpm_exporter
sudo systemctl start php-fpm_exporter
echo "PHP-FPM exporter has been installed and configured to run as a service on port $port."
}
install_system_exporter() {
local port=${1:-$DEFAULT_SYSTEM_PORT}
echo "Downloading Node Exporter..."
NODE_EXPORTER_VERSION=$(curl -s https://api.github.com/repos/prometheus/node_exporter/releases/latest | grep -oP '"tag_name": "\K(.*)(?=")')
DOWNLOAD_VERSION="${NODE_EXPORTER_VERSION#v}"
DOWNLOAD_URL="https://github.com/prometheus/node_exporter/releases/download/$NODE_EXPORTER_VERSION/node_exporter-$DOWNLOAD_VERSION.linux-amd64.tar.gz"
wget "$DOWNLOAD_URL" -O /tmp/node_exporter.tar.gz
if [ $? -ne 0 ]; then
echo "Failed to download Node Exporter."
exit 1
fi
tar -xzf /tmp/node_exporter.tar.gz -C /tmp/
if [ $? -ne 0 ]; then
echo "Failed to extract Node Exporter archive."
exit 1
fi
sudo mv "/tmp/node_exporter-$DOWNLOAD_VERSION.linux-amd64/node_exporter" /usr/local/bin/
if [ $? -ne 0 ]; then
echo "Failed to move Node Exporter binary to /usr/local/bin/."
exit 1
fi
rm -f /tmp/node_exporter.tar.gz
rm -rf "/tmp/node_exporter-$DOWNLOAD_VERSION.linux-amd64"
if ! id -u node_exporter &>/dev/null; then
sudo useradd -rs /bin/false node_exporter
fi
sudo chown node_exporter:node_exporter /usr/local/bin/node_exporter
sudo chmod 755 /usr/local/bin/node_exporter
if [ "$SELINUX_ENABLED" = true ]; then
adjust_selinux_context /usr/local/bin/node_exporter
fi
cat <<EOF | sudo tee /etc/systemd/system/node_exporter.service >/dev/null
[Unit]
Description=Node Exporter
Wants=network-online.target
After=network-online.target
[Service]
User=node_exporter
Group=node_exporter
Type=simple
ExecStart=/usr/local/bin/node_exporter --web.listen-address=:$port
[Install]
WantedBy=multi-user.target
EOF
sudo systemctl daemon-reload
sudo systemctl enable node_exporter
sudo systemctl start node_exporter
echo "System Exporter installed and started successfully on port $port."
}
remove_apache_exporter() {
sudo systemctl stop apache_exporter
sudo systemctl disable apache_exporter
sudo rm /etc/systemd/system/apache_exporter.service
sudo rm /usr/local/bin/apache_exporter
}
remove_nginx_exporter() {
sudo systemctl stop nginx_exporter
sudo systemctl disable nginx_exporter
sudo rm /etc/systemd/system/nginx_exporter.service
sudo snap remove nginx-prometheus-exporter
}
remove_phpfpm_exporter() {
sudo systemctl stop php-fpm_exporter
sudo systemctl disable php-fpm_exporter
sudo rm /etc/systemd/system/php-fpm_exporter.service
sudo rm /usr/local/bin/php-fpm_exporter
}
remove_system_exporter() {
sudo systemctl stop node_exporter
sudo systemctl disable node_exporter
sudo rm /etc/systemd/system/node_exporter.service
sudo rm /usr/local/bin/node_exporter
}
show_usage() {
echo ""
echo "Script for installing Prometheus exporters automatically"
echo "Usage: $0 [--remove] [exporter1] [--port port1] [exporter2] [--port port2] ..."
echo "Available exporters: apache nginx phpfpm system"
echo "If no --port with port number defined, defaults will be used"
echo "Example exporters install: $0 apache --port 1234 nginx --port 2345 phpfpm system"
echo "Example exporters removal: $0 --remove apache phpfpm system"
echo ""
}
main() {
check_selinux
if [ "$#" -eq 0 ]; then
show_usage
exit 1
fi
if [ "$1" == "--remove" ]; then
shift
while [ $# -gt 0 ]; do
case $1 in
apache)
remove_apache_exporter
;;
nginx)
remove_nginx_exporter
;;
phpfpm)
remove_phpfpm_exporter
;;
system)
remove_system_exporter
;;
*)
echo "Unknown exporter: $1"
show_usage
;;
esac
shift
done
else
while [ $# -gt 0 ]; do
case $1 in
apache)
if [[ "$2" == "--port" ]]; then
install_apache_exporter "$3"
shift 3
else
install_apache_exporter
shift
fi
;;
nginx)
if [[ "$2" == "--port" ]]; then
install_nginx_exporter "$3"
shift 3
else
install_nginx_exporter
shift
fi
;;
phpfpm)
if [[ "$2" == "--port" ]]; then
install_phpfpm_exporter "$3"
shift 3
else
install_phpfpm_exporter
shift
fi
;;
system)
if [[ "$2" == "--port" ]]; then
install_system_exporter "$3"
shift 3
else
install_system_exporter
shift
fi
;;
--remove)
shift
;;
*)
echo "Unknown parameter or exporter: $1"
show_usage
exit 1
;;
esac
done
fi
}
main "$@"
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment