From dd24220532a3a06d59385f6bd5829a46f5aef02d Mon Sep 17 00:00:00 2001 From: Sergey Malyuk Date: Tue, 16 Dec 2025 13:42:21 +0300 Subject: [PATCH] add karma role and fix lint errors --- roles/karma/.ansible-lint | 16 ++++++ roles/karma/.gitignore | 2 + roles/karma/.yamllint | 8 +++ roles/karma/README.md | 53 ++++++++++++++++++ roles/karma/conda.dev.yml | 11 ++++ roles/karma/conda.prod.yml | 9 ++++ roles/karma/defaults/main.yml | 7 +++ roles/karma/handlers/main.yml | 7 +++ roles/karma/meta/main.yml | 17 ++++++ roles/karma/molecule/default/converge.yml | 9 ++++ roles/karma/molecule/default/karma.conf | 17 ++++++ roles/karma/molecule/default/molecule.yml | 27 ++++++++++ roles/karma/molecule/default/verify.yml | 35 ++++++++++++ roles/karma/renovate.json | 6 +++ roles/karma/requirements.ci.txt | 6 +++ roles/karma/requirements.txt | 1 + roles/karma/requirements.yml | 3 ++ roles/karma/tasks/configuration.yml | 10 ++++ roles/karma/tasks/install.yml | 66 +++++++++++++++++++++++ roles/karma/tasks/main.yml | 9 ++++ roles/karma/templates/karma.service.j2 | 26 +++++++++ roles/karma/vars/main.yml | 1 + 22 files changed, 346 insertions(+) create mode 100644 roles/karma/.ansible-lint create mode 100644 roles/karma/.gitignore create mode 100644 roles/karma/.yamllint create mode 100644 roles/karma/README.md create mode 100644 roles/karma/conda.dev.yml create mode 100644 roles/karma/conda.prod.yml create mode 100644 roles/karma/defaults/main.yml create mode 100644 roles/karma/handlers/main.yml create mode 100644 roles/karma/meta/main.yml create mode 100644 roles/karma/molecule/default/converge.yml create mode 100644 roles/karma/molecule/default/karma.conf create mode 100644 roles/karma/molecule/default/molecule.yml create mode 100644 roles/karma/molecule/default/verify.yml create mode 100644 roles/karma/renovate.json create mode 100644 roles/karma/requirements.ci.txt create mode 100644 roles/karma/requirements.txt create mode 100644 roles/karma/requirements.yml create mode 100644 roles/karma/tasks/configuration.yml create mode 100644 roles/karma/tasks/install.yml create mode 100644 roles/karma/tasks/main.yml create mode 100644 roles/karma/templates/karma.service.j2 create mode 100644 roles/karma/vars/main.yml diff --git a/roles/karma/.ansible-lint b/roles/karma/.ansible-lint new file mode 100644 index 0000000..f865478 --- /dev/null +++ b/roles/karma/.ansible-lint @@ -0,0 +1,16 @@ +--- +profile: production +strict: true + +# Enable checking of loop variable prefixes in roles +loop_var_prefix: "^(__|{role}_)" + +skip_list: + - var-naming[no-role-prefix] + +warn_list: + - role-name[path] + - var-naming[no-role-prefix] + +exclude_paths: + - .github/ diff --git a/roles/karma/.gitignore b/roles/karma/.gitignore new file mode 100644 index 0000000..8cd0df3 --- /dev/null +++ b/roles/karma/.gitignore @@ -0,0 +1,2 @@ +.vscode +.idea \ No newline at end of file diff --git a/roles/karma/.yamllint b/roles/karma/.yamllint new file mode 100644 index 0000000..611db54 --- /dev/null +++ b/roles/karma/.yamllint @@ -0,0 +1,8 @@ +--- +rules: + brackets: + forbid: false + min-spaces-inside: 0 + max-spaces-inside: 2 + min-spaces-inside-empty: -1 + max-spaces-inside-empty: 2 diff --git a/roles/karma/README.md b/roles/karma/README.md new file mode 100644 index 0000000..3282de9 --- /dev/null +++ b/roles/karma/README.md @@ -0,0 +1,53 @@ +genlab.karma +========= +This is the ansible role to install and configure Karma - alert dashboard for Prometheus Alertmanager (https://github.com/prymitive/karma) + +------------ +⚠️ Do not forget to update: + +- `meta/main.yml` +- Conda/Mamba manifests +- this README =) including *the name at the top* and *maintainers*. + +Requirements +------------ + +None + +Role Variables +-------------- +```yaml +karma_version: "0.121" - karma version +karma_user: karma - name of karma system user +karma_group: karma - name of karma system group +karma_dir: /etc/karma - path where to unpack karma +karma_config_dir: /etc/karma/conf - where to copy configuration file +config_source_dir: source - path to source dir with karma config on localhost +``` + +Dependencies +------------ + +None + +Example Playbook +---------------- + +```yaml +roles: + - role: genlab.karma + karma_version: "0.121" + config_source_dir: "karma/" + karma_dir: "/etc/karma" + karma_config_dir: "/etc/karma/config" +``` + +License +------- + +BSD + +Author Information +------------------ + +corvus-migratorius@proton.me diff --git a/roles/karma/conda.dev.yml b/roles/karma/conda.dev.yml new file mode 100644 index 0000000..fb974b7 --- /dev/null +++ b/roles/karma/conda.dev.yml @@ -0,0 +1,11 @@ +--- +name: ansible-role-template +channels: + - conda-forge +dependencies: + - python~=3.12.0 + - pip>=24.2 + - actionlint + - pip: + - -r requirements.txt + - -r requirements.ci.txt diff --git a/roles/karma/conda.prod.yml b/roles/karma/conda.prod.yml new file mode 100644 index 0000000..d6d12d6 --- /dev/null +++ b/roles/karma/conda.prod.yml @@ -0,0 +1,9 @@ +--- +name: ansible-role-template +channels: + - conda-forge +dependencies: + - python~=3.12.0 + - pip>=24.2 + - pip: + - -r requirements.txt diff --git a/roles/karma/defaults/main.yml b/roles/karma/defaults/main.yml new file mode 100644 index 0000000..f6c4844 --- /dev/null +++ b/roles/karma/defaults/main.yml @@ -0,0 +1,7 @@ +--- +# Default variables for Karma role +karma_version: "0.121" +karma_user: karma +karma_group: karma +karma_dir: /etc/karma +karma_config_dir: /etc/karma/conf diff --git a/roles/karma/handlers/main.yml b/roles/karma/handlers/main.yml new file mode 100644 index 0000000..d7748d6 --- /dev/null +++ b/roles/karma/handlers/main.yml @@ -0,0 +1,7 @@ +--- +- name: "(Re)start and enable karma" + ansible.builtin.systemd_service: + name: karma.service + state: restarted + enabled: true + daemon_reload: true diff --git a/roles/karma/meta/main.yml b/roles/karma/meta/main.yml new file mode 100644 index 0000000..87eb400 --- /dev/null +++ b/roles/karma/meta/main.yml @@ -0,0 +1,17 @@ +--- +galaxy_info: + role_name: "karma" + namespace: genlab + author: "Alexander Gorelyshev" + company: "Genlab, LLC" + description: "" + license: "MIT" + min_ansible_version: "2.1" + + platforms: + - name: "Ubuntu" + versions: ["focal", "jammy", "noble"] + + galaxy_tags: [monitoring] + +dependencies: [] diff --git a/roles/karma/molecule/default/converge.yml b/roles/karma/molecule/default/converge.yml new file mode 100644 index 0000000..6f4bd54 --- /dev/null +++ b/roles/karma/molecule/default/converge.yml @@ -0,0 +1,9 @@ +--- +- name: Converge + hosts: all + gather_facts: true + become: true + roles: + - role: genlab.common.karma + karma_version: "0.121" + config_source_dir: molecule/default/ diff --git a/roles/karma/molecule/default/karma.conf b/roles/karma/molecule/default/karma.conf new file mode 100644 index 0000000..8956068 --- /dev/null +++ b/roles/karma/molecule/default/karma.conf @@ -0,0 +1,17 @@ +alertmanager: + interval: 1m + servers: + - name: production + uri: http://localhost:9093 + timeout: 20s + proxy: false + readonly: true +listen: + address: "0.0.0.0" + port: 8080 + prefix: / + tls: + cert: "" + key: "" + cors: + allowedOrigins: [] \ No newline at end of file diff --git a/roles/karma/molecule/default/molecule.yml b/roles/karma/molecule/default/molecule.yml new file mode 100644 index 0000000..d82158e --- /dev/null +++ b/roles/karma/molecule/default/molecule.yml @@ -0,0 +1,27 @@ +--- +dependency: + name: galaxy + +driver: + name: docker + +platforms: + - name: ubuntu + image: geerlingguy/docker-${MOLECULE_DISTRO:-ubuntu2404}-ansible:latest + pre_build_image: true + command: ${MOLECULE_DOCKER_COMMAND:-""} + volumes: + - /sys/fs/cgroup:/sys/fs/cgroup:rw + cgroupns_mode: host + privileged: true + +provisioner: + name: ansible + +verifier: + name: ansible + +lint: | + set -e + yamllint . + ansible-lint . diff --git a/roles/karma/molecule/default/verify.yml b/roles/karma/molecule/default/verify.yml new file mode 100644 index 0000000..d38c99c --- /dev/null +++ b/roles/karma/molecule/default/verify.yml @@ -0,0 +1,35 @@ +--- +- name: Verify + hosts: all + gather_facts: false + any_errors_fatal: true + vars: + karma_version: "0.121" + + tasks: + - name: "Check if Karma is installed" + changed_when: false + ansible.builtin.command: "karma --version" + register: karma_installed_version + + - name: "Check Karma version" + ansible.builtin.assert: + that: "karma_installed_version.stdout is regex('{{ karma_version }}')" + success_msg: "Karma version {{ karma_version }} is installed and working" + fail_msg: "Karma version {{ karma_version }} is not installed or not working correctly" + + # kics-scan ignore-block + - name: "Check if Karma is reachable" + ansible.builtin.uri: + url: "http://localhost:8080/health" + return_content: true + status_code: 200 + method: GET + body_format: json + register: karma_health + + - name: "Assert Karma health status" + ansible.builtin.assert: + that: "karma_health.content.strip() == 'Pong'" + success_msg: "Karma is healthy" + fail_msg: "Karma is not healthy" diff --git a/roles/karma/renovate.json b/roles/karma/renovate.json new file mode 100644 index 0000000..5db72dd --- /dev/null +++ b/roles/karma/renovate.json @@ -0,0 +1,6 @@ +{ + "$schema": "https://docs.renovatebot.com/renovate-schema.json", + "extends": [ + "config:recommended" + ] +} diff --git a/roles/karma/requirements.ci.txt b/roles/karma/requirements.ci.txt new file mode 100644 index 0000000..f99c76a --- /dev/null +++ b/roles/karma/requirements.ci.txt @@ -0,0 +1,6 @@ +ansible-lint +molecule==24.12.0 +molecule-plugins[docker] +docker~=7.1.0 +requests==2.31.0 # pinned to the latest version not breaking Docker SDK +yamllint diff --git a/roles/karma/requirements.txt b/roles/karma/requirements.txt new file mode 100644 index 0000000..92f8677 --- /dev/null +++ b/roles/karma/requirements.txt @@ -0,0 +1 @@ +ansible~=11.3.0 diff --git a/roles/karma/requirements.yml b/roles/karma/requirements.yml new file mode 100644 index 0000000..3d5f1cd --- /dev/null +++ b/roles/karma/requirements.yml @@ -0,0 +1,3 @@ +# requirements file +--- +collections: [] diff --git a/roles/karma/tasks/configuration.yml b/roles/karma/tasks/configuration.yml new file mode 100644 index 0000000..e0a7400 --- /dev/null +++ b/roles/karma/tasks/configuration.yml @@ -0,0 +1,10 @@ +--- + +- name: Create karma configuration file + notify: "(Re)start and enable karma" + ansible.builtin.template: + src: "{{ config_source_dir }}/karma.conf" + dest: "{{ karma_config_dir }}/karma.conf" + owner: "{{ karma_user }}" + group: "{{ karma_group }}" + mode: '0640' diff --git a/roles/karma/tasks/install.yml b/roles/karma/tasks/install.yml new file mode 100644 index 0000000..3cc4e4c --- /dev/null +++ b/roles/karma/tasks/install.yml @@ -0,0 +1,66 @@ +--- + +- name: "Create Karma system group" + ansible.builtin.group: + name: "{{ karma_user }}" + system: true + state: present + +- name: "Create karma system user" + ansible.builtin.user: + name: "{{ karma_user }}" + group: "{{ karma_group }}" + system: true + shell: "/sbin/nologin" + create_home: false + state: present + +- name: "Install karma from binary" + block: + - name: "Check karma version" + changed_when: false + ansible.builtin.command: + cmd: "{{ karma_dir }}/karma-linux-amd64 --version" + register: karma_ver + + - name: "Assert version correctness" + ansible.builtin.assert: + that: "karma_ver.stdout is regex('{{ karma_version }}')" + success_msg: "karma version {{ karma_version }} is installed and working" + fail_msg: "karma version {{ karma_version }} is not installed or not working correctly" + + rescue: + - name: "Create karma directories" + ansible.builtin.file: + path: "{{ item }}" + state: directory + owner: "{{ karma_user }}" + group: "{{ karma_group }}" + mode: "0755" + with_items: + - "{{ karma_dir }}" + - "{{ karma_config_dir }}" + + - name: "Unarchive karma tar file" + notify: "(Re)start and enable karma" + ansible.builtin.unarchive: + src: "https://github.com/prymitive/karma/releases/download/v{{ karma_version }}/karma-linux-amd64.tar.gz" + dest: "{{ karma_dir }}" + remote_src: true + + - name: "Move karma binary" + ansible.builtin.copy: + src: "{{ karma_dir }}/karma-linux-amd64" + dest: "/usr/local/bin/karma" + mode: "0755" + owner: "{{ karma_user }}" + group: "{{ karma_group }}" + remote_src: true + +- name: Create systemd service file + ansible.builtin.template: + src: karma.service.j2 + dest: /etc/systemd/system/karma.service + owner: "{{ karma_user }}" + group: "{{ karma_group }}" + mode: '0644' diff --git a/roles/karma/tasks/main.yml b/roles/karma/tasks/main.yml new file mode 100644 index 0000000..6bd62b2 --- /dev/null +++ b/roles/karma/tasks/main.yml @@ -0,0 +1,9 @@ +--- +- name: "Run installation tasks" + ansible.builtin.include_tasks: install.yml + +- name: "Run configuration tasks" + ansible.builtin.include_tasks: configuration.yml + +- name: "Flush handlers" + ansible.builtin.meta: "flush_handlers" diff --git a/roles/karma/templates/karma.service.j2 b/roles/karma/templates/karma.service.j2 new file mode 100644 index 0000000..312fac8 --- /dev/null +++ b/roles/karma/templates/karma.service.j2 @@ -0,0 +1,26 @@ +[Unit] +Description=Karma - Alertmanager dashboard +After=network.target +Documentation=https://github.com/prymitive/karma + +[Service] +Type=simple +User={{ karma_user }} +Group={{ karma_group }} +ExecStart=karma --config.file={{ karma_config_dir }}/karma.conf +Restart=always +RestartSec=5 +StandardOutput=syslog +StandardError=syslog +SyslogIdentifier=karma +ProtectSystem=strict +NoNewPrivileges=true +PrivateTmp=true +ProtectKernelModules=true +ProtectControlGroups=true +ProtectKernelTunables=true +ProtectClock=yes +RestrictSUIDSGID=true + +[Install] +WantedBy=multi-user.target \ No newline at end of file diff --git a/roles/karma/vars/main.yml b/roles/karma/vars/main.yml new file mode 100644 index 0000000..ed97d53 --- /dev/null +++ b/roles/karma/vars/main.yml @@ -0,0 +1 @@ +---