|
4 | 4 | connection: local
|
5 | 5 | gather_facts: false
|
6 | 6 | no_log: "{{ molecule_no_log }}"
|
7 |
| - vars: |
8 |
| - molecule_labels: |
9 |
| - owner: molecule |
10 | 7 | tasks:
|
11 | 8 | - name: Apply global default parameters
|
12 | 9 | set_fact:
|
|
30 | 27 | - item.registry.credentials is defined
|
31 | 28 | - item.registry.credentials.username is defined
|
32 | 29 |
|
33 |
| - - name: Check presence of custom Dockerfiles |
34 |
| - stat: |
35 |
| - path: "{{ molecule_scenario_directory + '/' + (item.dockerfile | default( 'Dockerfile.j2')) }}" |
36 |
| - loop: "{{ final_platforms }}" |
37 |
| - register: dockerfile_stats |
38 |
| - |
39 | 30 | - name: Create Dockerfiles from image names
|
40 |
| - vars: |
41 |
| - # TODO(ssbarnea): expose module dir so it can also be used by plugins |
42 |
| - molecule_module_directory: "{{ playbook_dir + '/../../../..' }}" |
43 | 31 | template:
|
44 |
| - src: >- |
45 |
| - {%- if dockerfile_stats.results[i].stat.exists -%} |
46 |
| - {{ molecule_scenario_directory + '/' + (item.dockerfile | default( 'Dockerfile.j2')) }} |
47 |
| - {%- else -%} |
48 |
| - {{ molecule_module_directory + '/data/Dockerfile.j2' }} |
49 |
| - {%- endif -%} |
| 32 | + src: "{{ item.dockerfile | default('Dockerfile.j2') }}" |
50 | 33 | dest: "{{ molecule_ephemeral_directory }}/Dockerfile_{{ item.image | regex_replace('[^a-zA-Z0-9_]', '_') }}"
|
51 |
| - loop: "{{ final_platforms }}" |
52 |
| - loop_control: |
53 |
| - index_var: i |
| 34 | + with_items: "{{ final_platforms }}" |
54 | 35 | when: not item.pre_build_image | default(false)
|
55 | 36 | register: platforms
|
| 37 | + no_log: item.failed |
56 | 38 |
|
57 | 39 | - name: Discover local Docker images
|
58 | 40 | docker_image_info:
|
|
63 | 45 | key_path: "{{ item.key_path | default((lookup('env', 'DOCKER_CERT_PATH') + '/key.pem') if lookup('env', 'DOCKER_CERT_PATH') else omit) }}"
|
64 | 46 | tls_verify: "{{ item.tls_verify | default(lookup('env', 'DOCKER_TLS_VERIFY')) or false }}"
|
65 | 47 | with_items: "{{ platforms.results }}"
|
66 |
| - when: |
67 |
| - - not item.pre_build_image | default(false) |
| 48 | + when: not item.pre_build_image | default(false) |
68 | 49 | register: docker_images
|
69 | 50 |
|
70 |
| - - name: Build an Ansible compatible image (new) |
| 51 | + - name: Build an Ansible compatible image |
71 | 52 | when:
|
72 | 53 | - platforms.changed or docker_images.results | map(attribute='images') | select('equalto', []) | list | count >= 0
|
73 | 54 | - not item.item.pre_build_image | default(false)
|
|
76 | 57 | path: "{{ molecule_ephemeral_directory }}"
|
77 | 58 | dockerfile: "{{ item.invocation.module_args.dest }}"
|
78 | 59 | pull: "{{ item.item.pull | default(true) }}"
|
79 |
| - network: "{{ item.item.network_mode | default(omit) }}" |
80 |
| - args: "{{ item.item.buildargs | default(omit) }}" |
81 | 60 | name: "molecule_local/{{ item.item.image }}"
|
82 | 61 | docker_host: "{{ item.item.docker_host | default(lookup('env', 'DOCKER_HOST') or 'unix://var/run/docker.sock') }}"
|
83 | 62 | cacert_path: "{{ item.cacert_path | default((lookup('env', 'DOCKER_CERT_PATH') + '/ca.pem') if lookup('env', 'DOCKER_CERT_PATH') else omit) }}"
|
|
86 | 65 | tls_verify: "{{ item.tls_verify | default(lookup('env', 'DOCKER_TLS_VERIFY')) or false }}"
|
87 | 66 | force_source: "{{ item.item.force | default(true) }}"
|
88 | 67 | source: build
|
| 68 | + buildargs: "{{ item.item.buildargs | default(omit) }}" |
89 | 69 | with_items: "{{ platforms.results }}"
|
90 | 70 | loop_control:
|
91 | 71 | label: "molecule_local/{{ item.item.image }}"
|
|
96 | 76 | delay: 30
|
97 | 77 |
|
98 | 78 | - name: Create docker network(s)
|
99 |
| - docker_network: |
100 |
| - name: "{{ item }}" |
101 |
| - docker_host: "{{ item.docker_host | default(lookup('env', 'DOCKER_HOST') or 'unix://var/run/docker.sock') }}" |
102 |
| - cacert_path: "{{ item.cacert_path | default((lookup('env', 'DOCKER_CERT_PATH') + '/ca.pem') if lookup('env', 'DOCKER_CERT_PATH') else omit) }}" |
103 |
| - cert_path: "{{ item.cert_path | default((lookup('env', 'DOCKER_CERT_PATH') + '/cert.pem') if lookup('env', 'DOCKER_CERT_PATH') else omit) }}" |
104 |
| - key_path: "{{ item.key_path | default((lookup('env', 'DOCKER_CERT_PATH') + '/key.pem') if lookup('env', 'DOCKER_CERT_PATH') else omit) }}" |
105 |
| - tls_verify: "{{ item.tls_verify | default(lookup('env', 'DOCKER_TLS_VERIFY')) or false }}" |
106 |
| - labels: "{{ molecule_labels | combine(item.labels | default({})) }}" |
107 |
| - state: present |
108 |
| - # Duck: we need IPv6 |
109 |
| - enable_ipv6: True |
110 |
| - ipam_config: |
111 |
| - # RFC 4193 |
112 |
| - - subnet: fdd1:0:0:0::/64 |
113 |
| - with_items: "{{ final_platforms | molecule_get_docker_networks }}" |
114 |
| - loop_control: |
115 |
| - label: "{{ item }}" |
116 |
| - no_log: false |
| 79 | + action: docker_network |
| 80 | + args: "{{ docker_network_defaults | default({}) | union(item) }}" |
| 81 | + with_items: "{{ final_platforms | molecule_get_docker_networks('present') }}" |
117 | 82 |
|
118 | 83 | - name: Determine the CMD directives
|
119 | 84 | set_fact:
|
|
132 | 97 | cert_path: "{{ item.cert_path | default((lookup('env', 'DOCKER_CERT_PATH') + '/cert.pem') if lookup('env', 'DOCKER_CERT_PATH') else omit) }}"
|
133 | 98 | key_path: "{{ item.key_path | default((lookup('env', 'DOCKER_CERT_PATH') + '/key.pem') if lookup('env', 'DOCKER_CERT_PATH') else omit) }}"
|
134 | 99 | tls_verify: "{{ item.tls_verify | default(lookup('env', 'DOCKER_TLS_VERIFY')) or false }}"
|
135 |
| - hostname: "{{ item.hostname | default(item.name) | replace('@NAME@', item.name) }}" |
| 100 | + hostname: "{{ item.hostname | default(item.name) }}" |
136 | 101 | image: "{{ item.pre_build_image | default(false) | ternary('', 'molecule_local/') }}{{ item.image }}"
|
137 |
| - pull: "{{ item.pull | default(omit) }}" |
| 102 | + pull: "{{ item.pull | default (omit) }}" |
138 | 103 | memory: "{{ item.memory | default(omit) }}"
|
| 104 | + memory_swap: "{{ item.memory_swap | default(omit) }}" |
139 | 105 | state: started
|
140 | 106 | recreate: false
|
141 | 107 | log_driver: json-file
|
142 |
| - command: "{{ (command_directives_dict | default({}))[item.name] | default(omit) }}" |
143 | 108 | user: "{{ item.user | default(omit) }}"
|
| 109 | + command: "{{ (command_directives_dict | default({}))[item.name] | default(omit) }}" |
144 | 110 | pid_mode: "{{ item.pid_mode | default(omit) }}"
|
145 | 111 | privileged: "{{ item.privileged | default(omit) }}"
|
146 | 112 | security_opts: "{{ item.security_opts | default(omit) }}"
|
147 |
| - devices: "{{ item.devices | default(omit) }}" |
148 | 113 | volumes: "{{ item.volumes | default(omit) }}"
|
149 | 114 | tmpfs: "{{ item.tmpfs | default(omit) }}"
|
150 | 115 | capabilities: "{{ item.capabilities | default(omit) }}"
|
151 |
| - sysctls: "{{ item.sysctls | default(omit) }}" |
152 | 116 | exposed_ports: "{{ item.exposed_ports | default(omit) }}"
|
153 | 117 | published_ports: "{{ item.published_ports | default(omit) }}"
|
154 | 118 | ulimits: "{{ item.ulimits | default(omit) }}"
|
155 | 119 | networks: "{{ item.networks | default(omit) }}"
|
156 |
| - network_mode: "{{ item.network_mode | default(omit) }}" |
157 | 120 | networks_cli_compatible: "{{ item.networks_cli_compatible | default(true) }}"
|
| 121 | + network_mode: "{{ item.network_mode | default(omit) }}" |
158 | 122 | purge_networks: "{{ item.purge_networks | default(omit) }}"
|
159 | 123 | dns_servers: "{{ item.dns_servers | default(omit) }}"
|
160 | 124 | etc_hosts: "{{ item.etc_hosts | default(omit) }}"
|
161 | 125 | env: "{{ item.env | default(omit) }}"
|
162 | 126 | restart_policy: "{{ item.restart_policy | default(omit) }}"
|
163 | 127 | restart_retries: "{{ item.restart_retries | default(omit) }}"
|
164 |
| - tty: "{{ item.tty | default(omit) }}" |
165 |
| - labels: "{{ molecule_labels | combine(item.labels | default({})) }}" |
166 | 128 | container_default_behavior: "{{ item.container_default_behavior | default('compatibility' if ansible_version.full is version_compare('2.10', '>=') else omit) }}"
|
167 |
| - # Duck: missing parameters |
168 |
| - dns_search_domains: "{{ item.dns_search_domains | default(omit) }}" |
169 | 129 | register: server
|
170 | 130 | with_items: "{{ final_platforms }}"
|
171 |
| - loop_control: |
172 |
| - label: "{{ item.name }}" |
173 |
| - no_log: false |
174 | 131 | async: 7200
|
175 | 132 | poll: 0
|
176 | 133 |
|
|
181 | 138 | until: docker_jobs.finished
|
182 | 139 | retries: 300
|
183 | 140 | with_items: "{{ server.results }}"
|
| 141 | + no_log: item.failed |
0 commit comments