Optimized portfolio and pkgmgr update procedures

This commit is contained in:
Kevin Veen-Birkenbach 2025-04-10 14:07:50 +02:00
parent 150e15625d
commit 2ca000795d
No known key found for this signature in database
GPG Key ID: 44D8F11FD62F878E
43 changed files with 334 additions and 334 deletions

View File

@ -706,7 +706,7 @@ defaults_applications:
## Presentation
presentation:
matomo_tracking_enabled: "{{matomo_tracking_enabled_default}}" # Enables\Disables Matomo Tracking
css_enabled: "{{css_enabled_default}}" # Enables\Disables Global CSS Style
css_enabled: False # Would mess with the presentation layout
landingpage_iframe_enabled: False # Makes sense to make the documentary allways in iframe available
# Snipe-IT

View File

@ -22,6 +22,3 @@ galaxy_info:
repository: "https://s.veen.world/cymais"
issue_tracker_url: "https://s.veen.world/cymaisissues"
documentation: "https://s.veen.world/cymais"
dependencies:
- package-manager

View File

@ -1,6 +1,8 @@
- name: install directory-validator
command:
cmd: "pkgmgr install directory-validator --clone-mode https"
- name: "{{ role_name }} | pkgmgr install"
include_role:
name: pkgmgr-install
vars:
package_name: directory-validator
when: run_once_backup_directory_validator is not defined
- name: run the backup_directory_validator tasks once

View File

@ -28,4 +28,3 @@ dependencies:
- cleanup-failed-docker-backups
- system-maintenance-lock
- backup-directory-validator
- package-manager

View File

@ -1,6 +1,8 @@
- name: install backup-docker-to-local
command:
cmd: "pkgmgr install backup-docker-to-local --clone-mode https"
- name: "{{ role_name }} | pkgmgr install"
include_role:
name: pkgmgr-install
vars:
package_name: backup-docker-to-local
when: run_once_backup_docker_to_local is not defined
- name: Retrieve backup-docker-to-local path from pkgmgr

View File

@ -23,6 +23,3 @@ galaxy_info:
repository: "https://github.com/kevinveenbirkenbach/docker-volume-cleaner"
issue_tracker_url: "https://github.com/kevinveenbirkenbach/docker-volume-cleaner/issues"
documentation: "https://github.com/kevinveenbirkenbach/docker-volume-cleaner#readme"
dependencies:
- package-manager

View File

@ -1,6 +1,8 @@
- name: install dockreap
command:
cmd: "pkgmgr install dockreap"
- name: "{{ role_name }} | pkgmgr install"
include_role:
name: pkgmgr-install
vars:
package_name: dockreap
when: run_once_cleanup_docker_anonymous_volumes is not defined
- name: run dockreap with --no-confirmation

View File

@ -25,4 +25,3 @@ dependencies:
- systemd-notifier
- system-maintenance-lock
- backup-directory-validator
- package-manager

View File

@ -1,6 +1,8 @@
- name: install cleanup-failed-docker-backups
command:
cmd: "pkgmgr install cleanup-failed-docker-backups --clone-mode https"
- name: "{{ role_name }} | pkgmgr install"
include_role:
name: pkgmgr-install
vars:
package_name: cleanup-failed-docker-backups
when: run_once_cleanup_failed_docker_backups is not defined
- name: Retrieve backup-docker-to-local path from pkgmgr

View File

@ -13,7 +13,7 @@ The purpose of this role is to automate the installation and configuration of Gi
- **Automated Git Installation:** Installs Git using Pacman.
- **Custom Git Configuration:** Invokes the git-configurator tool to merge user-specific configuration options.
- **Idempotent Task Execution:** Uses host-level run-once artifacts to ensure that configuration tasks are executed only once per host.
- **Integration:** Works alongside the package-manager role to streamline overall system setup.
- **Integration:** Works alongside the pkgmgr role to streamline overall system setup.
## Credits

View File

@ -18,5 +18,3 @@ galaxy_info:
- configuration
- pacman
- personal-computer
dependencies:
- package-manager

View File

