volume: Support device-based volumes
Also support those options in container and service roles
This commit is contained in:
@@ -48,7 +48,7 @@ argument_specs:
|
|||||||
elements: dict
|
elements: dict
|
||||||
options:
|
options:
|
||||||
type:
|
type:
|
||||||
description: Type of volume
|
description: Type of mount
|
||||||
type: str
|
type: str
|
||||||
required: true
|
required: true
|
||||||
choices:
|
choices:
|
||||||
@@ -80,6 +80,28 @@ argument_specs:
|
|||||||
type: str
|
type: str
|
||||||
required: false
|
required: false
|
||||||
default: ""
|
default: ""
|
||||||
|
volume_device:
|
||||||
|
description: >-
|
||||||
|
The path of a device which is mounted for the volume.
|
||||||
|
Only applicable if mount type is volume.
|
||||||
|
type: str
|
||||||
|
required: false
|
||||||
|
default: ""
|
||||||
|
volume_type:
|
||||||
|
description: >-
|
||||||
|
The filesystem type of device as used by the mount commands -t option
|
||||||
|
Only applicable if mount type is volume.
|
||||||
|
type: str
|
||||||
|
required: false
|
||||||
|
default: ""
|
||||||
|
volume_mount_options:
|
||||||
|
description: >-
|
||||||
|
The mount options to use for a filesystem as used by the mount command -o option
|
||||||
|
Only applicable if mount type is volume.
|
||||||
|
type: list
|
||||||
|
elements: str
|
||||||
|
required: false
|
||||||
|
default: []
|
||||||
|
|
||||||
container_publish_ports:
|
container_publish_ports:
|
||||||
description: "A list of published ports in docker format (<host listen address>:<host port>:<container port>)"
|
description: "A list of published ports in docker format (<host listen address>:<host port>:<container port>)"
|
||||||
|
|||||||
@@ -27,6 +27,9 @@
|
|||||||
volume_name: "{{ volume.source }}"
|
volume_name: "{{ volume.source }}"
|
||||||
volume_uid: "{{ volume.user | default('') }}"
|
volume_uid: "{{ volume.user | default('') }}"
|
||||||
volume_gid: "{{ volume.group | default('') }}"
|
volume_gid: "{{ volume.group | default('') }}"
|
||||||
|
volume_type: "{{ volume.volume_type | default('') }}"
|
||||||
|
volume_device: "{{ volume.volume_device | default('') }}"
|
||||||
|
volume_mount_options: "{{ volume.volume_mount_options | default([]) }}"
|
||||||
loop: "{{ _container_volumes }}"
|
loop: "{{ _container_volumes }}"
|
||||||
loop_control:
|
loop_control:
|
||||||
loop_var: volume
|
loop_var: volume
|
||||||
|
|||||||
@@ -18,7 +18,7 @@ _container_mounts: >-
|
|||||||
{{
|
{{
|
||||||
container_mounts | selectattr('type', '!=', 'volume') +
|
container_mounts | selectattr('type', '!=', 'volume') +
|
||||||
container_mounts | selectattr('type', '==', 'volume')
|
container_mounts | selectattr('type', '==', 'volume')
|
||||||
| community.general.remove_keys(['user', 'group'])
|
| community.general.keep_keys(['type', 'source', 'destination', 'readonly'])
|
||||||
| zip(_container_volume_mount_sources) | map('combine')
|
| zip(_container_volume_mount_sources) | map('combine')
|
||||||
}}
|
}}
|
||||||
|
|
||||||
|
|||||||
@@ -77,7 +77,7 @@ argument_specs:
|
|||||||
elements: dict
|
elements: dict
|
||||||
options:
|
options:
|
||||||
type:
|
type:
|
||||||
description: Type of volume
|
description: Type of mount
|
||||||
type: str
|
type: str
|
||||||
required: true
|
required: true
|
||||||
choices:
|
choices:
|
||||||
@@ -112,6 +112,28 @@ argument_specs:
|
|||||||
type: str
|
type: str
|
||||||
required: false
|
required: false
|
||||||
default: ""
|
default: ""
|
||||||
|
volume_device:
|
||||||
|
description: >-
|
||||||
|
The path of a device which is mounted for the volume.
|
||||||
|
Only applicable if mount type is volume.
|
||||||
|
type: str
|
||||||
|
required: false
|
||||||
|
default: ""
|
||||||
|
volume_type:
|
||||||
|
description: >-
|
||||||
|
The filesystem type of device as used by the mount commands -t option
|
||||||
|
Only applicable if mount type is volume.
|
||||||
|
type: str
|
||||||
|
required: false
|
||||||
|
default: ""
|
||||||
|
volume_mount_options:
|
||||||
|
description: >-
|
||||||
|
The mount options to use for a filesystem as used by the mount command -o option
|
||||||
|
Only applicable if mount type is volume.
|
||||||
|
type: list
|
||||||
|
elements: str
|
||||||
|
required: false
|
||||||
|
default: []
|
||||||
service_container_secrets:
|
service_container_secrets:
|
||||||
description:
|
description:
|
||||||
- >
|
- >
|
||||||
@@ -249,7 +271,7 @@ argument_specs:
|
|||||||
elements: dict
|
elements: dict
|
||||||
options:
|
options:
|
||||||
type:
|
type:
|
||||||
description: Type of volume
|
description: Type of mount
|
||||||
type: str
|
type: str
|
||||||
required: true
|
required: true
|
||||||
choices:
|
choices:
|
||||||
@@ -274,6 +296,28 @@ argument_specs:
|
|||||||
- Defaults to false for volume and bind, true for template
|
- Defaults to false for volume and bind, true for template
|
||||||
type: bool
|
type: bool
|
||||||
required: false
|
required: false
|
||||||
|
volume_device:
|
||||||
|
description: >-
|
||||||
|
The path of a device which is mounted for the volume.
|
||||||
|
Only applicable if mount type is volume.
|
||||||
|
type: str
|
||||||
|
required: false
|
||||||
|
default: ""
|
||||||
|
volume_type:
|
||||||
|
description: >-
|
||||||
|
The filesystem type of device as used by the mount commands -t option
|
||||||
|
Only applicable if mount type is volume.
|
||||||
|
type: str
|
||||||
|
required: false
|
||||||
|
default: ""
|
||||||
|
volume_mount_options:
|
||||||
|
description: >-
|
||||||
|
The mount options to use for a filesystem as used by the mount command -o option
|
||||||
|
Only applicable if mount type is volume.
|
||||||
|
type: list
|
||||||
|
elements: str
|
||||||
|
required: false
|
||||||
|
default: []
|
||||||
publish_ports:
|
publish_ports:
|
||||||
description: "A list of published ports in docker format (<host listen address>:<host port>:<container port>)"
|
description: "A list of published ports in docker format (<host listen address>:<host port>:<container port>)"
|
||||||
type: list
|
type: list
|
||||||
|
|||||||
@@ -1,3 +1,6 @@
|
|||||||
---
|
---
|
||||||
volume_uid: ""
|
volume_uid: ""
|
||||||
volume_gid: ""
|
volume_gid: ""
|
||||||
|
volume_type: ""
|
||||||
|
volume_device: ""
|
||||||
|
volume_mount_options: []
|
||||||
|
|||||||
7
roles/volume/handlers/main.yaml
Normal file
7
roles/volume/handlers/main.yaml
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
---
|
||||||
|
- name: "Restart volume service {{ volume_name }}"
|
||||||
|
ansible.builtin.systemd_service:
|
||||||
|
name: "{{ volume_name }}-volume.service"
|
||||||
|
state: restarted
|
||||||
|
daemon_reload: true
|
||||||
|
ignore_errors: '{{ ansible_check_mode }}'
|
||||||
@@ -17,3 +17,19 @@ argument_specs:
|
|||||||
type: str
|
type: str
|
||||||
required: false
|
required: false
|
||||||
default: ""
|
default: ""
|
||||||
|
volume_device:
|
||||||
|
description: The path of a device which is mounted for the volume.
|
||||||
|
type: str
|
||||||
|
required: false
|
||||||
|
default: ""
|
||||||
|
volume_type:
|
||||||
|
description: The filesystem type of device as used by the mount commands -t option
|
||||||
|
type: str
|
||||||
|
required: false
|
||||||
|
default: ""
|
||||||
|
volume_mount_options:
|
||||||
|
description: The mount options to use for a filesystem as used by the mount command -o option
|
||||||
|
type: list
|
||||||
|
elements: str
|
||||||
|
required: false
|
||||||
|
default: []
|
||||||
|
|||||||
@@ -5,7 +5,8 @@
|
|||||||
- name: Create container volume service {{ volume_name }}
|
- name: Create container volume service {{ volume_name }}
|
||||||
containers.podman.podman_volume:
|
containers.podman.podman_volume:
|
||||||
name: "{{ volume_name }}"
|
name: "{{ volume_name }}"
|
||||||
options: "{{ volume_options }}"
|
options: "{{ _volume_options }}"
|
||||||
state: quadlet
|
state: quadlet
|
||||||
quadlet_file_mode: "0644"
|
quadlet_file_mode: "0644"
|
||||||
notify: Reload systemd daemon
|
quadlet_options: "{{ _volume_quadlet_options }}"
|
||||||
|
notify: Restart volume service {{ volume_name }}
|
||||||
|
|||||||
@@ -1,6 +1,24 @@
|
|||||||
---
|
---
|
||||||
volume_mount_options_incl_empty:
|
_volume_mount_options_incl_empty:
|
||||||
- "{{ 'uid=' ~ volume_uid if volume_uid | length > 0 else '' }}"
|
- "{{ 'uid=' ~ volume_uid if volume_uid | length > 0 else '' }}"
|
||||||
- "{{ 'gid=' ~ volume_gid if volume_gid | length > 0 else '' }}"
|
- "{{ 'gid=' ~ volume_gid if volume_gid | length > 0 else '' }}"
|
||||||
volume_mount_options: "{{ volume_mount_options_incl_empty | select('!=', '') | list }}"
|
_volume_mount_options: >-
|
||||||
volume_options: "{{ ['o=' ~ volume_mount_options | join(',')] if volume_mount_options | length > 0 else [] }}"
|
{{
|
||||||
|
_volume_mount_options_incl_empty
|
||||||
|
| select('!=', '')
|
||||||
|
+ volume_mount_options
|
||||||
|
}}
|
||||||
|
_volume_options: >-
|
||||||
|
{{
|
||||||
|
(['o=' ~ _volume_mount_options | join(',')] if _volume_mount_options | length > 0 else [])
|
||||||
|
+ (['type=' ~ volume_type] if volume_type | length > 0 else [])
|
||||||
|
+ (['device=' ~ volume_device] if volume_device | length > 0 else [])
|
||||||
|
}}
|
||||||
|
|
||||||
|
_volume_device_quadlet_options: |
|
||||||
|
[Service]
|
||||||
|
ExecStartPost=/usr/bin/podman volume mount {{ volume_name }}
|
||||||
|
ExecStop=/usr/bin/podman volume unmount {{ volume_name }}
|
||||||
|
ExecStop=/usr/bin/podman volume rm {{ volume_name }}
|
||||||
|
_volume_quadlet_options: >-
|
||||||
|
{{ [_volume_device_quadlet_options] if volume_device | length > 0 else [] }}
|
||||||
|
|||||||
Reference in New Issue
Block a user