diff --git a/.ansible-lint b/.ansible-lint index 1b02634..7bee9ca 100644 --- a/.ansible-lint +++ b/.ansible-lint @@ -1,7 +1,11 @@ --- -parseable: true +exclude_paths: + - .github/ + skip_list: - meta-no-info # Not intended for galaxy, so that's ok if meta/main miss informations - var-naming[no-role-prefix] - yaml[quoted-strings] # There is a bug in this rule - jinja[spacing] # Sometime this is just more readable to not respect this + +offline: true diff --git a/README.md b/README.md index 36656be..d74522f 100644 --- a/README.md +++ b/README.md @@ -21,16 +21,16 @@ We can also provide you a 30-day trial license if you want to test the applicati ### Online - Ansible server: - - python >= 3.10 + - python >= 3.11 - must be able to contect through ssh to all the applicative servers - Applicative servers: - python >= 3.5 ### Offline - Ansible server: - - python >= 3.10 + - python >= 3.11 - python3-request - - ansible >= 11.4.0 + - ansible >= 12.3.0 - sshpass - must be able to contect through ssh to all the applicative servers diff --git a/inventory-upgrade.py b/inventory-upgrade.py index 1ca44f8..db2d27c 100755 --- a/inventory-upgrade.py +++ b/inventory-upgrade.py @@ -47,7 +47,7 @@ smtp_default_email: "{{ smtp_default_email if smtp_default_email }}" debug_mail_to: "{{ debug_mail_to if debug_mail_to }}" -{%- if docker_private_registry_login is defined and docker_private_registry_login | length %} +{%- if docker_private_registry_login is defined and (docker_private_registry_login | length > 0) %} # Docker registry docker_private_registry_login: {{ docker_private_registry_login }} diff --git a/requirements-dev.txt b/requirements-dev.txt index 429d92e..94e2a4b 100644 --- a/requirements-dev.txt +++ b/requirements-dev.txt @@ -1,3 +1,3 @@ -ansible==11.4.0 -yamllint==1.37.0 -ansible-lint==25.2.1 +ansible==12.3.0 +yamllint==1.38.0 +ansible-lint==26.6.0 diff --git a/requirements.txt b/requirements.txt index 4842ac4..72690a7 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1 +1 @@ -ansible==11.4.0 +ansible==12.3.0 diff --git a/roles/bimdata/templates/compose-app.yml.j2 b/roles/bimdata/templates/compose-app.yml.j2 index abafe8c..1be87b7 100644 --- a/roles/bimdata/templates/compose-app.yml.j2 +++ b/roles/bimdata/templates/compose-app.yml.j2 @@ -40,7 +40,7 @@ services: ports: - {{ external_port_http }}:80 - {{ external_port_https }}:443 -{% if nginx_custom_log_format is defined and nginx_custom_log_format | length %} +{% if nginx_custom_log_format is defined and (nginx_custom_log_format | length > 0) %} environment: - LOG_FORMAT={{ nginx_custom_log_format }} {% endif %} @@ -179,10 +179,10 @@ services: - IAM_URL={{ urls['iam'] }} - IAM_ADMIN_LOGIN={{ iam_user }} - IAM_ADMIN_PASSWORD={{ iam_password }} -{% if smtp_host is defined and smtp_host | length %} +{% if smtp_host is defined and (smtp_host | length > 0) %} - SMTP_HOST={{ smtp_host }} - SMTP_PORT={{ smtp_port }} -{% if smtp_user is defined and smtp_user | length %} +{% if smtp_user is defined and (smtp_user | length > 0) %} - SMTP_USER={{ smtp_user }} - SMTP_PASS={{ smtp_pass }} {% endif %} @@ -198,7 +198,7 @@ services: - S3_SECRET_ACCESS_KEY={{ s3_secret_access_key }} - S3_MULTIPART_THRESHOLD={{ s3_multipart_threshold }} - S3_STORAGE_BUCKET_NAME={{ s3_storage_api_bucket_name }} -{% if s3_other_options is defined and s3_other_options | length %} +{% if s3_other_options is defined and (s3_other_options | length > 0) %} {% for option in s3_other_options %} - {{ option.name | upper }}={{ option.value }} {% endfor %} @@ -351,10 +351,10 @@ services: - DB_NAME={{ db_connect_name }} - DB_USER={{ db_connect_user }} - DB_PASSWORD={{ db_connect_password }} -{% if smtp_host is defined and smtp_host | length %} +{% if smtp_host is defined and (smtp_host | length > 0) %} - SMTP_HOST={{ smtp_host }} - SMTP_PORT={{ smtp_port }} -{% if smtp_user is defined and smtp_user | length %} +{% if smtp_user is defined and (smtp_user | length > 0) %} - SMTP_USER={{ smtp_user }} - SMTP_PASS={{ smtp_pass }} {% endif %} @@ -371,7 +371,7 @@ services: - S3_MULTIPART_THRESHOLD={{ s3_multipart_threshold }} - S3_STORAGE_BUCKET_NAME={{ s3_storage_connect_bucket_name }} - CSP_STORAGE_URL={{ csp_storage_url }} -{% if s3_other_options is defined and s3_other_options | length %} +{% if s3_other_options is defined and (s3_other_options | length > 0) %} {% for option in s3_other_options %} - {{ option.name | upper }}={{ option.value }} {% endfor %} @@ -451,10 +451,10 @@ services: - RABBITMQ_PORT={{ rabbitmq_port }} - RABBITMQ_USER={{ rabbitmq_user }} - RABBITMQ_PASSWORD={{ rabbitmq_password }} -{% if smtp_host is defined and smtp_host | length %} +{% if smtp_host is defined and (smtp_host | length > 0) %} - SMTP_HOST={{ smtp_host }} - SMTP_PORT={{ smtp_port }} -{% if smtp_user is defined and smtp_user | length %} +{% if smtp_user is defined and (smtp_user | length > 0) %} - SMTP_USER={{ smtp_user }} - SMTP_PASS={{ smtp_pass }} {% endif %} @@ -673,10 +673,10 @@ services: - API_URL={{ urls['api'] }} - SECRET_KEY={{ marketplace_back_secret_key }} - ADMIN_INTERFACE=true -{% if smtp_host is defined and smtp_host | length %} +{% if smtp_host is defined and (smtp_host | length > 0) %} - SMTP_HOST={{ smtp_host }} - SMTP_PORT={{ smtp_port }} -{% if smtp_user is defined and smtp_user | length %} +{% if smtp_user is defined and (smtp_user | length > 0) %} - SMTP_USER={{ smtp_user }} - SMTP_PASS={{ smtp_pass }} {% endif %} @@ -760,7 +760,7 @@ services: - INVITATION_SECRET={{ sso_invitation_secret }} - SMTP_HOST={{ smtp_host }} - SMTP_PORT={{ smtp_port }} -{% if smtp_user is defined and smtp_user | length %} +{% if smtp_user is defined and (smtp_user | length > 0) %} - SMTP_USER={{ smtp_user }} - SMTP_PASS={{ smtp_pass }} {% endif %} diff --git a/roles/bimdata/templates/tls/cert.j2 b/roles/bimdata/templates/tls/cert.j2 index 07f293d..443e46f 100644 --- a/roles/bimdata/templates/tls/cert.j2 +++ b/roles/bimdata/templates/tls/cert.j2 @@ -1,4 +1,4 @@ {{ lookup('vars', 'tls_'+item+'_cert') }} -{% if tls_subca_certificates is defined and tls_subca_certificates | length %} +{% if tls_subca_certificates is defined and (tls_subca_certificates | length > 0) %} {{ tls_subca_certificates }} {% endif %} diff --git a/roles/docker/defaults/main.yml b/roles/docker/defaults/main.yml index 2e4baee..cf29859 100644 --- a/roles/docker/defaults/main.yml +++ b/roles/docker/defaults/main.yml @@ -2,14 +2,14 @@ # Docker APT configuration docker_apt_dependencies: - ca-certificates + - python3-debian -docker_apt_keyring_path: /etc/apt/keyrings/docker.asc -docker_apt_repo_key_url: "{{ docker_repo_url }}/{{ ansible_distribution | lower }}/gpg" docker_repo_url: https://download.docker.com/linux -docker_apt_release_channel: stable -docker_apt_repo: >- - deb [signed-by={{ docker_apt_keyring_path }}] {{ docker_repo_url }}/{{ ansible_distribution | lower }} - {{ ansible_distribution_release }} {{ docker_apt_release_channel }} + +docker_apt_repo_key_url: "{{ docker_repo_url }}/{{ ansible_distribution | lower }}/gpg" +docker_apt_repo_url: "{{ docker_repo_url }}/{{ ansible_distribution | lower }}" +docker_apt_repo_suites: "{{ ansible_distribution_release }}" +docker_apt_repo_components: stable docker_dnf_repo: "{{ docker_repo_url }}/centos/docker-{{ docker_edition }}.repo" docker_dnf_repo_key_url: "{{ docker_repo_url }}/centos/gpg" @@ -20,7 +20,7 @@ docker_pkg_name: "docker-{{ docker_edition }}" # !! ONLY WORKS WITH APT !! # dnf seems to ignore the specified version in most cases when a version is already installed -docker_pkg_version: "5:27.*" +docker_pkg_version: "5:29.*" docker_pkg_version_hold: "{{ docker_pkg_version | default(false) | ternary(true, false) }}" docker_compose_pkg_name: "docker-compose-plugin" @@ -31,3 +31,7 @@ docker_compose_pkg_version_hold: "{{ docker_compose_pkg_version | default(false) docker_svc_name: docker docker_svc_state: started docker_svc_enabled: true + + +### Legacy value +docker_legacy_apt_repository_file: /etc/apt/sources.list.d/docker.list diff --git a/roles/docker/tasks/install-debian.yml b/roles/docker/tasks/install-debian.yml index e1bf6e5..14bc7dd 100644 --- a/roles/docker/tasks/install-debian.yml +++ b/roles/docker/tasks/install-debian.yml @@ -1,18 +1,4 @@ --- -- name: "Cleanup legacy key in main keyring if needed." - ansible.builtin.apt_key: - id: "9DC858229FC7DD38854AE2D88D81803C0EBFCD88" - state: absent - -- name: "Cleanup legacy Docker repository." - ansible.builtin.apt_repository: - filename: docker - repo: > - deb [arch=amd64] {{ docker_repo_url }}/{{ ansible_distribution | lower }} - {{ ansible_distribution_release }} {{ docker_apt_release_channel }} - update_cache: false - state: absent - - name: Install Docker prerequisites ansible.builtin.apt: name: "{{ docker_apt_dependencies }}" @@ -20,27 +6,27 @@ update_cache: true environment: "{{ proxy_env }}" -- name: Make sur docker keyring folder exists +- name: "Remove legacy repository" ansible.builtin.file: - path: "{{ docker_apt_keyring_path | dirname }}" - state: directory - mode: '0755' - -- name: Add Docker key - ansible.builtin.get_url: - url: "{{ docker_apt_repo_key_url }}" - dest: "{{ docker_apt_keyring_path }}" - mode: '0644' - force: true - environment: "{{ proxy_env }}" + path: "{{ docker_legacy_apt_repository_file }}" + state: absent + register: _remove_apt_legacy - name: Add Docker repository - ansible.builtin.apt_repository: - filename: docker - repo: "{{ docker_apt_repo }}" - update_cache: true + ansible.builtin.deb822_repository: + name: docker + types: deb + uris: "{{ docker_apt_repo_url }}" + suites: "{{ docker_apt_repo_suites }}" + components: "{{ docker_apt_repo_components }}" + signed_by: "{{ docker_apt_repo_key_url }}" state: present environment: "{{ proxy_env }}" + register: _add_apt_repo + +- name: "Update apt cache if necessary" + ansible.builtin.apt: + update_cache: "{{ _remove_apt_legacy.changed or _add_apt_repo.changed }}" - name: Install Docker ansible.builtin.apt: @@ -70,4 +56,3 @@ ansible.builtin.dpkg_selections: name: "{{ docker_compose_pkg_name }}" selection: "{{ docker_compose_pkg_version_hold | ternary ('hold', 'install') }}" - diff --git a/roles/docker/tasks/main.yml b/roles/docker/tasks/main.yml index 3c839d8..3da468a 100644 --- a/roles/docker/tasks/main.yml +++ b/roles/docker/tasks/main.yml @@ -15,8 +15,8 @@ group: root mode: "0640" when: > - (http_proxy is defined and http_proxy | length) - or (https_proxy is defined and https_proxy | length) + (http_proxy is defined and (http_proxy | length > 0)) + or (https_proxy is defined and (https_proxy | length > 0)) - name: Configure docker proxy if needed ansible.builtin.template: @@ -26,8 +26,8 @@ group: root mode: "0640" when: > - (http_proxy is defined and http_proxy | length) - or (https_proxy is defined and https_proxy | length) + (http_proxy is defined and (http_proxy | length > 0)) + or (https_proxy is defined and (https_proxy | length > 0)) notify: Restart Docker - name: Flush handlers to avoid any conflict with the desired state diff --git a/roles/post_run/tasks/20260128.yml b/roles/post_run/tasks/20260128.yml index 53735af..a969ff2 100644 --- a/roles/post_run/tasks/20260128.yml +++ b/roles/post_run/tasks/20260128.yml @@ -20,7 +20,7 @@ when: - db_info.current_version is version("15", ">=") -- name: "Run Postgres vaccum analyze on the database {{ db_info.name }} on the database {{ db_info.name }}" +- name: "Run Postgres vaccum analyze on the database {{ db_info.name }}" community.docker.docker_container_exec: container: "{{ db_info.name }}-db" command: >- diff --git a/roles/post_run/tasks/main.yml b/roles/post_run/tasks/main.yml index 7c7537e..f031be7 100644 --- a/roles/post_run/tasks/main.yml +++ b/roles/post_run/tasks/main.yml @@ -2,7 +2,7 @@ - name: "Apply post upgrade tasks for Postgresql major upgrade." when: - _dbs_upgraded is defined - - _dbs_upgraded | length + - _dbs_upgraded | length > 0 ansible.builtin.include_tasks: db_upgraded.yml loop: "{{ _dbs_upgraded }}" loop_control: diff --git a/roles/prepare_vars/tasks/bastion.yml b/roles/prepare_vars/tasks/bastion.yml index 7f054e8..ddf3318 100644 --- a/roles/prepare_vars/tasks/bastion.yml +++ b/roles/prepare_vars/tasks/bastion.yml @@ -3,11 +3,11 @@ ansible.builtin.assert: that: - bastion_ssh_addr is defined - - bastion_ssh_addr | length + - bastion_ssh_addr | length > 0 - bastion_ssh_port is defined - bastion_ssh_port | int - bastion_ssh_user is defined - - bastion_ssh_user | length + - bastion_ssh_user | length > 0 fail_msg: > You choose to use a connection through a bastion (use_bastion: true), bastion_ssh_addr, bastion_ssh_port, bastion_ssh_user must be defined and not empty. @@ -16,6 +16,6 @@ ansible.builtin.set_fact: ansible_ssh_common_args: > -o ProxyCommand='ssh -W %h:%p -q -p {{ bastion_ssh_port | default(22) }} {{ bastion_ssh_user }}@{{ bastion_ssh_addr }} - {%- if bastion_ssh_extra_options is defined and bastion_ssh_extra_options | length %} + {%- if bastion_ssh_extra_options is defined and (bastion_ssh_extra_options | length > 0) %} {{ bastion_ssh_extra_options }} {%- endif -%}' diff --git a/roles/prepare_vars/tasks/database.yml b/roles/prepare_vars/tasks/database.yml index 8379fd1..3230544 100644 --- a/roles/prepare_vars/tasks/database.yml +++ b/roles/prepare_vars/tasks/database.yml @@ -7,7 +7,7 @@ ansible.builtin.assert: that: - external_db_host is defined - - external_db_host | length + - external_db_host | length > 0 - external_db_port is defined - external_db_port | int fail_msg: "You choose to use an external database server (use_external_db: true), external_db_host, external_db_port must be defined and not empty." diff --git a/roles/prepare_vars/tasks/rabbitmq.yml b/roles/prepare_vars/tasks/rabbitmq.yml index ae7418e..7618574 100644 --- a/roles/prepare_vars/tasks/rabbitmq.yml +++ b/roles/prepare_vars/tasks/rabbitmq.yml @@ -7,7 +7,7 @@ ansible.builtin.assert: that: - external_rabbitmq_host is defined - - external_rabbitmq_host | length + - external_rabbitmq_host | length > 0 - external_rabbitmq_port is defined - external_rabbitmq_port | int fail_msg: > @@ -25,7 +25,7 @@ block: - name: Check if rabbitmq is on the same same host ansible.builtin.set_fact: - rabbit_is_local: "{{ inventory_hostname in groups['app'] | default(false) }}" + rabbit_is_local: "{{ (inventory_hostname in groups['app']) | default(false) }}" - name: Set RabbitMQ connection variable accordingly ansible.builtin.set_fact: diff --git a/roles/prepare_vars/tasks/sso.yml b/roles/prepare_vars/tasks/sso.yml index 5267c8d..0c89273 100644 --- a/roles/prepare_vars/tasks/sso.yml +++ b/roles/prepare_vars/tasks/sso.yml @@ -3,6 +3,6 @@ ansible.builtin.assert: that: - smtp_host is defined - - smtp_host | length + - smtp_host | length > 0 fail_msg: "You choose to use the SSO email module (sso_invitation_enabled: true), smtp_host must be defined and not empty." when: sso_invitation_enabled diff --git a/roles/prepare_vars/tasks/storage.yml b/roles/prepare_vars/tasks/storage.yml index 2e5fd14..1e288a5 100644 --- a/roles/prepare_vars/tasks/storage.yml +++ b/roles/prepare_vars/tasks/storage.yml @@ -3,13 +3,13 @@ ansible.builtin.assert: that: - s3_endpoint_url is defined - - s3_endpoint_url | length + - s3_endpoint_url | length > 0 - s3_region_name is defined - - s3_region_name | length + - s3_region_name | length > 0 - s3_access_key_id is defined - - s3_access_key_id | length + - s3_access_key_id | length > 0 - s3_secret_access_key is defined - - s3_secret_access_key | length + - s3_secret_access_key | length > 0 fail_msg: > You choose to use an object storage (s3_enabled: true or s3_connect_enabled: true), s3_endpoint_url, s3_region_name, s3_access_key_id, s3_secret_access_key must be defined and not empty. @@ -19,7 +19,7 @@ ansible.builtin.assert: that: - s3_storage_api_bucket_name is defined - - s3_storage_api_bucket_name | length + - s3_storage_api_bucket_name | length > 0 fail_msg: > You choose to use an object storage for the API (s3_enabled: true), s3_storage_api_bucket_name must be defined and not empty. @@ -29,7 +29,7 @@ ansible.builtin.assert: that: - s3_storage_connect_bucket_name is defined - - s3_storage_connect_bucket_name | length + - s3_storage_connect_bucket_name | length > 0 fail_msg: > You choose to use an object storage for the API (s3_connect_enabled: true), s3_storage_connect_bucket_name must be defined and not empty. diff --git a/roles/prepare_vars/tasks/url.yml b/roles/prepare_vars/tasks/url.yml index 6ba7ed5..bb1aff2 100644 --- a/roles/prepare_vars/tasks/url.yml +++ b/roles/prepare_vars/tasks/url.yml @@ -12,26 +12,26 @@ - name: Check if all needed variables for TLS are defined if needed ansible.builtin.assert: that: - - tls_api_key | length - - tls_api_cert | length + - tls_api_key | length > 0 + - tls_api_cert | length > 0 - - tls_connect_key | length - - tls_connect_cert | length + - tls_connect_key | length > 0 + - tls_connect_cert | length > 0 - - tls_platform_back_key | length - - tls_platform_back_cert | length + - tls_platform_back_key | length > 0 + - tls_platform_back_cert | length > 0 - - tls_platform_front_key | length - - tls_platform_front_cert | length + - tls_platform_front_key | length > 0 + - tls_platform_front_cert | length > 0 - - tls_iam_key | length - - tls_iam_cert | length + - tls_iam_key | length > 0 + - tls_iam_cert | length > 0 - - tls_documentation_key | length - - tls_documentation_cert | length + - tls_documentation_key | length > 0 + - tls_documentation_cert | length > 0 - - tls_archive_key | length - - tls_archive_cert | length + - tls_archive_key | length > 0 + - tls_archive_cert | length > 0 fail_msg: > You choose to enable TLS (tls_enabled: true), you need to define all the keys and certificates in group_vars/all/vars.yml. @@ -40,11 +40,11 @@ - name: Check if all needed variables for marketplace TLS are defined if needed ansible.builtin.assert: that: - - tls_marketplace_back_key | length - - tls_marketplace_back_cert | length + - tls_marketplace_back_key | length > 0 + - tls_marketplace_back_cert | length > 0 - - tls_marketplace_front_key | length - - tls_marketplace_front_cert | length + - tls_marketplace_front_key | length > 0 + - tls_marketplace_front_cert | length > 0 fail_msg: > You choose to enable TLS (tls_enabled: true), you need to define all the keys and certificates in group_vars/all/tls.yml. @@ -55,8 +55,8 @@ - name: Check if all needed variables for TLS are defined if needed ansible.builtin.assert: that: - - tls_rabbitmq_admin_key | length - - tls_rabbitmq_admin_cert | length + - tls_rabbitmq_admin_key | length > 0 + - tls_rabbitmq_admin_cert | length > 0 fail_msg: > You choose to enable TLS (tls_enabled: true) and you don't use external rabbitmq, you need to define the key and certificate in group_vars/all/tls.yml for rabbitmq. diff --git a/roles/prepare_vars/templates/proxy.j2 b/roles/prepare_vars/templates/proxy.j2 index da4fa6e..3c2ef28 100644 --- a/roles/prepare_vars/templates/proxy.j2 +++ b/roles/prepare_vars/templates/proxy.j2 @@ -1,13 +1,13 @@ { - {%- if http_proxy is defined and http_proxy | length -%} + {%- if http_proxy is defined and (http_proxy | length > 0) -%} http_proxy: "{{ http_proxy }}", HTTP_PROXY: "{{ http_proxy }}", {%- endif -%} - {%- if https_proxy is defined and https_proxy | length -%} + {%- if https_proxy is defined and (https_proxy | length > 0) -%} https_proxy: "{{ https_proxy }}", HTTPS_PROXY: "{{ https_proxy }}", {%- endif -%} - {%- if no_proxy is defined and no_proxy | length -%} + {%- if no_proxy is defined and (no_proxy | length > 0) -%} no_proxy: "{{ no_proxy | join(',') }}", NO_PROXY: "{{ no_proxy | join(',') }}", {%- endif -%} diff --git a/roles/prepare_vars/vars/nginx_local_storage.yml b/roles/prepare_vars/vars/nginx_local_storage.yml index 84b79b2..cd0dbb8 100644 --- a/roles/prepare_vars/vars/nginx_local_storage.yml +++ b/roles/prepare_vars/vars/nginx_local_storage.yml @@ -15,7 +15,7 @@ api: } } {% endif %} - {% if api_nginx_custom_conf | length %} + {% if api_nginx_custom_conf | length > 0 %} {{ api_nginx_custom_conf | trim }} {% endif %} diff --git a/roles/prepare_vars/vars/tls.yml b/roles/prepare_vars/vars/tls.yml index 7e5d200..be88f7c 100644 --- a/roles/prepare_vars/vars/tls.yml +++ b/roles/prepare_vars/vars/tls.yml @@ -1,5 +1,5 @@ --- -tls_custom_ca: "{{ (tls_enabled | bool and tls_ca_certificate | length) | ternary(true, false) }}" +tls_custom_ca: "{{ (tls_enabled | bool and (tls_ca_certificate | length > 0)) | ternary(true, false) }}" tls_needed_certs: "{{ ['api', 'connect', 'platform_back', 'platform_front', 'iam', 'documentation', 'archive'] + ((not use_external_rabbitmq) | ternary(['rabbitmq_admin'], [])) diff --git a/roles/prerequisites/tasks/main.yml b/roles/prerequisites/tasks/main.yml index c13ce2f..6af0b1c 100644 --- a/roles/prerequisites/tasks/main.yml +++ b/roles/prerequisites/tasks/main.yml @@ -36,6 +36,7 @@ - name: "Cleanup old docker compose if needed" when: _legacy_venv_cleanup block: + # noqa: no-changed-when - name: "Stop all containers setup with compose < 2" ansible.builtin.command: cmd: "{{ bimdata_path }}/venv/bin/docker-compose down --remove-orphans --timeout 60" diff --git a/roles/prerequisites/tasks/offline.yml b/roles/prerequisites/tasks/offline.yml index 5d07b28..3816b92 100644 --- a/roles/prerequisites/tasks/offline.yml +++ b/roles/prerequisites/tasks/offline.yml @@ -6,6 +6,6 @@ mode: "0750" - name: "Upload docker images" - include_tasks: upload_docker_images.yml + ansible.legacy.include_tasks: upload_docker_images.yml loop: "{{ install_offline_docker }}" when: item.group is not defined or inventory_hostname in groups[item.group]