@ -4,11 +4,11 @@
state: present
become: true
- name: install gitconfig
command:
cmd: "pkgmgr install gitconfig --clone-mode https"
when: run_once_gitconfig is not defined
become: true
- name: "{{ role_name }} | pkgmgr install"
include_role:
name: pkgmgr-install
vars:
package_name: gitconfig
- name: setup git
command: gitconfig --merge-option rebase --name "{{users.client.full_name}}" --email "{{users.client.email}}" --website "{{users.client.website}}" --signing gpg --gpg-key "{{users.client.gpg}}"

View File

@ -17,5 +17,3 @@ galaxy_info:
- gnome
- extensions
- automation
dependencies:
- package-manager

View File

@ -2,10 +2,11 @@
ansible.builtin.shell: gsettings set org.gnome.shell disable-user-extensions false
become: false
- name: install cli-gnome-extension-manager
command:
cmd: "pkgmgr install cli-gnome-extension-manager --clone-mode https"
become: false
- name: "{{ role_name }} | pkgmgr install"
include_role:
name: pkgmgr-install
vars:
package_name: cli-gnome-extension-manager
- name: Execute CLI GNOME Extension manager script
ansible.builtin.shell: cli-gnome-extension-manager "{{ item[0] }}" "{{ item[1] }}" "{{ item[2] }}"

View File

@ -73,6 +73,11 @@ class LookupModule(LookupBase):
meta_data = yaml.safe_load(f)
galaxy_info = meta_data.get("galaxy_info", {})
# If display is set to False ignore it
if not galaxy_info.get("display", True):
continue
description = galaxy_info.get("description", "")
logo = galaxy_info.get("logo", {})
icon_class = logo.get("class", "fa-solid fa-cube")

View File

@ -0,0 +1,38 @@
from __future__ import (absolute_import, division, print_function)
__metaclass__ = type
from ansible.plugins.lookup import LookupBase
from ansible.errors import AnsibleError
class LookupModule(LookupBase):
def run(self, terms, variables=None, **kwargs):
"""
Group the given cards into categorized and uncategorized lists
based on the tags from menu_categories.
"""
if len(terms) < 1:
raise AnsibleError("Missing required argument: cards")
cards = terms[0]
menu_categories = variables.get("menu_categories", {})
categorized = {}
uncategorized = []
for card in cards:
found = False
for category, data in menu_categories.items():
if any(tag in data.get('tags', []) for tag in card.get('tags', [])):
categorized.setdefault(category, []).append(card)
found = True
break
if not found:
uncategorized.append(card)
return [
{
'categorized': categorized,
'uncategorized': uncategorized,
}
]

View File

@ -21,6 +21,22 @@
become: false
register: config_file
- name: Load docker cards
set_fact:
portfolio_cards: "{{ lookup('docker_cards', 'roles') }}"
- name: Group docker cards
set_fact:
portfolio_menu_data: "{{ lookup('docker_cards_grouped', portfolio_cards) }}"
- name: Debug portfolio data
debug:
msg:
cards: "{{ portfolio_cards }}"
menu_data: "{{ portfolio_menu_data }}"
when: enable_debug | bool
- name: Copy host-specific config.yaml if it exists
template:
src: "{{ config_inventory_path }}"

View File

