Un playbook para desplegar un koji de prueba. Incluye OpenTofu para desplegar infraestrctura usando libvirt + kvm/qemu.
  • Jinja 39.6%
  • HCL 18%
  • Shell 17.9%
  • Python 12.2%
  • CSS 9.5%
  • Other 2.8%
Find a file
Repository files (latest commit first)
Filename Latest commit message Latest commit date
Rénich Bon Ćirić ec69441d1c
feat(opentofu): add UEFI base image generation with explicit kickstart template
- Implement build-base-image.bash to automate UEFI base image creation
- Use explicit base-image.ks.tftpl template for virt-install kickstart
- Document base image requirements, package list, and partition layout in README
- Generalize path resolution and support terraform.tfvars overrides
- Fix clean-certs target in GNUmakefile to create directory if missing
- Update journals

Co-developed-by: Gemini AI <renich+gemini@woralelandia.com>
Signed-off-by: Rénich Bon Ćirić <renich@woralelandia.com>
2026-06-18 22:59:21 -06:00
.agents feat(opentofu): add UEFI base image generation with explicit kickstart template 2026-06-18 22:59:21 -06:00
bin feat: Integración de Siguldry PKCS#11 y spooler de firmas 2026-06-16 10:06:44 -06:00
docs docs: translate english technical guides to mexican spanish 2026-06-18 03:18:03 -06:00
inventories/staging feat: deploy Caddy repository server for BaseOS packages 2026-06-16 16:10:32 -06:00
opentofu feat(opentofu): add UEFI base image generation with explicit kickstart template 2026-06-18 22:59:21 -06:00
roles feat(opentofu): add UEFI base image generation with explicit kickstart template 2026-06-18 22:59:21 -06:00
vars fix(kojid): decouple host capacity from maxjobs limit to prevent deadlock 2026-06-18 16:45:37 -06:00
.gitignore refactor(ansible): Estandariza nombres de roles y actualiza Koji 2025-11-15 20:08:24 -06:00
ansible.cfg feat: Integración de Siguldry PKCS#11 y spooler de firmas 2026-06-16 10:06:44 -06:00
bootstrap.yaml feat: Integración de Siguldry PKCS#11 y spooler de firmas 2026-06-16 10:06:44 -06:00
CHANGELOG.rst feat: Integración de Siguldry PKCS#11 y spooler de firmas 2026-06-16 10:06:44 -06:00
CODE_OF_HONOR.rst primer commit 2025-08-06 05:45:11 -06:00
deploy.yaml feat: deploy Caddy repository server for BaseOS packages 2026-06-16 16:10:32 -06:00
GNUmakefile feat(opentofu): add UEFI base image generation with explicit kickstart template 2026-06-18 22:59:21 -06:00
README.rst feat(opentofu): add UEFI base image generation with explicit kickstart template 2026-06-18 22:59:21 -06:00
requirements.yaml primer commit 2025-08-06 05:45:11 -06:00
reset.yaml refactor(ansible): Estandariza nombres de roles y actualiza Koji 2025-11-15 20:08:24 -06:00
TODO.rst docs: Actualizar TODO.rst con tareas pendientes 2025-11-22 11:58:44 -06:00

Playbook de Ansible para MxOS Koji

Este playbook de Ansible automatiza el despliegue, configuración y ciclo de vida de un cluster de compilación Koji local (Staging/PoC) para la distribución MxOS, un fork de CentOS Stream 10 (y CentOS Stream 11 en el futuro).

El objetivo es mantener una compatibilidad estricta con la infraestructura oficial de CentOS Stream para facilitar la colaboración ascendente y el aprendizaje del ecosistema de empaquetado de Red Hat.

Entorno de Desarrollo

Para empezar a desarrollar, necesitas configurar un entorno de virtualización local. Este proyecto usa OpenTofu para aprovisionar 5 máquinas virtuales CentOS Stream 10 con Libvirt/KVM.

Requisitos

Este proyecto tiene las siguientes dependencias de software y entorno:

Software:
OpenTofu:

Para aprovisionar la infraestructura virtual.

# Agregar el repositorio oficial e instalar OpenTofu
curl --proto '=https' --tlsv1.2 -fsSL https://get.opentofu.org/tofu-repositories.noarch.rpm -o tofu-repositories.noarch.rpm
sudo dnf install -y ./tofu-repositories.noarch.rpm && rm -f tofu-repositories.noarch.rpm
sudo dnf install -y tofu
Ansible:

