You've already forked role_podman
Compare commits
27 Commits
5da0939180
...
fedora
| Author | SHA1 | Date | |
|---|---|---|---|
| da83cf1e00 | |||
| 560a6d31e6 | |||
| 5b872ba3cb | |||
| 3cfe5831f2 | |||
| 745fd321ea | |||
| 14e5cb0537 | |||
| 56a9bd5fdc | |||
| 4e1585446f | |||
| 1da27ec5a2 | |||
| 55a54636b5 | |||
| 00c837ad55 | |||
| b11570c069 | |||
| b9a6f018e0 | |||
| 60737c9a5a | |||
| b5484b1c73 | |||
| ba333bee03 | |||
| 4b75fd6232 | |||
| a3d7323849 | |||
| 74b5b35238 | |||
| 81b51cfcba | |||
| b1e2866635 | |||
| 91e8739aed | |||
| c800813c7b | |||
| 1dd6ac97b9 | |||
| 7007d8f123 | |||
| 319439c3ac | |||
| 383ffae171 |
114
README.md
114
README.md
@@ -1,76 +1,66 @@
|
|||||||
# role_podman
|
# role_podman
|
||||||
|
|
||||||
Rôle de déploiement de podman.
|
Deploy podman, manage pods and containers.
|
||||||
|
|
||||||
## Pré-requis
|
|
||||||
|
|
||||||
Ce rôle créer un utilisateur dédié via [cet autre rôle](https://gitea.ykn.fr/ansible/role_users) dont il est dépendant.
|
|
||||||
L'utilisation de ce rôle et de sa dépendance dans un playbook nécessite d'utilise ansible-galaxy en lui indiquant un fichier dont le contenu est le suivant :
|
|
||||||
|
|
||||||
```bash
|
|
||||||
$ cd playbook_podman
|
|
||||||
$ tee requirements.yml <<EOF
|
|
||||||
---
|
|
||||||
|
|
||||||
roles:
|
|
||||||
- name: users
|
|
||||||
scm: git
|
|
||||||
src: ssh://gitea@git.ykn.fr:12393/ansible/role_users.git
|
|
||||||
version: alpha
|
|
||||||
|
|
||||||
- name: podman
|
|
||||||
scm: git
|
|
||||||
src: ssh://gitea@git.ykn.fr:12393/ansible/role_podman.git
|
|
||||||
version: alpha
|
|
||||||
EOF
|
|
||||||
$ ansible-galaxy install -fr requirements.yml
|
|
||||||
```
|
|
||||||
|
|
||||||
## Variables
|
## Variables
|
||||||
|
|
||||||
|
### podman_auto_update
|
||||||
|
|
||||||
|
Status of the automatic container update service.
|
||||||
|
|
||||||
|
<span style="text-decoration: underline">Default value:</span> `true
|
||||||
|
|
||||||
|
### podman_pods
|
||||||
|
|
||||||
|
List of dictionnaries to define pods ([see ansible documentation](https://docs.ansible.com/ansible/latest/collections/containers/podman/podman_pod_module.html)).
|
||||||
|
|
||||||
|
<span style="text-decoration: underline">Default value:</span> none
|
||||||
|
|
||||||
### podman_containers
|
### podman_containers
|
||||||
|
|
||||||
Définition des conteneurs à déployer.
|
List of dictionnaries to define containers ([see ansible documentation](https://docs.ansible.com/ansible/latest/collections/containers/podman/podman_container_module.html#ansible-collections-containers-podman-podman-container-module)).
|
||||||
|
|
||||||
<span style="text-decoration: underline">Valeur par défaut:</span> *aucune*
|
<span style="text-decoration: underline">Default value:</span> none
|
||||||
|
|
||||||
## Utilisation
|
## Usage
|
||||||
|
|
||||||
Définir la variable `podman_containers` dans un fichier sous `host_vars` ou `group_vars` :
|
To deploy *wg-easy* container:
|
||||||
|
|
||||||
```bash
|
|
||||||
$ tee host_vars/lxd_podman_host.yml <<EOF
|
|
||||||
---
|
|
||||||
|
|
||||||
|
```yml
|
||||||
|
# BEGIN role_podman
|
||||||
podman_containers:
|
podman_containers:
|
||||||
- image: docker.io/wallabag/wallabag:latest
|
- image: "ghcr.io/wg-easy/wg-easy:latest"
|
||||||
name: wallbag
|
name: wg-easy
|
||||||
userns: keep-id
|
publish:
|
||||||
|
- "51820:51820/udp"
|
||||||
|
- "51821:51821/tcp"
|
||||||
volumes:
|
volumes:
|
||||||
- wallbag-data:/var/www/wallabag/data
|
- "/srv/wg-easy:/etc/wireguard"
|
||||||
- wallbag-image:/var/www/wallabag/web/assets/images
|
env:
|
||||||
ports:
|
LANG: fr
|
||||||
- 80:80/tcp
|
PORT: 51821
|
||||||
environment_vars:
|
UI_CHART_TYPE: 2
|
||||||
- SYMFONY__ENV__DOMAIN_NAME=https://wallbag.ykn.fr
|
PASSWORD_HASH: <secret>
|
||||||
```
|
WG_HOST: noun.ykn.fr
|
||||||
|
WG_PORT: 51820
|
||||||
Il est également possible de définir l'utilisateur via la variable `user`, comme ceci :
|
WG_PERSISTENT_KEEPALIVE: 25
|
||||||
|
WG_DEFAULT_DNS: ""
|
||||||
```bash
|
WG_ALLOWED_IPS: 192.168.84.0/24
|
||||||
$ tee host_vars/lxd_podman_host.yml <<EOF
|
cap_add:
|
||||||
---
|
- NET_ADMIN
|
||||||
|
- NET_RAW
|
||||||
podman_containers:
|
- SYS_MODULE
|
||||||
- image: docker.io/wallabag/wallabag:latest
|
sysctl:
|
||||||
name: wallbag
|
net.ipv4.ip_forward: 1
|
||||||
user: un_utilisateur
|
net.ipv4.conf.all.src_valid_mark: 1
|
||||||
userns: keep-id
|
quadlet_options:
|
||||||
volumes:
|
- AutoUpdate=registry
|
||||||
- wallbag-data:/var/www/wallabag/data
|
- |-
|
||||||
- wallbag-image:/var/www/wallabag/web/assets/images
|
[Service]
|
||||||
ports:
|
Restart=on-failure
|
||||||
- 80:80/tcp
|
TimeoutStartSec=900
|
||||||
environment_vars:
|
- |-
|
||||||
- SYMFONY__ENV__DOMAIN_NAME=https://wallbag.ykn.fr
|
[Install]
|
||||||
|
WantedBy=default.target
|
||||||
|
# END role_podman
|
||||||
```
|
```
|
||||||
|
|||||||
@@ -1,15 +1,22 @@
|
|||||||
---
|
---
|
||||||
# defaults file for podman
|
# defaults file for podman
|
||||||
|
|
||||||
podman_containers: {}
|
# Packages to install to run podman
|
||||||
# Exemple:
|
podman_packages:
|
||||||
# - image: docker.io/wallabag/wallabag:latest
|
- podman
|
||||||
# name: wallbag
|
- policycoreutils-python-utils # to manage SELinux
|
||||||
# userns: keep-id
|
|
||||||
# volumes:
|
# Dedicated user
|
||||||
# - wallbag-data:/var/www/wallabag/data
|
podman_user: podman
|
||||||
# - wallbag-image:/var/www/wallabag/web/assets/images
|
podman_user_homedir: /home/{{ podman_user }}
|
||||||
# ports:
|
|
||||||
# - 80:80/tcp
|
# Enable container auto-update
|
||||||
# environment_vars:
|
podman_auto_update: true
|
||||||
# - SYMFONY__ENV__DOMAIN_NAME=https://wallbag.ykn.fr
|
|
||||||
|
# List of quadlets to deploy
|
||||||
|
podman_quadlets: []
|
||||||
|
# Example:
|
||||||
|
# podman_quadlets:
|
||||||
|
# - uptime-kuma.network
|
||||||
|
# - uptime-kuma.container
|
||||||
|
# - signal-cli-rest-api.container
|
||||||
|
|||||||
23
handlers/main.yml
Normal file
23
handlers/main.yml
Normal file
@@ -0,0 +1,23 @@
|
|||||||
|
---
|
||||||
|
# handlers file for podman
|
||||||
|
|
||||||
|
- name: Start or restart quadlets
|
||||||
|
ansible.builtin.systemd_service:
|
||||||
|
name: "{{ unit }}"
|
||||||
|
state: "{{ 'restarted' if item.changed else 'started' }}"
|
||||||
|
daemon_reload: true
|
||||||
|
enabled: true
|
||||||
|
scope: user
|
||||||
|
become: true
|
||||||
|
become_user: "{{ podman_user }}"
|
||||||
|
loop: "{{ deployed_quadlets.results }}"
|
||||||
|
loop_control:
|
||||||
|
label: "{{ unit }}"
|
||||||
|
vars:
|
||||||
|
unit: >-
|
||||||
|
{{
|
||||||
|
item.item.filename | default(item.item) | ansible.builtin.basename |
|
||||||
|
ansible.builtin.regex_replace('\.container$', '.service') |
|
||||||
|
ansible.builtin.regex_replace('\.network$', '-network.service') |
|
||||||
|
ansible.builtin.regex_replace('\.volume$', '-volume.service')
|
||||||
|
}}
|
||||||
@@ -1,15 +1,15 @@
|
|||||||
galaxy_info:
|
galaxy_info:
|
||||||
namespace: ykn
|
namespace: ykn
|
||||||
author: pulsar89.5
|
author: pulsar89.5
|
||||||
description: Rôle de déploiement de podman
|
description: Deploy podman quadlets
|
||||||
|
|
||||||
license: GPL-3.0-or-later
|
license: GPL-3.0-or-later
|
||||||
|
|
||||||
min_ansible_version: '2.1'
|
min_ansible_version: '2.1'
|
||||||
|
|
||||||
platforms:
|
platforms:
|
||||||
- name: Debian
|
- name: Fedora
|
||||||
versions:
|
versions:
|
||||||
- sid
|
- "43"
|
||||||
|
|
||||||
dependencies: []
|
dependencies: []
|
||||||
|
|||||||
45
tasks/config.yml
Normal file
45
tasks/config.yml
Normal file
@@ -0,0 +1,45 @@
|
|||||||
|
---
|
||||||
|
# tasks file for podman
|
||||||
|
|
||||||
|
- name: Disable global podman auto-update
|
||||||
|
ansible.builtin.systemd_service:
|
||||||
|
name: podman-auto-update.timer
|
||||||
|
enabled: false
|
||||||
|
become: true
|
||||||
|
|
||||||
|
- name: Enable lingering for podman user
|
||||||
|
ansible.builtin.command:
|
||||||
|
cmd: "{{ item }}"
|
||||||
|
creates: /var/lib/systemd/linger/{{ podman_user }}
|
||||||
|
become: true
|
||||||
|
loop:
|
||||||
|
- sudo systemctl --machine={{ podman_user }}@.host --user daemon-reload
|
||||||
|
- loginctl enable-linger {{ podman_user }}
|
||||||
|
|
||||||
|
- name: Enable containers auto-update service
|
||||||
|
ansible.builtin.systemd_service:
|
||||||
|
name: podman-auto-update.timer
|
||||||
|
state: started
|
||||||
|
daemon_reload: true
|
||||||
|
scope: user
|
||||||
|
when: podman_auto_update
|
||||||
|
become: true
|
||||||
|
become_user: "{{ podman_user }}"
|
||||||
|
|
||||||
|
- name: Create podman user directory tree
|
||||||
|
ansible.builtin.file:
|
||||||
|
path: "{{ item.path }}"
|
||||||
|
owner: "{{ podman_user }}"
|
||||||
|
group: "{{ podman_user }}"
|
||||||
|
mode: "{{ item.mode }}"
|
||||||
|
state: directory
|
||||||
|
become: true
|
||||||
|
loop:
|
||||||
|
- path: "{{ podman_user_homedir }}/.config"
|
||||||
|
mode: u=rwX,g=,o=
|
||||||
|
- path: "{{ podman_user_homedir }}/.config/containers"
|
||||||
|
mode: u=rwX,g=rX,o=rX
|
||||||
|
- path: "{{ podman_user_homedir }}/.config/containers/systemd"
|
||||||
|
mode: u=rwX,g=rX,o=rX
|
||||||
|
loop_control:
|
||||||
|
label: "{{ item.path }}"
|
||||||
@@ -1,54 +0,0 @@
|
|||||||
---
|
|
||||||
# tasks file for podman
|
|
||||||
|
|
||||||
- name: Créer l'utilisateur dédié
|
|
||||||
ansible.builtin.include_role:
|
|
||||||
name: users
|
|
||||||
vars:
|
|
||||||
users:
|
|
||||||
- name: "{{ container_user }}"
|
|
||||||
comment: Dedicated Podman user ({{ container.name }})
|
|
||||||
update_password: on_create
|
|
||||||
password_lock: true
|
|
||||||
shell: /bin/bash
|
|
||||||
|
|
||||||
- name: Créer le chemin de stockage des définitions
|
|
||||||
ansible.builtin.file:
|
|
||||||
path: "{{ container_basepath }}"
|
|
||||||
state: directory
|
|
||||||
owner: "{{ container_user }}"
|
|
||||||
group: "{{ container_user }}"
|
|
||||||
mode: u=rwX,g=rwX,o=
|
|
||||||
become: true
|
|
||||||
|
|
||||||
- name: Créer le volume
|
|
||||||
containers.podman.podman_volume:
|
|
||||||
name: "{{ item.split(':')[0] }}"
|
|
||||||
when: container.get('volumes', []) | length > 0
|
|
||||||
loop: "{{ container.volumes }}"
|
|
||||||
|
|
||||||
- name: Déployer le conteneur
|
|
||||||
ansible.builtin.template:
|
|
||||||
src: podman-quadlet.container.j2
|
|
||||||
dest: "{{ container_basepath }}/{{ container_filename }}"
|
|
||||||
owner: "{{ container_user }}"
|
|
||||||
group: "{{ container_user }}"
|
|
||||||
mode: u=rw,g=rw,o=
|
|
||||||
become: true
|
|
||||||
register: deploy_container
|
|
||||||
|
|
||||||
- name: Activer le lingering
|
|
||||||
ansible.builtin.command:
|
|
||||||
cmd: "loginctl enable-linger {{ container_user }}"
|
|
||||||
creates: /var/lib/systemd/linger/{{ container_user }}
|
|
||||||
become: true
|
|
||||||
|
|
||||||
- name: Démarrer ou redémarrer le conteneur
|
|
||||||
ansible.builtin.systemd_service:
|
|
||||||
name: "{{ container_filename | replace('.container', '.service') }}"
|
|
||||||
state: "{{ 'restarted' if deploy_container.changed else 'started' }}"
|
|
||||||
enabled: true
|
|
||||||
daemon_reload: true
|
|
||||||
scope: user
|
|
||||||
become: true
|
|
||||||
become_user: "{{ container_user }}"
|
|
||||||
@@ -1,13 +0,0 @@
|
|||||||
---
|
|
||||||
# tasks file for podman
|
|
||||||
|
|
||||||
- name: Installer les paquets
|
|
||||||
ansible.builtin.apt:
|
|
||||||
name:
|
|
||||||
- dbus-user-session
|
|
||||||
- podman
|
|
||||||
- rootlesskit
|
|
||||||
- slirp4netns
|
|
||||||
- systemd-container
|
|
||||||
state: present
|
|
||||||
become: true
|
|
||||||
@@ -1,18 +1,17 @@
|
|||||||
---
|
---
|
||||||
# tasks file for podman
|
# tasks file for podman
|
||||||
|
|
||||||
- name: Importer les tâches d'installation
|
- name: Import prepare tasks
|
||||||
tags: installation
|
ansible.builtin.import_tasks:
|
||||||
ansible.builtin.import_tasks: installation.yml
|
file: prepare.yml
|
||||||
|
|
||||||
- name: Importer les tâches de configuration
|
- name: Import configuration tasks
|
||||||
tags: configuration
|
ansible.builtin.import_tasks:
|
||||||
ansible.builtin.include_tasks: configuration.yml
|
file: config.yml
|
||||||
loop: "{{ podman_containers }}"
|
|
||||||
loop_control:
|
- name: Import management tasks
|
||||||
label: "{{ container.name }}"
|
ansible.builtin.import_tasks:
|
||||||
loop_var: container
|
file: manage.yml
|
||||||
vars:
|
|
||||||
container_user: "podman-{{ container.user | default(container.name) }}"
|
- name: Flush handlers
|
||||||
container_basepath: "/home/{{ container_user }}/.config/containers/systemd"
|
ansible.builtin.meta: flush_handlers
|
||||||
container_filename: "podman-{{ container.name }}.container"
|
|
||||||
|
|||||||
64
tasks/manage.yml
Normal file
64
tasks/manage.yml
Normal file
@@ -0,0 +1,64 @@
|
|||||||
|
---
|
||||||
|
# tasks file for podman
|
||||||
|
|
||||||
|
#- name: List current quadlets
|
||||||
|
# ansible.builtin.find:
|
||||||
|
# paths: "{{ podman_user_homedir }}/.config/containers/systemd"
|
||||||
|
# become: true
|
||||||
|
# register: current_quadlets
|
||||||
|
#
|
||||||
|
#- name: Extract list of undefined quadlets
|
||||||
|
# ansible.builtin.set_fact:
|
||||||
|
# podman_quadlets_undefined: >-
|
||||||
|
# {{
|
||||||
|
# current_quadlets.files |
|
||||||
|
# map(attribute='path') |
|
||||||
|
# map('ansible.builtin.basename') |
|
||||||
|
# ansible.builtin.difference(podman_qualets_filenames)
|
||||||
|
# }}
|
||||||
|
# vars:
|
||||||
|
# podman_qualets_filenames: "{{ podman_quadlets | map('ansible.builtin.basename') }}"
|
||||||
|
#
|
||||||
|
#- name: Stop unwanted quadlets
|
||||||
|
# ansible.builtin.systemd_service:
|
||||||
|
# name: "{{ unit }}"
|
||||||
|
# state: stopped
|
||||||
|
# daemon_reload: true
|
||||||
|
# scope: user
|
||||||
|
# become: true
|
||||||
|
# become_user: "{{ podman_user }}"
|
||||||
|
# loop: "{{ podman_quadlets_undefined }}"
|
||||||
|
# loop_control:
|
||||||
|
# label: "{{ unit }}"
|
||||||
|
# vars:
|
||||||
|
# unit: >-
|
||||||
|
# {{
|
||||||
|
# item | ansible.builtin.basename |
|
||||||
|
# ansible.builtin.regex_replace('\.container$', '.service') |
|
||||||
|
# ansible.builtin.regex_replace('\.network$', '-network.service') |
|
||||||
|
# ansible.builtin.regex_replace('\.volume$', '-volume.service')
|
||||||
|
# }}
|
||||||
|
#
|
||||||
|
#- name: Remove undefined quadlets
|
||||||
|
# ansible.builtin.file:
|
||||||
|
# path: "{{ podman_user_homedir }}/.config/containers/systemd/{{ item }}"
|
||||||
|
# state: absent
|
||||||
|
# become: true
|
||||||
|
# loop: "{{ podman_quadlets_undefined }}"
|
||||||
|
|
||||||
|
- name: Deploy quadlets
|
||||||
|
ansible.builtin.template:
|
||||||
|
src: "{{ item.template | default(item) }}.j2"
|
||||||
|
dest: "{{ podman_user_homedir }}/.config/containers/systemd/{{ item.filename | default(item) | ansible.builtin.basename }}"
|
||||||
|
owner: "{{ podman_user }}"
|
||||||
|
group: "{{ podman_user }}"
|
||||||
|
mode: u=rw,g=r,o=
|
||||||
|
become: true
|
||||||
|
loop: "{{ podman_quadlets }}"
|
||||||
|
loop_control:
|
||||||
|
label: "{{ item.filename | default(item) }}"
|
||||||
|
register: deployed_quadlets
|
||||||
|
notify: Start or restart quadlets
|
||||||
|
|
||||||
|
- name: Flush handlers
|
||||||
|
ansible.builtin.meta: flush_handlers
|
||||||
22
tasks/prepare.yml
Normal file
22
tasks/prepare.yml
Normal file
@@ -0,0 +1,22 @@
|
|||||||
|
---
|
||||||
|
# tasks file for podman
|
||||||
|
|
||||||
|
- name: Install packages
|
||||||
|
ansible.builtin.dnf:
|
||||||
|
name: "{{ podman_packages }}"
|
||||||
|
become: true
|
||||||
|
|
||||||
|
- name: Create dedicated group
|
||||||
|
ansible.builtin.group:
|
||||||
|
name: "{{ podman_user }}"
|
||||||
|
become: true
|
||||||
|
|
||||||
|
- name: Create dedicated user
|
||||||
|
ansible.builtin.user:
|
||||||
|
name: "{{ podman_user }}"
|
||||||
|
comment: Dedicated Podman user
|
||||||
|
home: "{{ podman_user_homedir }}"
|
||||||
|
password_lock: true
|
||||||
|
shell: /bin/bash
|
||||||
|
group: podman
|
||||||
|
become: true
|
||||||
@@ -1,38 +0,0 @@
|
|||||||
# {{ ansible_managed }}
|
|
||||||
|
|
||||||
[Unit]
|
|
||||||
Description=Podman container: {{ container.name }}
|
|
||||||
{% for option, value in container.get('unit_extras', {}).items() %}
|
|
||||||
{{ option }}={{ value }}
|
|
||||||
{% endfor %}
|
|
||||||
|
|
||||||
[Container]
|
|
||||||
HostName={{ inventory_hostname }}
|
|
||||||
|
|
||||||
Image={{ container.image }}
|
|
||||||
ContainerName={{ container.name }}
|
|
||||||
|
|
||||||
{% if container.get('userns', '') | length > 0 %}
|
|
||||||
UserNS={{ container.userns }}
|
|
||||||
{% endif %}
|
|
||||||
|
|
||||||
AutoUpdate=registry
|
|
||||||
|
|
||||||
{% for volume in container.get('volumes', []) %}
|
|
||||||
Volume={{ volume }}
|
|
||||||
{% endfor %}
|
|
||||||
|
|
||||||
{% for port in container.get('ports', []) %}
|
|
||||||
PublishPort={{ port }}
|
|
||||||
{% endfor %}
|
|
||||||
|
|
||||||
{% for environment in container.get('environment_vars', []) %}
|
|
||||||
Environment={{ environment }}
|
|
||||||
{% endfor %}
|
|
||||||
|
|
||||||
[Service]
|
|
||||||
Restart=on-failure
|
|
||||||
TimeoutStartSec=900
|
|
||||||
|
|
||||||
[Install]
|
|
||||||
WantedBy=default.target
|
|
||||||
Reference in New Issue
Block a user