ikke_t.podman_container_systemd

podman-container-systemd

NOTA: Aunque esto todavía debería funcionar, ten en cuenta que el desarrollo posterior sucede en el nuevo proyecto de roles del sistema Linux Podman. Inténtalo, está en desarrollo activo. Gracias a todos los colaboradores aquí a lo largo de los años.

Este rol configura uno o más contenedores para ser ejecutados en el host con la ayuda de systemd. Podman implementa eventos de contenedores, pero no controla ni rastrea el ciclo de vida. Eso es responsabilidad de herramientas externas como Kubernetes en clústeres y systemd en instalaciones locales.

Escribí este rol para ayudar a gestionar el ciclo de vida de los contenedores de Podman en mi servidor personal, que no es un clúster. Por lo tanto, quiero usar systemd para mantenerlos habilitados y en funcionamiento tras los reinicios.

Lo que hace el rol:

  • instala Podman
  • descarga las imágenes requeridas
  • en ejecuciones consecutivas, vuelve a descargar la imagen y reinicia el contenedor si la imagen ha cambiado (no para pods todavía)
  • crea un archivo de systemd para el contenedor o pod
  • crea un archivo yaml de Kubernetes para el pod
  • crea directorios de volumen para los contenedores si no existen (para pods usa DirectoryOrCreate)
  • establece el contenedor o pod para reiniciarse automáticamente si el contenedor muere
  • hace que el contenedor o pod entre en estado de ejecución al iniciar el sistema
  • agrega o quita los puertos expuestos del contenedor del firewall
  • toma un parámetro para ejecutar contenedores sin privilegios bajo un usuario dado

Para más información, consulta estos dos blogs sobre el rol:

Los blogs describen cómo puedes usar un solo contenedor o varios contenedores como un pod usando este módulo.

Nota para ejecutar contenedores sin privilegios:

  • Necesitas tener el usuario creado antes de ejecutar este rol.
  • El usuario debería tener entradas en los archivos /etc/sub[gu]id para el rango de espacio de nombres. Si no, este rol añade algunas variables allí para que funcione, pero preferiblemente debes verificarlo.
  • Algunas cosas de control, como límites de memoria u otros recursos, no funcionarán como usuario.
  • Querrás aumentar systemd_TimeoutStartSec considerablemente, ya que no podemos precargar las imágenes antes de que inicie la unidad de systemd. Por lo tanto, systemd necesita esperar a que Podman descargue las imágenes antes de iniciar el contenedor. Esto puede tomar minutos dependiendo de tu conexión a la red y el tamaño de la imagen del contenedor.

Requisitos

Se requiere un sistema capaz de ejecutar Podman y que Podman se encuentre en los repositorios de paquetes. El rol instala Podman. El rol también instala firewalld si el usuario ha definido la variable container_firewall_ports. Instala kubeval para un pod si container_pod_yaml_template_validation: true.

Variables del rol

El rol utiliza variables que deben ser pasadas al incluirlo. Dado que hay opción para ejecutar un contenedor individualmente o múltiples contenedores en un pod, ten en cuenta que algunas opciones solo aplican a un método u otro.

  • container_image_list - lista de imágenes de contenedores para ejecutar. Si se define más de una imagen, los contenedores se ejecutarán en un pod. Es posible definirlo como un diccionario para incluir información de autenticación por imagen, así:
container_image_list:
  - image: docker.io/imagename
    user: exampleuser
    password: examplepw
  - image: docker.io/imagename2
  • container_image_user - nombre de usuario opcional por defecto para usar al autenticarte en registros remotos
  • container_image_password - contraseña opcional por defecto para usar al autenticarte en registros remotos
  • container_name - identifica el contenedor en los comandos de systemd y Podman. El archivo del servicio de systemd se llamará container_name--container-pod.service. Esto puede ser sobrescrito con service_name.
  • container_run_args - cualquier cosa que pases a Podman, excepto el nombre y la imagen al ejecutar un solo contenedor. No se usa para pods. Puede ser una cadena o una lista de cadenas.
  • container_cmd_args - cualquier comando y argumentos pasados a podman-run después de especificar el nombre de la imagen. No se usa para pods.
  • container_run_as_user - qué usuario debería ejecutar systemd el contenedor. Por defecto es root.
  • container_run_as_group - qué grupo debería ejecutar systemd el contenedor. Por defecto es root.
  • container_dir_owner - qué propietario deberían tener los directorios de volumen. Por defecto es container_run_as_user. Si usas :U como opción de volumen, Podman ajustará automáticamente los permisos para el usuario dentro del contenedor. Cita: El sufijo :U le dice a Podman que use el UID y GID correctos del host en función del UID y GID dentro del contenedor, para cambiar recursivamente el propietario y grupo del volumen fuente. Advertencia: usa con precaución, ya que esto modificará el sistema de archivos del host.
  • container_dir_group - qué grupo deberían tener los directorios de volumen. Por defecto es container_run_as_group.
  • container_dir_mode - qué permisos deberían tener los directorios de volumen. Por defecto es '0755'.
  • container_state - el contenedor se instala y ejecuta si el estado es running, y se detiene y se elimina el archivo de systemd si es absent.
  • container_firewall_ports - lista de puertos que has expuesto del contenedor y quieres abrir en el firewall. Cuando el estado del contenedor es ausente, los puertos del firewall se cierran. Si no deseas que se instale firewalld, no definas esto.
  • systemd_TimeoutStartSec - ¿cuánto tiempo espera systemd para que inicie el contenedor?
  • systemd_tempdir - dónde almacenar el conmon-pidfile y el cidfile para contenedores individuales. Por defecto es %T en sistemas que soportan este especificador (ver man 5 systemd.unit) /tmp de lo contrario.
  • service_name - cómo se nombran los archivos de servicio de systemd. Por defecto es "{{ container_name }}-container-pod-{{ container_run_as_user }}.service".
  • service_files_dir - dónde almacenar los archivos de servicio de systemd. Por defecto es /usr/local/lib/systemd/system para root y "{{ user_info.home }}/.config/systemd/user para un usuario sin privilegios.
  • service_files_owner - qué usuario debería ser el propietario de los archivos de servicio de systemd. Por defecto es root.
  • service_files_group - qué grupo debería ser el propietario de los archivos de servicio de systemd. Por defecto es root.
  • service_files_mode - qué permisos deberían tener los archivos de servicio de systemd. Por defecto es 0644.
  • container_pod_yaml - ruta al archivo yaml del pod. Requerido para un pod.
  • container_pod_yaml_deploy - si desplegar el archivo yaml del pod. Por defecto es false.
  • container_pod_yaml_template - plantilla a usar para el despliegue del pod yaml. Como la plantilla no incluye todas las posibles opciones de configuración, es posible sobrescribirla con tu propia plantilla. Por defecto es templates/container-pod-yaml.j2.
  • container_pod_yaml_template_validation - si validar el archivo yaml del pod desplegado. Por defecto es false.
  • container_pod_labels - define etiquetas para container_pod_yaml_deploy.
  • container_pod_volumes - define volúmenes para container_pod_yaml_deploy.
  • container_pod_containers - define contenedores para container_pod_yaml_deploy.

