add playbook for prometheus node exporter

This commit is contained in:
Denis-Cosmin Nutiu 2025-02-20 20:56:59 +02:00
parent dab832a0ef
commit 02e5930822
15 changed files with 330 additions and 0 deletions

164
node-exporter/.gitignore vendored Normal file
View file

@ -0,0 +1,164 @@
# Created by https://www.gitignore.io/api/macos,python,ansible
# Edit at https://www.gitignore.io/?templates=macos,python,ansible
### Ansible ###
*.retry
### macOS ###
# General
.DS_Store
.AppleDouble
.LSOverride
# Icon must end with two \r
Icon
# Thumbnails
._*
# Files that might appear in the root of a volume
.DocumentRevisions-V100
.fseventsd
.Spotlight-V100
.TemporaryItems
.Trashes
.VolumeIcon.icns
.com.apple.timemachine.donotpresent
# Directories potentially created on remote AFP share
.AppleDB
.AppleDesktop
Network Trash Folder
Temporary Items
.apdisk
### Python ###
# Byte-compiled / optimized / DLL files
__pycache__/
*.py[cod]
*$py.class
# C extensions
*.so
# Distribution / packaging
.Python
build/
develop-eggs/
dist/
downloads/
eggs/
.eggs/
lib/
lib64/
parts/
sdist/
var/
wheels/
pip-wheel-metadata/
share/python-wheels/
*.egg-info/
.installed.cfg
*.egg
MANIFEST
# PyInstaller
# Usually these files are written by a python script from a template
# before PyInstaller builds the exe, so as to inject date/other infos into it.
*.manifest
*.spec
# Installer logs
pip-log.txt
pip-delete-this-directory.txt
# Unit test / coverage reports
htmlcov/
.tox/
.nox/
.coverage
.coverage.*
.cache
nosetests.xml
coverage.xml
*.cover
.hypothesis/
.pytest_cache/
# Translations
*.mo
*.pot
# Django stuff:
*.log
local_settings.py
db.sqlite3
# Flask stuff:
instance/
.webassets-cache
# Scrapy stuff:
.scrapy
# Sphinx documentation
docs/_build/
# PyBuilder
target/
# Jupyter Notebook
.ipynb_checkpoints
# IPython
profile_default/
ipython_config.py
# pyenv
.python-version
# pipenv
# According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control.
# However, in case of collaboration, if having platform-specific dependencies or dependencies
# having no cross-platform support, pipenv may install dependencies that dont work, or not
# install all needed dependencies.
#Pipfile.lock
# celery beat schedule file
celerybeat-schedule
# SageMath parsed files
*.sage.py
# Environments
.env
.venv
env/
venv/
ENV/
env.bak/
venv.bak/
# Spyder project settings
.spyderproject
.spyproject
# Rope project settings
.ropeproject
# mkdocs documentation
/site
# mypy
.mypy_cache/
.dmypy.json
dmypy.json
# Pyre type checker
.pyre/
# Downloaded files
root@*
# End of https://www.gitignore.io/api/macos,python,ansible

8
node-exporter/.idea/.gitignore generated vendored Normal file
View file

@ -0,0 +1,8 @@
# Default ignored files
/shelf/
/workspace.xml
# Editor-based HTTP Client requests
/httpRequests/
# Datasource local storage ignored files
/dataSources/
/dataSources.local.xml

View file

@ -0,0 +1,6 @@
<component name="InspectionProjectProfileManager">
<settings>
<option name="USE_PROJECT_PROFILE" value="false" />
<version value="1.0" />
</settings>
</component>

7
node-exporter/.idea/misc.xml generated Normal file
View file

@ -0,0 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="Black">
<option name="sdkName" value="Python 3.13 (node-exporter)" />
</component>
<component name="ProjectRootManager" version="2" project-jdk-name="Python 3.13 (node-exporter)" project-jdk-type="Python SDK" />
</project>

8
node-exporter/.idea/modules.xml generated Normal file
View file

@ -0,0 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ProjectModuleManager">
<modules>
<module fileurl="file://$PROJECT_DIR$/.idea/node-exporter.iml" filepath="$PROJECT_DIR$/.idea/node-exporter.iml" />
</modules>
</component>
</project>

17
node-exporter/.idea/node-exporter.iml generated Normal file
View file

