diff --git a/roles/container/defaults/main.yaml b/roles/container/defaults/main.yaml index 3cd899f..f8d38b4 100644 --- a/roles/container/defaults/main.yaml +++ b/roles/container/defaults/main.yaml @@ -4,6 +4,7 @@ container_user: "" container_mounts: [] container_publish_ports: [] container_networks: [] +container_ip: "" container_secrets: [] container_env: {} container_auto_start: true diff --git a/roles/container/meta/argument_specs.yaml b/roles/container/meta/argument_specs.yaml index 34f1bab..2c6b95d 100644 --- a/roles/container/meta/argument_specs.yaml +++ b/roles/container/meta/argument_specs.yaml @@ -115,6 +115,11 @@ argument_specs: required: false default: [] elements: str + container_ip: + description: IPv4 address for the container in the first network defined in container_networks + type: str + required: false + default: "" container_secrets: description: A list of secrets available to the container as file or environment variable type: list diff --git a/roles/container/tasks/main.yaml b/roles/container/tasks/main.yaml index 50dc51f..051f5eb 100644 --- a/roles/container/tasks/main.yaml +++ b/roles/container/tasks/main.yaml @@ -15,10 +15,16 @@ name: network vars: network_name: "{{ network }}" + network_subnet: >- + {{ + container_ip | ansible.utils.ipsubnet(24) + if (container_ip | length > 0 and network_index == 0) else '' + }} when: network_created_networks is not defined or network not in network_created_networks loop: "{{ container_networks }}" loop_control: loop_var: network + index_var: network_index - name: Create volumes for container {{ container_name }} ansible.builtin.include_role: @@ -45,7 +51,7 @@ command: "{{ container_command or omit }}" user: "{{ container_user or omit }}" mount: "{{ _container_mounts | map('items') | map('map', 'join', '=') | map('join', ',') }}" - network: "{{ container_networks | map('regex_replace', '$', '.network') }}" + network: "{{ _container_networks_with_ip }}" publish: "{{ container_publish_ports }}" secrets: "{{ _container_secrets }}" env: "{{ container_env }}" diff --git a/roles/container/vars/main.yaml b/roles/container/vars/main.yaml index eade86e..d36b4b9 100644 --- a/roles/container/vars/main.yaml +++ b/roles/container/vars/main.yaml @@ -1,6 +1,17 @@ --- _container_image: "{{ container_image | replace('/', '_') ~ '.image' }}" +_container_networks: "{{ container_networks | map('regex_replace', '$', '.network') }}" +_container_networks_with_ip: >- + {{ + [ + _container_networks[0] ~ ( + ':ip=' ~ container_ip if container_ip | length > 0 else '' + ) + ] + + _container_networks[1:] + }} + _container_volumes: "{{ container_mounts | selectattr('type', '==', 'volume') }}" _container_mount_sources: "{{ container_mounts | map(attribute='source') }}"