@ -105,7 +105,7 @@ accounts:
- link: navigation.header.contact
cards:
{{ lookup('docker_cards', 'roles') | to_nice_yaml(indent=2) }}
{{ portfolio_cards | to_nice_yaml(indent=2) }}
platform:
titel: {{service_provider.platform.titel}}
@ -166,248 +166,13 @@ navigation:
footer:
children:
- link: accounts
{% if ["discourse","moodle","listmonk","openproject","taiga","snipe_it","matrix","bigbluebutton","mailu", "matomo","phpmyadmin","keycloak", "ldap", "baserow","yourls","nextcloud"] | any_in(group_names) %}
- name: Solution Hub
description: Curated collection of self hosted tools
icon:
class: fa-solid fa-network-wired
children:
{% if ["discourse","moodle","listmonk"] | any_in(group_names) %}
- name: Community
description: Tools to manage the community
icon:
class: fa-solid fa-users
children:
{% if "discourse" in group_names %}
- name: Forum
description: Join the discussion
icon:
class: fa-brands fa-discourse
url: https://{{domains.discourse}}/
iframe: {{ applications | get_landingpage_iframe_enabled('discourse') }}
{% endif %}
{% if "moodle" in group_names %}
- name: Learning Platform
description: Learn with {{ 'our' if service_provider.type == 'legal' else 'my' }} academy
icon:
class: fa-solid fa-graduation-cap
url: https://{{domains.moodle}}/
iframe: {{ applications | get_landingpage_iframe_enabled('moodle') }}
{% endif %}
{% if "listmonk" in group_names %}
- name: Newsletter
description: Subscribe to {{ 'our' if service_provider.type == 'legal' else 'my' }} newsletter
icon:
class: fa-solid fa-envelope-open-text
url: https://{{domains.listmonk}}/subscription/form
iframe: {{ applications | get_landingpage_iframe_enabled('listmonk') }}
{% endif %}
{% endif %}
{% if ["openproject","taiga","snipe_it"] | any_in(group_names) %}
- name: Project Management
description: Project Management Tools
icon:
class: fa-solid fa-chart-line
children:
{% if "openproject" in group_names %}
- name: Open Project
description: Explore {{ 'our' if service_provider.type == 'legal' else 'my' }} projects
icon:
class: fa-solid fa-tasks
url: https://{{domains.openproject}}/
iframe: {{ applications | get_landingpage_iframe_enabled('openproject') }}
{% endif %}
{% if "taiga" in group_names %}
- name: Taiga
description: View {{ 'our' if service_provider.type == 'legal' else 'my' }} Kanban board
icon:
class: bi bi-clipboard2-check-fill
url: https://{{domains.taiga}}/
iframe: {{ applications | get_landingpage_iframe_enabled('taiga') }}
{% endif %}
{% if "snipe_it" in group_names %}
- name: Snipe IT
description: Manage {{ 'our' if service_provider.type == 'legal' else 'my' }} inventory
icon:
class: fas fa-box-open
url: https://{{domains.snipe_it}}/
iframe: {{ applications | get_landingpage_iframe_enabled('snipe_it') }}
{% endif %}
{% endif %}
{% if ["matrix","bigbluebutton","mailu"] | any_in(group_names) %}
- name: Communication
icon:
class: fa-solid fa-comments
children:
{% if "matrix" in group_names %}
- name: Elements
description: Chat with the world
icon:
class: fa-solid fa-comment
url: https://{{domains.matrix_element}}/
iframe: {{ applications | get_landingpage_iframe_enabled('matrix') }}
{% endif %}
{% if "bigbluebutton" in group_names %}
- name: Big Blue Button
description: Join live events
icon:
class: fa-solid fa-video
url: https://{{domains.bigbluebutton}}/
iframe: {{ applications | get_landingpage_iframe_enabled('bigbluebutton') }}
{% endif %}
{% if "mailu" in group_names %}
- name: Mailu
description: Send{{ 'our' if service_provider.type == 'legal' else 'my' }}a mail
icon:
class: fa-solid fa-envelope
url: https://{{domains.mailu}}/
iframe: {{ applications | get_landingpage_iframe_enabled('mailu') }}
{% endif %}
{% endif %}
{% if ["matomo","phpmyadmin","keycloak", "ldap"] | any_in(group_names) %}
- name: Administration
icon:
class: fas fa-building
children:
{% if "matomo" in group_names %}
- name: Matomo
description: Analyze with Matomo
icon:
class: fa-solid fa-chart-simple
url: https://{{domains.matomo}}/
iframe: {{ applications | get_landingpage_iframe_enabled('matomo') }}
{% endif %}
{% if "phpmyadmin" in group_names %}
- name: phpMyAdmin
description: Administrate MySQL and MariaDB databases
icon:
class: fas fa-database
url: https://{{domains.phpmyadmin}}/
iframe: {{ applications | get_landingpage_iframe_enabled('phpmyadmin') }}
{% endif %}
{% if "pgadmin" in group_names %}
- name: pgAdmin
description: Administrate PostgreSQL databases with ease and precision
icon:
class: fas fa-database
url: https://{{domains.pgadmin}}/
iframe: {{ applications | get_landingpage_iframe_enabled('pgadmin') }}
{% endif %}
{% if "keycloak" in group_names %}
- name: Keycloak
description: Manage User via Keycloak
icon:
class: fas fa-user-shield
iframe: {{ applications | get_landingpage_iframe_enabled('keycloak') }}
children:
- name: Administration
description: Access the central admin console
icon:
class: fa-solid fa-shield-halved
url: https://{{domains.keycloak}}/admin
iframe: {{ applications | get_landingpage_iframe_enabled('keycloak') }}
- name: Profile
description: Update your personal admin settings
icon:
class: fa-solid fa-user-gear
url: https://{{ domains.keycloak }}/realms/{{oidc.client.id}}/account
iframe: {{ applications | get_landingpage_iframe_enabled('keycloak') }}
- name: Logout
description: End your admin session securely
icon:
class: fa-solid fa-right-from-bracket
url: https://{{ domains.keycloak }}/realms/{{oidc.client.id}}/protocol/openid-connect/logout
iframe: false
{% endif %}
{% if "ldap" in group_names %}
- name: LDAP
description: Manage LDAP
icon:
class: fas fa-key
url: https://{{domains.ldap}}/
iframe: {{ applications | get_landingpage_iframe_enabled('ldap') }}
{% endif %}
{% endif %}
{% if ["baserow","yourls","nextcloud"] | any_in(group_names) %}
- name: Tools
icon:
class: fas fa-tools
children:
{% if "baserow" in group_names %}
- name: Baserow
description: Organize with Baserow
icon:
class: fa-solid fa-table
url: https://{{domains.baserow}}/
iframe: {{ applications | get_landingpage_iframe_enabled('baserow') }}
{% endif %}
{% if "yourls" in group_names %}
- name: Yourls
description: Create Shortlinks
icon:
class: bi bi-link
url: https://{{domains.yourls}}/admin/
iframe: {{ applications | get_landingpage_iframe_enabled('yourls') }}
{% endif %}
{% if "nextcloud" in group_names %}
- name: Nextcloud
description: Access your cloud storage
icon:
class: fa-solid fa-cloud
url: https://{{domains.nextcloud}}/
iframe: {{ applications | get_landingpage_iframe_enabled('nextcloud') }}
{% endif %}
{% endif %}
{% endif %}
{% include 'footer_menu.yaml.j2' %}
- name: Support Us
description: "Discover all the ways you can support our work."
@ -444,6 +209,17 @@ navigation:
url: https://{{domains.sphinx}}
iframe: {{ applications | get_landingpage_iframe_enabled('sphinx') }}
{% endif %}
{% if "presentation" in group_names %}
- name: Slides
description: Access our comprehensive documentation and support resources to help you get the most out of the software.
icon:
class: fas fa-book
url: https://{{domains.sphinx}}
iframe: {{ applications | get_landingpage_iframe_enabled('sphinx') }}
{% endif %}
- name: Imprint

