ikke_t.podman_container_systemd
podman-container-systemd
NOTE : Bien que cela fonctionne peut-être encore, sachez qu'un développement supplémentaire a lieu dans le nouveau projet linux system roles podman. Essayez cela, il est en développement actif. Merci à tous les contributeurs ici au fil des ans !
Ce rôle configure un ou plusieurs conteneurs à exécuter sur l'hôte avec l'aide de systemd. Podman gère les événements des conteneurs mais ne contrôle pas ou ne suit pas leur cycle de vie. C'est le travail d'un outil externe comme Kubernetes dans les clusters, et systemd dans les installations locales.
J'ai écrit ce rôle pour aider à gérer le cycle de vie des conteneurs podman sur mon serveur personnel qui n'est pas un cluster. Ainsi, je souhaite utiliser systemd pour les garder activés et en cours d’exécution lors des redémarrages.
Ce que fait le rôle :
- installe Podman
- récupère les images nécessaires
- lors des exécutions successives, il récupère à nouveau l'image et redémarre le conteneur si l'image a changé (pas encore pour le pod)
- crée un fichier systemd pour le conteneur ou le pod
- crée un fichier yaml kubernetes pour le pod
- crée des répertoires de volume pour les conteneurs s'ils n'existent pas. (pour le pod, utilisez DirectoryOrCreate)
- configure le conteneur ou le pod pour être toujours redémarré automatiquement si le conteneur meurt.
- fait en sorte que le conteneur ou le pod passe en état d'exécution au démarrage du système
- ajoute ou supprime les ports exposés des conteneurs au pare-feu.
- Prend un paramètre pour exécuter des conteneurs sans privilèges sous un utilisateur donné
Pour référence, consultez ces deux blogs concernant le rôle :
- Automatiser les conteneurs Podman avec Ansible 1/2
- Automatiser les conteneurs Podman avec Ansible 2/2
Les blogs décrivent comment vous pouvez exécuter un conteneur unique, ou plusieurs conteneurs en un pod en utilisant ce module.
Remarque pour l'exécution de conteneurs sans privilèges :
- Vous devez avoir créé l'utilisateur avant d'exécuter ce rôle.
- L'utilisateur doit avoir des entrées dans les fichiers /etc/sub[gu]id pour la plage de namespace. Sinon, ce rôle ajoute quelques variables pour faire fonctionner les choses, mais il est préférable de les vérifier.
- Certaines restrictions de contrôle comme la mémoire ou d'autres limites de ressources ne fonctionneront pas en tant qu'utilisateur.
- Vous devez augmenter
systemd_TimeoutStartSec
considérablement, car nous ne pouvons pas précharger les images avant le démarrage de l'unité systemd. Donc systemd doit attendre que podman tire les images avant de démarrer le conteneur. Cela peut prendre des minutes selon votre connexion réseau et la taille de l'image du conteneur.
Conditions requises
Nécessite un système capable de faire fonctionner podman, et que podman soit trouvé
dans les dépôts de paquets. Le rôle installe podman. Le rôle installe également firewalld
si l'utilisateur a défini la variable container_firewall_ports
. Installe kubeval
pour un pod si container_pod_yaml_template_validation: true
.
Variables du rôle
Le rôle utilise des variables qui doivent être passées lors de son inclusion. Étant donné qu'il est possible d'exécuter un conteneur séparément ou plusieurs conteneurs dans un pod, notez que certaines options s'appliquent uniquement à l'autre méthode.
container_image_list
- liste des images de conteneurs à exécuter. Si plus d'une image est définie, les conteneurs seront exécutés dans un pod. Il est possible de le définir comme un dictionnaire pour inclure des informations d'authentification par image, comme suit :
container_image_list:
- image: docker.io/imagename
user: exampleuser
password: examplepw
- image: docker.io/imagename2
container_image_user
- nom d'utilisateur facultatif par défaut à utiliser lors de l'authentification aux dépôts distantscontainer_image_password
- mot de passe par défaut facultatif à utiliser lors de l'authentification aux dépôts distantscontainer_name
- Identifie le conteneur dans les commandes systemd et podman. Le fichier de service systemd sera nommé container_name--container-pod.service. Cela peut être remplacé par service_name.container_run_args
- Tout ce que vous passez à podman, sauf le nom et l'image lors du lancement d'un conteneur unique. Non utilisé pour le pod. Peut être une chaîne ou une liste de chaînes.container_cmd_args
- Toute commande et arguments passés à podman-run après avoir spécifié le nom de l'image. Non utilisé pour le pod.container_run_as_user
- Sous quel utilisateur systemd doit exécuter le conteneur. Par défaut, c'est root.container_run_as_group
- Quel groupe systemd doit exécuter le conteneur. Par défaut, c'est root.container_dir_owner
- Quel propriétaire les répertoires de volume doivent avoir. Par défaut, c'est container_run_as_user. Si vous utilisez :U comme option de volume, podman définira automatiquement les autorisations pour l'utilisateur à l'intérieur du conteneur. Citation : Le suffixe :U indique à Podman d'utiliser le bon UID et GID hôte en fonction de l'UID et du GID à l'intérieur du conteneur, pour changer récursivement le propriétaire et le groupe du volume source. Avertissements à utiliser avec précaution car cela modifiera le système de fichiers hôte.container_dir_group
- Quel groupe les répertoires de volume doivent avoir. Par défaut, c'est container_run_as_group.container_dir_mode
- Quelles autorisations les répertoires de volume doivent avoir. Par défaut, c'est '0755'.container_state
- le conteneur est installé et exécuté si l'état estrunning
, et arrêté et le fichier systemd supprimé s'il estabsent
container_firewall_ports
- liste des ports que vous avez exposés depuis le conteneur et que vous souhaitez ouvrir dans le pare-feu. Lorsque l'état du conteneur est absent, les ports du pare-feu sont fermés. Si vous ne voulez pas que firewalld soit installé, ne définissez pas cela.systemd_TimeoutStartSec
- combien de temps systemd attend-il pour démarrer le conteneur ?systemd_tempdir
- Où stocker le conmon-pidfile et cidfile pour les conteneurs uniques. Par défaut, c'est%T
sur les systèmes prenant en charge ce spécificateur (voir man 5 systemd.unit)/tmp
sinon.service_name
- Comment sont nommés les fichiers de services systemd. Par défaut, c'est"{{ container_name }}-container-pod-{{ container_run_as_user }}.service"
.service_files_dir
- Où stocker les fichiers de service systemd. Par défaut, c'est/usr/local/lib/systemd/system
pour root et"{{ user_info.home }}/.config/systemd/user
pour un utilisateur sans privilèges.service_files_owner
- Quel utilisateur doit posséder les fichiers de service systemd. Par défaut, c'est root.service_files_group
- Quel groupe doit posséder les fichiers de service systemd. Par défaut, c'est root.service_files_mode
- Quelles autorisations doivent avoir les fichiers de service systemd. Par défaut, c'est 0644.container_pod_yaml
- Chemin vers le fichier yaml du pod. Requis pour un pod.container_pod_yaml_deploy
- Faut-il déployer le fichier yaml du pod. Par défaut, c'estfalse
container_pod_yaml_template
- Modèle à utiliser pour le déploiement du yaml du pod. Comme le modèle n'inclut pas toutes les options de configuration possibles, il est possible de le remplacer par votre propre modèle. Par défaut, c'esttemplates/container-pod-yaml.j2
.container_pod_yaml_template_validation
- Faut-il valider le fichier yaml du pod déployé. Par défaut, c'estfalse
.container_pod_labels
- Définit les étiquettes pourcontainer_pod_yaml_deploy
.container_pod_volumes
- Définit les volumes pourcontainer_pod_yaml_deploy
.container_pod_containers
- Définit les conteneurs pourcontainer_pod_yaml_deploy
.
Ce playbook n'a pas de module python pour analyser les paramètres pour la commande podman.
D'ici là, vous devez simplement passer tous les paramètres comme vous le feriez en utilisant podman depuis
la ligne de commande. Consultez man podman
ou
les tutoriels podman
pour plus d'informations.
Si vous souhaitez que vos
images soient automatiquement mises à jour,
ajoutez cette étiquette aux container_cmd_args : --label "io.containers.autoupdate=image"
N'utilisez jamais ansible.builtin.import_role
pour exécuter ce rôle si vous avez l'intention de l'utiliser plus
d'une fois par playbook, sinon vous tomberez dans
cette anti-modèle.
Dépendances
- containers.podman (collection)
- ansible.posix (collection)
Exemple de Playbook
Voir le tests/main.yml pour un exemple. En résumé, incluez le rôle avec des variables.
Conteneur root :
- name: tests container
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
Conteneur sans privilèges :
- name: ensure user
user:
name: rootless_user
comment: I run sample container
- name: tests container
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 sans privilèges :
- name: ensure user
user:
name: rootless_user
comment: I run sample container
- name: tests 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
Licence
GPLv3
Informations sur l'auteur
Ilkka Tengvall ilkka.tengvall@iki.fi
Role sets up container(s) to run on host with help of systemd.
ansible-galaxy install ikke_t.podman_container_systemd