Este playbook no tiene un módulo de Python para analizar parámetros para el comando Podman. Hasta que eso ocurra, solo necesitas pasar todos los parámetros como lo harías al usar Podman desde la línea de comandos. Consulta man podman o tutoriales de Podman para más información.

Si deseas que tus imágenes se actualicen automáticamente, añade esta etiqueta a container_cmd_args: --label "io.containers.autoupdate=image"

Nunca uses ansible.builtin.import_role para ejecutar este rol si tienes la intención de usarlo más de una vez por playbook, o caerás en este anti-patrón.

Dependencias

Ejemplo de Playbook

Consulta tests/main.yml para un ejemplo. En resumen, incluye el rol con variables.

Contenedor root:

- name: probar contenedor
  vars:
    container_image_list: 
      - sebp/lighttpd:latest
    container_name: lighttpd
    container_run_args: >-
      --rm
      -v /tmp/podman-container-systemd:/var/www/localhost/htdocs:Z,U
      --label "io.containers.autoupdate=image"
      -p 8080:80
    #container_state: absent
    container_state: running
    container_firewall_ports:
      - 8080/tcp
      - 8443/tcp
  ansible.builtin.include_role:
    name: podman-container-systemd

Contenedor sin privilegios:

- name: asegurar usuario
  user:
    name: rootless_user
    comment: Soy un usuario que ejecuta un contenedor de muestra

- name: probar contenedor
  vars:
    container_run_as_user: rootless_user
    container_run_as_group: rootless_user
    container_image_list: 
      - sebp/lighttpd:latest
    container_name: lighttpd
    container_run_args: >-
      --rm
      -v /tmp/podman-container-systemd:/var/www/localhost/htdocs:Z,U
      -p 8080:80
    #container_state: absent
    container_state: running
    container_firewall_ports:
      - 8080/tcp
      - 8443/tcp
  ansible.builtin.include_role:
    name: podman-container-systemd

Pod sin privilegios:

- name: asegurar usuario
  user:
    name: rootless_user
    comment: Soy un usuario que ejecuta un contenedor de muestra

- name: probar pod
  vars:
    container_run_as_user: rootless_user
    container_run_as_group: rootless_user
    container_image_list:
      - sebp/lighttpd:latest
    container_name: lighttpd-pod
    container_pod_yaml: /home/rootless_user/lighttpd-pod.yml
    container_pod_yaml_deploy: true
    container_pod_yaml_template_validation: true
    container_pod_labels:
      app: "{{ container_name }}"
      io.containers.autoupdate: 'image(1)'
    container_pod_volumes:
      - name: htdocs
        hostPath:
          path: /tmp/podman-container-systemd
          type: DirectoryOrCreate
    container_pod_containers:
      - name: lighttpd
        image: sebp/lighttpd:latest
        volumeMounts:
          - name: htdocs
            mountPath: /var/www/localhost/htdocs:Z
        ports:
          - containerPort: 80
            hostPort: 8080
    container_state: running
    container_firewall_ports:
      - 8080/tcp
      - 8443/tcp
  ansible.builtin.include_role:
    name: podman-container-systemd

Licencia

GPLv3

Información del autor

Ilkka Tengvall ilkka.tengvall@iki.fi

Acerca del proyecto

Role sets up container(s) to run on host with help of systemd.

Instalar
ansible-galaxy install ikke_t.podman_container_systemd
Licencia
Unknown
Descargas
13.1k
Propietario
I nerd around the clock. At day time for Red Hat, at evenings for my hobby projects. Except when family duties interrupt :) All for open source.