Para la configuración y el despliegue de Koji.

# Instalar Ansible Core
sudo dnf install -y ansible-core
Virtualización y Utilidades (libvirt, libvirt-nss, qemu y guestfs-tools):

Para la virtualización de las máquinas, resolución DNS interna por nombre y modificación de imágenes qcow2.

# Instalar dependencias de virtualización y utilidades
sudo dnf install -y @virtualization libvirt-nss guestfs-tools git

# Activar el servicio de libvirt
sudo systemctl enable --now libvirtd.socket

# Configurar resolución de nombres NSS para libvirt
sudo authselect enable-feature with-libvirt
sudo authselect check
sudo authselect apply-changes
Colecciones de Ansible:

Instalar las colecciones requeridas definidas en el proyecto:

ansible-galaxy collection install -r requirements.yaml
Sistema Operativo:

Todo el desarrollo y las pruebas se han realizado sobre Fedora 43 x86_64 con SELinux en modo Enforcing.

Permisos de Usuario:

Tu usuario local debe pertenecer a los grupos de virtualización:

sudo usermod -aG libvirt,kvm,qemu \<tu_usuario\>

Configuración Inicial

Antes de desplegar el entorno, debes realizar los siguientes pasos de configuración:

Credenciales de Ansible Vault:

Crea el archivo cifrado vars/credentials.yaml con las credenciales del cluster.

ansible-vault encrypt vars/credentials.yaml

El archivo credentials.yaml debe contener las siguientes variables:

# Base de Datos
koji_db_user: koji
koji_db_password: "tu-contraseña-segura"
koji_db_name: koji
koji_db_network: "192.168.122.0/24"

# Clave Secreta Web
web_secret: "tu-clave-secreta-web"

# Passphrase GPG
gpg_key_passphrase: "tu-passphrase-de-llave-gpg"

# Correo Electrónico
kojid_smtp_pass: "tu-contraseña-smtp"

Imagen Base de la VM

OpenTofu utiliza la imagen base de CentOS Stream 10 qcow2 en ~/VirtualMachines/cs10-system.qcow2 (definida en opentofu/variables.tf) para clonar los discos de las VMs.

Generación Automatizada:

Puedes generar la imagen de manera automática usando las herramientas de automatización incluidas en el proyecto. Desde la raíz del repositorio, ejecuta:

# Generar la imagen por defecto (CentOS Stream 10)
make -C opentofu/ base-image

# O especificar variables personalizadas (ej. versión 9, disco de 10 GiB)
make -C opentofu/ base-image version=9 size=10
Detalles Técnicos y Requisitos (Manual):

Si decides configurar o crear la imagen de forma manual, asegúrate de cumplir con los siguientes requisitos estructurales y de empaquetado para asegurar la compatibilidad con el despliegue automático:

  • Acomodo de Particiones (sin LVM): Debe usar una tabla de partición GPT (indispensable para arranque UEFI) y colocar la partición raíz (/) al final del disco (en el índice más alto, ej. vda4). Esto permite que el paquete growpart expanda dinámicamente el sistema de archivos en caliente en el primer arranque de la VM sin obstrucciones de otras particiones.

    Ejemplo de la estructura de particiones esperada:

    vda    253:0    0  100G  0 disk
    ├─vda1 253:1    0  512M  0 part /boot/efi (Partición UEFI ESP)
    ├─vda2 253:2    0    1G  0 part /boot
    ├─vda3 253:3    0    1G  0 part [SWAP]
    └─vda4 253:4    0  2.5G  0 part /         (Raíz al final del disco)
  • Paquetes Necesarios: La imagen base requiere tener preinstalados los siguientes paquetes esenciales:

    • cloud-init: Gestiona la configuración inicial de red y la inyección automática de llaves SSH.

    • cloud-utils-growpart: Permite expandir en caliente la partición raíz durante el arranque.

    • Herramientas de sistema: bash-completion, rsync, tmux y vim.

  • Consola Serial: Habilita la consola serial configurando los parámetros console=ttyS0,115200n8 console=tty0 en la línea de comando del kernel y actualiza GRUB usando grubby para poder acceder usando virsh console.

Actualización de la Imagen:

Para mantener actualizados los paquetes del sistema directamente en la imagen base sin reconstruirla por completo, puedes ejecutar:

virt-customize -a $HOME/VirtualMachines/cs10-system.qcow2 --smp=4 --memsize=8192 --update