View File

@ -0,0 +1,52 @@
{# Render all categories #}
{% for category, apps in portfolio_menu_data.categorized %}
- name: {{ category }}
description: {{ category_data.menu_categories[category].description }}
icon:
class: {{ category_data.menu_categories[category].icon }}
children:
{% for app in apps %}
- name: {{ app.title }}
description: {{ app.text }}
icon: {{ app.icon }}
url: {{ app.url }}
iframe: {{ app.iframe }}
{% if app.title == 'Keycloak' %}
children:
- name: Administration
description: Access the central admin console
icon:
class: fa-solid fa-shield-halved
url: https://{{domains.keycloak}}/admin
iframe: {{ applications | get_landingpage_iframe_enabled('keycloak') }}
- name: Profile
description: Update your personal admin settings
icon:
class: fa-solid fa-user-gear
url: https://{{ domains.keycloak }}/realms/{{oidc.client.id}}/account
iframe: {{ applications | get_landingpage_iframe_enabled('keycloak') }}
- name: Logout
description: End your admin session securely
icon:
class: fa-solid fa-right-from-bracket
url: https://{{ domains.keycloak }}/realms/{{oidc.client.id}}/protocol/openid-connect/logout
iframe: false
{% endif %}
{% endfor %}
{% endfor %}
{# Render Uncategorized
{% if portfolio_menu_data.uncategorized %}
- name: Uncategorized
description: Tools without a defined category
icon:
class: fa-solid fa-question
children:
{% for app in portfolio_menu_data.uncategorized %}
- name: {{ app.title }}
description: {{ app.text }}
icon: {{ app.icon }}
url: {{ app.url }}
iframe: {{ app.iframe }}
{% endfor %}
{% endif %} #}

View File

@ -0,0 +1,42 @@
menu_categories:
Community:
description: Tools to manage the community
icon: fa-solid fa-users
tags:
- community
- forum
- learning
- newsletter
Project Management:
description: Project Management Tools
icon: fa-solid fa-chart-line
tags:
- project
- kanban
- management
Communication:
description: Tools for communication
icon: fa-solid fa-comments
tags:
- chat
- communication
- video
- mail
Administration:
description: Administration Tools
icon: fas fa-building
tags:
- administration
- database
- user-management
Tools:
description: Helpful Tools
icon: fas fa-tools
tags:
- tools
- utility
- baserow

View File

@ -26,5 +26,3 @@ galaxy_info:
documentation: "https://s.veen.world/cymais"
logo:
class: "fas fa-chalkboard-teacher"
dependencies:
- package-manager

View File

@ -4,10 +4,12 @@
include_role:
name: docker-compose
- name: install cymais-presentation
command:
cmd: "pkgmgr install cymais-presentation --clone-mode https"
notify: docker compose project build and setup
- name: "{{ role_name }} | pkgmgr install"
include_role:
name: pkgmgr-install
vars:
package_name: cymais-presentation
package_notify: docker compose project build and setup
- name: Get path of cymais-presentation using pkgmgr
command: pkgmgr path cymais-presentation

View File

@ -27,5 +27,3 @@ galaxy_info:
documentation: "https://s.veen.world/cymais"
logo:
class: "fa-solid fa-book"
dependencies:
- package-manager

View File

@ -4,10 +4,12 @@
include_role:
name: docker-compose
- name: install cymais-sphinx
command:
cmd: "pkgmgr install cymais-sphinx --clone-mode https"
notify: docker compose project build and setup
- name: "{{ role_name }} | pkgmgr install"
include_role:
name: pkgmgr-install
vars:
package_name: cymais-sphinx
package_notify: docker compose project build and setup
- name: Get path of cymais-sphinx using pkgmgr
command: pkgmgr path cymais-sphinx

View File

@ -23,5 +23,3 @@ galaxy_info:
repository: https://s.veen.world/cymais
issue_tracker_url: https://s.veen.world/cymaisissues
documentation: https://s.veen.world/cymais
dependencies:
- role: package-manager

View File

@ -1,8 +1,9 @@
---
- name: install setup-hibernate
command:
cmd: "pkgmgr install setup-hibernate --clone-mode https"
become: true
- name: "{{ role_name }} | pkgmgr install"
include_role:
name: pkgmgr-install
vars:
package_name: setup-hibernate
- name: Setup hibernate
command: setup-hibernate --non-interactive

View File

@ -25,4 +25,4 @@ galaxy_info:
documentation: https://s.veen.world/cymais
dependencies:
- persona-administrator
- package-manager
- pkgmgr

View File

@ -0,0 +1,47 @@
# Package Manager Installation 📦
## Description
This Ansible role installs and updates packages using `pkgmgr` on Arch Linux systems. It provides a unified interface for package installation and update management, ensuring consistent deployment across environments.
## Overview
The role abstracts package management operations using `pkgmgr`. It ensures the package manager itself is updated once per run and provides idempotent installation and update routines for specified packages.
## Purpose
The purpose of this role is to automate the installation and update process for CyMaIS-related applications or other managed packages using `pkgmgr`. It simplifies package handling and enforces best practices for package deployment in automated environments.
## Features
- **Automatic pkgmgr Update:** Ensures the package manager is always up-to-date.
- **Idempotent Package Installation:** Only installs packages when necessary.
- **Flexible Notification:** Supports handler notification for post-install actions (e.g., Docker Compose builds).
- **Optional Privilege Escalation:** Controlled via the `pkgmgr_become` variable (default: `true`).
## Role Variables
| Name | Description | Default |
|-----------------|-----------------------------------------------------------------|---------|
| `package_name` | Name of the package to install/update | (required) |
| `package_notify` | Handler to notify on package installation/update | "" |
| `pkgmgr_become` | Execute all tasks with elevated privileges (become: true/false) | true |
## Example Usage
```yaml
- name: Install cymais-presentation
include_role:
name: pkgmgr-install
vars:
package_name: cymais-presentation
package_notify: docker compose project build and setup
```
## Credits 📝
Developed and maintained by **Kevin Veen-Birkenbach**.
Learn more at [www.veen.world](https://www.veen.world)
Part of the [CyMaIS Project](https://github.com/kevinveenbirkenbach/cymais)
License: [CyMaIS NonCommercial License (CNCL)](https://s.veen.world/cncl)

View File

@ -0,0 +1,2 @@
---
pkgmgr_become: true

View File

@ -0,0 +1,25 @@
galaxy_info:
author: "Kevin Veen-Birkenbach"
description: "Installs and updates packages using pkgmgr."
license: "CyMaIS NonCommercial License (CNCL)"
license_url: "https://s.veen.world/cncl"
company: |
Kevin Veen-Birkenbach
Consulting & Coaching Solutions
https://www.veen.world
min_ansible_version: "2.9"
platforms:
- name: Archlinux
versions:
- rolling
galaxy_tags:
- pkgmgr
- package
- update
- archlinux
- cymais
repository: https://s.veen.world/cymais
issue_tracker_url: https://s.veen.world/cymaisissues
documentation: https://s.veen.world/cymais
dependencies:
- pkgmgr

View File

@ -0,0 +1,22 @@
- name: "{{ role_name }} | pkgmgr installation tasks"
become: "{{ pkgmgr_become }}"
block:
- name: update pkgmgr
command:
cmd: "pkgmgr update pkgmgr"
when: run_once_pkgmgr_update is not defined
- name: install {{ package_name }}
command:
cmd: "pkgmgr install {{ package_name }} --clone-mode https"
notify: "{{ package_notify | default(omit) }}"
- name: update {{ package_name }}
command:
cmd: "pkgmgr update {{ package_name }}"
notify: "{{ package_notify | default(omit) }}"
- name: mark pkgmgr update as done
set_fact:
run_once_pkgmgr_update: true
when: run_once_pkgmgr_update is not defined

View File

@ -24,7 +24,7 @@ galaxy_info:
versions:
- rolling
galaxy_tags:
- package-manager
- pkgmgr
- automation
- git
- repositories

View File

@ -22,5 +22,4 @@ galaxy_info:
issue_tracker_url: "https://s.veen.world/cymaisissues"
documentation: "https://s.veen.world/cymais"
dependencies:
- package-manager
- systemd-notifier

View File

@ -1,6 +1,8 @@
- name: install btrfs-auto-balancer
command:
cmd: "pkgmgr install btrfs-auto-balancer --clone-mode https"
- name: "{{ role_name }} | pkgmgr install"
include_role:
name: pkgmgr-install
vars:
package_name: btrfs-auto-balancer
when: run_once_system_btrfs_auto_balancer is not defined
- name: configure system-btrfs-auto-balancer.cymais.service

View File

@ -1,25 +0,0 @@
---
galaxy_info:
author: "Kevin Veen-Birkenbach"
description: "Automates the creation of a swapfile on the target system by cloning and executing a swapfile creation script, ensuring adequate swap space for improved system performance."
license: "CyMaIS NonCommercial License (CNCL)"
license_url: "https://s.veen.world/cncl"
company: |
Kevin Veen-Birkenbach
Consulting & Coaching Solutions
https://www.veen.world
min_ansible_version: "2.9"
platforms:
- name: Linux
versions:
- all
galaxy_tags:
- swapfile
- system
- performance
- automation
repository: "https://s.veen.world/cymais"
issue_tracker_url: "https://s.veen.world/cymaisissues"
documentation: "https://s.veen.world/cymais"
dependencies:
- package-manager

View File

@ -1,7 +1,8 @@
- name: install swap-forge
command:
cmd: "pkgmgr install swap-forge --clone-mode https"
become: true
- name: "{{ role_name }} | pkgmgr install"
include_role:
name: pkgmgr-install
vars:
package_name: swap-forge
- name: Execute create swapfile script
ansible.builtin.shell: swap-forge "{{swapfile_size}}"

View File

@ -0,0 +1,2 @@
# Todos
- Activate update again. Atm not possible, because it pulls all repos

View File

@ -15,7 +15,7 @@ galaxy_info:
- all
galaxy_tags:
- update
- package-manager
- pkgmgr
- pkgmgr
- system
repository: "https://s.veen.world/cymais"

View File

@ -1,2 +1,2 @@
- name: "Update all repositories with pkgmgr"
command: "pkgmgr update --all"
#- name: "Update all repositories with pkgmgr"
# command: "pkgmgr update --all"