@ -0,0 +1,17 @@
<?xml version="1.0" encoding="UTF-8"?>
<module type="PYTHON_MODULE" version="4">
<component name="NewModuleRootManager">
<content url="file://$MODULE_DIR$">
<excludeFolder url="file://$MODULE_DIR$/.venv" />
</content>
<orderEntry type="jdk" jdkName="Python 3.13 (node-exporter)" jdkType="Python SDK" />
<orderEntry type="sourceFolder" forTests="false" />
</component>
<component name="TemplatesService">
<option name="TEMPLATE_FOLDERS">
<list>
<option value="$MODULE_DIR$/templates" />
</list>
</option>
</component>
</module>

6
node-exporter/.idea/vcs.xml generated Normal file
View file

@ -0,0 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="VcsDirectoryMappings">
<mapping directory="$PROJECT_DIR$/.." vcs="Git" />
</component>
</project>

9
node-exporter/Makefile Normal file
View file

@ -0,0 +1,9 @@
install:
sudo dnf install ansible
ansible-galaxy collection install community.general
ansible-galaxy collection install containers.podman
ansible-galaxy collection install ansible.posix
list-hosts:
ansible-inventory -i inventory.ini --list
run:
ansible-playbook -i inventory.ini playbook.yaml --ask-become-pass

BIN
node-exporter/img.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 231 KiB

View file

@ -0,0 +1,5 @@
[nuculabs]
my-server ansible_user=ansible
[local]
localhost

View file

@ -0,0 +1,55 @@
- name: Install Prometheus Node Exporter
hosts: nuculabs
become: true
become_method: sudo
vars_files:
- variables.yaml
tasks:
- name: Setup Container
block:
- name: Ensure Podman is installed
ansible.builtin.package:
name: podman
state: present
- name: Pull image
containers.podman.podman_image:
name: "{{ node_exporter.container_image }}"
state: present
- name: "Copy container"
ansible.builtin.template:
src: ./templates/container/node_exporter.container.j2
dest: /etc/containers/systemd/node_exporter.container
mode: "0644"
- name: Reload systemd
ansible.builtin.command:
cmd: systemctl daemon-reload
- name: Stop service
ansible.builtin.systemd_service:
name: node_exporter.service
state: stopped
enabled: true
- name: Enable service
ansible.builtin.systemd_service:
name: node_exporter.service
state: started
enabled: true
- name: Setup firewall
block:
- name: Create firewalld service
ansible.builtin.template:
src: ./templates/firewall/node_exporter.xml.j2
dest: /etc/firewalld/services/node_exporter.xml
mode: "0644"
- name: Reload firewalld
ansible.builtin.command:
argv:
- firewall-cmd
- --reload
- name: Enable firewalld service
ansible.posix.firewalld:
service: node_exporter
state: enabled
permanent: true
immediate: true
offline: true
when: setup_firewall

16
node-exporter/readme.md Normal file
View file

@ -0,0 +1,16 @@
# Node Exporter
![grafana dashboard](./img.png)
This playbook allows you to install and run the prometheus node exporter in Podman.
Using the node exporter allows export metrics from your server, have a Prometheus server scrape them and
create beautiful dashboard in Grafana.
It was tested on Fedora 41 & Fedora Server.
References:
- https://grafana.com/grafana/dashboards/1860-node-exporter-full/
- https://hub.docker.com/r/bitnami/prometheus
-

View file

@ -0,0 +1,20 @@
[Unit]
Description=node_exporter
[Container]
Image={{ node_exporter.container_image }}
AutoUpdate=registry
Network=host
AddCapability=SYS_TIME
Volume=/proc:/host/proc:ro
Volume=/sys:/host/sys:ro
Volume=/:/rootfs:ro,rslave
Exec=--path.procfs="/host/proc" --path.sysfs="/host/sys" --collector.filesystem.ignored-mount-points="^/(sys|proc|dev|host|etc)($|/)" --web.listen-address="0.0.0.0:{{ node_exporter.port }}"
[Service]
# Inform systemd of additional exit status
SuccessExitStatus=0 143
[Install]
# Start by default on boot
WantedBy=default.target

View file

@ -0,0 +1,5 @@
<service>
<short>Prometheus Node Exporter</short>
<description>The prometheus metrics node exporter.</description>
<port protocol="tcp" port="{{ node_exporter.port }}" />
</service>

View file

@ -0,0 +1,4 @@
setup_firewall: true
node_exporter:
container_image: "docker.io/bitnami/node-exporter:latest"
port: 9100