Despliegue y Uso

  1. Aprovisionar la Infraestructura (OpenTofu): Crea las 5 VMs CentOS Stream 10 (Hub, DB, NFS, Builder, Dist-Git) y expande sus volúmenes de almacenamiento.

    make init
  2. Desplegar la Configuración (Ansible): Aplica los roles del playbook sobre los nodos virtuales aprovisionados.

    make deploy
  3. Arrancar e Inicializar Koji: Crea los usuarios, certificados base, tags de compilación (mxos0), grupos y destinos necesarios en la base de datos de Koji.

    make bootstrap
Acceso al Entorno:

Puedes acceder a la interfaz de administración web en: https://cs10-koji-00.mx-os/koji

Autenticación SSL en Koji Web:

El inicio de sesión de Koji Web requiere autenticación estricta basada en certificados de cliente SSL. Para poder acceder, sigue estos pasos en tu PC de escritorio:

  1. Instalar la confianza de la CA: Instala el certificado de la CA en el almacén de confianza del sistema de tu máquina local:

    sudo make install-ca
  2. Importar el certificado de cliente: Importa el archivo PKCS#12 del usuario administrador en tu navegador web (Chrome, Firefox, etc.):

    • Archivo: certs/kojiadmin_browser_cert.p12

    • Contraseña de importación: Ninguna (déjala vacía y presiona Enter)

  3. Acceder e Iniciar Sesión: Navega a https://cs10-koji-00.mx-os/koji/login. Tu navegador te solicitará seleccionar el certificado de cliente. Tras seleccionarlo, Koji Web autenticará tu sesión de forma segura redirigiéndote al index.

Uso del Cliente (CLI):

Para administrar Koji, accede al nodo Hub y ejecuta comandos como kojiadmin:

ssh root@cs10-koji-00.mx-os
sudo -u kojiadmin koji moshimoshi

Gestión de Fuentes (Lookaside Cache)

El servidor Dist-Git (cs10-koji-04.mx-os) actúa únicamente como Lookaside Cache para tarballs pesados. Los metadatos y archivos de especificación (.spec) de los paquetes se mantienen en repositorios Git independientes bajo git.mx-os.mx/RPMs/.

Sincronización de Fuentes:

Para compilar paquetes, los tarballs deben existir en el lookaside cache.

Sincronizar un paquete individual:

./bin/sync-sources.bash bash c10s

Sincronizar todos los paquetes de MxOS: Obtiene los repositorios del servidor Git de MxOS y sincroniza sus fuentes automáticamente:

./bin/sync-all-sources.bash

Firma de paquetes

Para cumplir con los estándares de seguridad de CentOS Stream, las compilaciones exitosas se firman criptográficamente mediante Sigul.

Flujo de Firma en Staging

  1. Koji Hub finaliza una compilación en estado COMPLETE y activa el plugin sigul_sign.py.

  2. El plugin encola el ID de compilación en el spooler local en /var/spool/koji-sign/queue/.

  3. El demonio independiente koji-sign-spooler.service detecta el archivo, espera a que finalice la transacción en base de datos, envía el RPM al servidor de firmas Sigul (simulado por Flask en staging) e importa la firma criptográfica de vuelta a Koji.

  4. Nota: En la siguiente fase, el servidor Flask simulado se migrará a una instalación real del puente y servidor de Sigul.

Documentación del Proyecto

La documentación técnica detallada, especificaciones y justificaciones de diseño se encuentran en el directorio docs/.

Estructura de Documentos

  • docs/technical/spec.rst: Especificaciones técnicas del cluster de MxOS Koji.

  • docs/technical/roadmap.rst: Fases de igualación a CentOS Stream y mejoras de infraestructura futuras.

  • docs/technical/decisiones/: Architecture Decision Records (ADRs) que justifican las decisiones clave de diseño del proyecto.

Desarrollo (Tareas de Makefile)

El GNUmakefile en la raíz del proyecto facilita las tareas de desarrollo comunes:

make init:

Destruye la infraestructura existente con OpenTofu y luego la recrea.

make deploy:

Ejecuta el playbook de despliegue principal.

make bootstrap:

Ejecuta el playbook de arranque para configurar los objetos de Koji.

make reset:

Ejecuta el playbook de reseteo.

make regenerate-certs:

Limpia el directorio certs/ y luego ejecuta las tareas de Ansible para regenerar todos los certificados.

Referencias