|
8 | 8 | vars:
|
9 | 9 | podman_exec: "{{ lookup('env','MOLECULE_PODMAN_EXECUTABLE')|default('podman',true) }}"
|
10 | 10 | tasks:
|
| 11 | + - name: Get podman executable path # noqa: command-instead-of-shell |
| 12 | + ansible.builtin.shell: "command -v {{ podman_exec }}" |
| 13 | + register: _podman_path |
| 14 | + changed_when: false |
| 15 | + |
| 16 | + - name: Register podman executable path |
| 17 | + ansible.builtin.set_fact: |
| 18 | + podman_cmd: "{{ _podman_path.stdout }}" |
| 19 | + |
11 | 20 | - name: Log into a container registry
|
12 |
| - containers.podman.podman_login: |
13 |
| - certdir: >- |
14 |
| - {% if lookup('env', 'DOCKER_CERT_PATH') %} |
15 |
| - {{ item.cert_path | default(lookup('env', 'DOCKER_CERT_PATH') + '/cert.pem') }} |
16 |
| - {% endif %} |
17 |
| - executable: "{{ podman_exec }}" |
18 |
| - username: "{{ item.registry.credentials.username }}" |
19 |
| - password: "{{ item.registry.credentials.password }}" |
20 |
| - registry: "{{ item.registry.url }}" |
21 |
| - tlsverify: "{{ item.registry.tls_verify | default(lookup('env', 'DOCKER_TLS_VERIFY')) or false }}" |
22 |
| - loop: "{{ molecule_yml.platforms }}" |
| 21 | + ansible.builtin.command: > |
| 22 | + {{ podman_cmd }} login |
| 23 | + --username {{ item.registry.credentials.username }} |
| 24 | + --password {{ item.registry.credentials.password }} |
| 25 | + --tls-verify={{ item.tls_verify | default(lookup('env', 'DOCKER_TLS_VERIFY')) or false }} |
| 26 | + {% if lookup('env', 'DOCKER_CERT_PATH') %} |
| 27 | + --cert-dir {{ item.cert_path | default(lookup('env', 'DOCKER_CERT_PATH') + '/cert.pem') }}{% endif %} |
| 28 | + {{ item.registry.url }} |
| 29 | + with_items: "{{ molecule_yml.platforms }}" |
23 | 30 | loop_control:
|
24 | 31 | label: >-
|
25 | 32 | "{{ item.name }} registry username:
|
|
70 | 77 | register: podman_images
|
71 | 78 |
|
72 | 79 | - name: Build an Ansible compatible image # noqa: no-handler
|
73 |
| - containers.podman.podman_image: |
74 |
| - build: |
75 |
| - extra_args: >- |
76 |
| - {% if item.item.buildargs is defined %}{% for i, k in item.item.buildargs.items() %}--build-arg={{ i }}={{ k }}{% endfor %}{% endif %} |
77 |
| - {% if item.item.pull is defined %}--pull={{ item.item.pull }}{% endif %} |
78 |
| - file: "{{ item.dest }}" |
79 |
| - name: "molecule_local/{{ item.item.image }}" |
80 |
| - path: "{{ molecule_scenario_directory }}" |
81 |
| - pull: "{{ item.item.pull | default(omit) }}" |
82 |
| - loop: "{{ platforms.results }}" |
| 80 | + ansible.builtin.command: > |
| 81 | + {{ podman_cmd }} build |
| 82 | + -f {{ item.dest }} |
| 83 | + -t molecule_local/{{ item.item.image }} |
| 84 | + {% if item.item.buildargs is defined %}{% for i, k in item.item.buildargs.items() %}--build-arg={{ i }}={{ k }}{% endfor %}{% endif %} |
| 85 | + {% if item.item.pull is defined %}--pull={{ item.item.pull }}{% endif %} |
| 86 | + {{ molecule_scenario_directory + '/' + (item.item.dockerfile | default('Dockerfile.j2')) | dirname }} |
| 87 | + with_items: "{{ platforms.results }}" |
83 | 88 | loop_control:
|
84 | 89 | label: "{{ item.item.image | default('None specified') }}"
|
85 | 90 | when:
|
|
96 | 101 | ansible.builtin.set_fact:
|
97 | 102 | command_directives_dict: >-
|
98 | 103 | {{ command_directives_dict | default({}) |
|
99 |
| - combine({item.name: item.command | default(["bash", "-c", "while true; do sleep 10000; done"])}) |
| 104 | + combine({ item.name: item.command | default('bash -c "while true; do sleep 10000; done"') }) |
100 | 105 | }}
|
101 | 106 | with_items: "{{ molecule_yml.platforms }}"
|
102 | 107 | loop_control:
|
|
105 | 110 | {{ item.command | default('None specified') }}"
|
106 | 111 | when: item.override_command | default(true)
|
107 | 112 |
|
| 113 | + # https://github.com/ansible-community/molecule-podman/issues/22 |
| 114 | + - name: Remove possible pre-existing containers |
| 115 | + ansible.builtin.command: > |
| 116 | + {{ podman_cmd }} rm -f -i -v {% for key in molecule_yml.platforms %}{{ key.name }} {% endfor %} |
| 117 | + register: result |
| 118 | + changed_when: true |
| 119 | + failed_when: false |
| 120 | + |
108 | 121 | - name: Discover local podman networks
|
109 | 122 | containers.podman.podman_network_info:
|
110 | 123 | name: "{{ item.network }}"
|
|
132 | 145 | - "podman_network.results[0].ansible_loop.allitems[0].network not in ['bridge', 'none', 'host', 'ns', 'private', 'slirp4netns']"
|
133 | 146 |
|
134 | 147 | - name: Create molecule instance(s)
|
135 |
| - containers.podman.podman_container: |
136 |
| - name: "{{ item.name }}" |
137 |
| - cap_add: "{{ item.capabilities | default(omit) }}" |
138 |
| - # it's necessary to exclude empty args as ansible modules run_command method doesn't handle this well |
139 |
| - cmd_args: "{{ molecule_podman_args | reject('equalto', '') | list + item.extra_opts | default([]) }}" |
140 |
| - command: "{{ (command_directives_dict | default({}))[item.name] | default('') }}" |
141 |
| - detach: "{{ item.detach | default(omit) }}" |
142 |
| - device: "{{ item.devices | default(omit) }}" |
143 |
| - dns: "{{ item.dns_servers | default(omit) }}" |
144 |
| - env: "{{ item.env | default(omit) }}" |
145 |
| - etc_hosts: "{{ item.etc_hosts | default(omit) }}" |
146 |
| - executable: "{{ podman_exec }}" |
147 |
| - expose: "{{ item.exposed_ports | default(omit) }}" |
148 |
| - hostname: "{{ item.hostname | default(omit) }}" |
149 |
| - image: "{{ item.pre_build_image | default(false) | ternary('', 'molecule_local/') }}{{ item.image }}" |
150 |
| - ip: "{{ item.ip | default(omit) }}" |
151 |
| - network: "{{ item.network | default(omit) }}" |
152 |
| - pid: "{{ item.pid_mode | default(omit) }}" |
153 |
| - privileged: "{{ item.privileged | default(omit) }}" |
154 |
| - publish: "{{ item.published_ports | default(omit) }}" |
155 |
| - security_opt: "{{ item.security_opts | default(omit) }}" |
156 |
| - systemd: "{{ item.systemd | default(omit) }}" |
157 |
| - tmpfs: "{{ item.tmpfs | default(omit) }}" |
158 |
| - tty: "{{ item.tty | default(omit) }}" |
159 |
| - ulimits: "{{ item.ulimits | default(omit) }}" |
160 |
| - volume: "{{ item.volumes | default(omit) }}" |
161 |
| - state: started |
| 148 | + ansible.builtin.command: > |
| 149 | + {{ podman_cmd }} |
| 150 | + {% if item.cgroup_manager is defined %}--cgroup-manager={{ item.cgroup_manager }}{% endif %} |
| 151 | + {% if item.storage_opt is defined %}--storage-opt={{ item.storage_opt }}{% endif %} |
| 152 | + {% if item.storage_driver is defined %}--storage-driver={{ item.storage_driver }}{% endif %} |
| 153 | + run |
| 154 | + -d |
| 155 | + --name "{{ item.name }}" |
| 156 | + {% if item.pid_mode is defined %}--pid={{ item.pid_mode }}{% endif %} |
| 157 | + {% if item.privileged is defined %}--privileged={{ item.privileged }}{% endif %} |
| 158 | + {% if item.detach is defined %}--detach{% endif %} |
| 159 | + {% if item.security_opts is defined %}{% for i in item.security_opts %}--security-opt {{ i }} {% endfor %}{% endif %} |
| 160 | + {% if item.devices is defined %}{% for i in item.devices %}--device {{ i }} {% endfor %}{% endif %} |
| 161 | + {% if item.volumes is defined %}{% for i in item.volumes %}--volume {{ i }} {% endfor %}{% endif %} |
| 162 | + {% if item.tmpfs is defined %}{% for i in item.tmpfs %}--tmpfs={{ i }} {% endfor %}{% endif %} |
| 163 | + {% if item.capabilities is defined %}{% for i in item.capabilities %}--cap-add={{ i }} {% endfor %}{% endif %} |
| 164 | + {% if item.exposed_ports is defined %}--expose="{{ item.exposed_ports | join(',') }}"{% endif %} |
| 165 | + {% if item.published_ports is defined %}{% for i in item.published_ports %}--publish={{ i }} {% endfor %}{% endif %} |
| 166 | + {% if item.ulimits is defined %}{% for i in item.ulimits %}--ulimit={{ i }} {% endfor %}{% endif %} |
| 167 | + {% if item.dns_servers is defined %}--dns="{{ item.dns_servers | join(',') }}"{% endif %} |
| 168 | + {% if item.env is defined %}{% for i, k in item.env.items() %}--env={{ i }}={{ k }} {% endfor %}{% endif %} |
| 169 | + {% if item.restart_policy is defined %} |
| 170 | + --restart={{ item.restart_policy }}{% if item.restart_retries is defined %}:{{ item.restart_retries }}{% endif %}{% endif %} |
| 171 | + {% if item.tty is defined %}--tty={{ item.tty }}{% endif %} |
| 172 | + {% if item.network is defined %}--network={{ item.network }}{% endif %} |
| 173 | + {% if item.ip is defined %}--ip={{ item.ip }}{% endif %} |
| 174 | + {% if item.etc_hosts is defined %} |
| 175 | + {% for i, k in item.etc_hosts.items() %}{% if i != item.name %}--add-host {{ i }}:{{ k }} {% endif %}{% endfor %}{% endif %} |
| 176 | + {% if item.hostname is defined %}--hostname={{ item.hostname }}{% elif item.name is defined %}--hostname={{ item.name }}{% endif %} |
| 177 | + {% if item.systemd is defined %}--systemd={{ item.systemd | string | lower }}{% endif %} |
| 178 | + {{ item.extra_opts | default([]) | join(' ') }} |
| 179 | + {{ item.pre_build_image | default(false) | ternary('', 'molecule_local/') }}{{ item.image }} |
| 180 | + {{ (command_directives_dict | default({}))[item.name] | default('') }} |
162 | 181 | register: server
|
163 |
| - changed_when: false |
164 | 182 | with_items: "{{ molecule_yml.platforms }}"
|
165 | 183 | loop_control:
|
166 | 184 | label: "{{ item.name }}"
|
167 | 185 | async: 7200
|
168 | 186 | poll: 0
|
169 |
| - vars: |
170 |
| - molecule_podman_args: |
171 |
| - - "{% if item.cgroup_manager is defined %}--cgroup-manager={{ item.cgroup_manager }}{% endif %}" |
172 |
| - - >- |
173 |
| - {% if item.restart_policy is defined %} |
174 |
| - --restart={{ item.restart_policy }}{% if item.restart_retries is defined %}:{{ item.restart_retries }}{% endif %} |
175 |
| - {% endif %} |
176 |
| - - "{% if item.storage_opt is defined %}--storage-opt={{ item.storage_opt }}{% endif %}" |
177 |
| - - "{% if item.storage_driver is defined %}--storage-driver={{ item.storage_driver }}{% endif %}" |
| 187 | + changed_when: true |
178 | 188 |
|
179 | 189 | - name: Wait for instance(s) creation to complete
|
180 | 190 | become: "{{ not item.item.rootless | default(omit) }}"
|
|
0 commit comments