geerlingguy / ansible-role-docker

Ansible Role - Docker
https://galaxy.ansible.com/geerlingguy/docker/
MIT License
1.81k stars 853 forks source link

docker-compose role fails when docker-compose is not installed on the node #383

Closed berthin closed 1 year ago

berthin commented 1 year ago

Hi,

There is an issue I am hitting when docker-compose is not installed. See the following error message:

fatal: [pc]: FAILED! => {}

MSG:

The conditional check 'docker_compose_current_version is defined and (docker_compose_version | regex_replace('v', '')) not in docker_compose_current_version
' failed. The error was: Unexpected templating type error occurred on ({% if docker_compose_current_version is defined and (docker_compose_version | regex_repl
ace('v', '')) not in docker_compose_current_version
 %} True {% else %} False {% endif %}): argument of type 'NoneType' is not iterable

The error appears to be in '/home/berthin/.ansible/roles/geerlingguy.docker/tasks/docker-compose.yml': line 13, column 3, but may
be elsewhere in the file depending on the exact syntax problem.

The offending line appears to be:

- name: Delete existing docker-compose version if it's different.
  ^ here

The complain is about https://github.com/geerlingguy/ansible-role-docker/blob/master/tasks/docker-compose.yml#L9-L29. So, I added some debug messages to see if those variables were or not defined, and apparently:

you can see my debugging efforts at the end of this message, but anyways, I think the following should be fix the issue:

- set_fact:
    docker_compose_current_version: "{{ docker_compose_vsn.stdout | regex_search('(\\d+(\\.\\d+)+)') }}"
  when: >
    docker_compose_vsn.stdout is defined
    and (docker_compose_vsn.stdout | length > 0)

UPDATE: I have pushed a fix, please review: #384

For reference, I tried to use the latest ansible-core + geerlingguy.docker versions:

$ ansible --version
ansible [core 2.13.5]
  config file = /home/berthin/projects/infrastructure/ansible.cfg
  configured module search path = ['/home/berthin/.ansible/plugins/modules', '/usr/share/ansible/plugins/modules']
  ansible python module location = /home/berthin/venvs/ansible/lib/python3.10/site-packages/ansible
  ansible collection location = /home/berthin/.ansible/collections:/usr/share/ansible/collections
  executable location = /home/berthin/venvs/ansible/bin/ansible
  python version = 3.10.4 (main, Jun 29 2022, 12:14:53) [GCC 11.2.0]
  jinja version = 3.1.2
  libyaml = True

to be sure that I have the latest version of geerlingguy.docker, I installed forcefully XD.

$ ansible-galaxy install --force geerlingguy.docker
Starting galaxy role install process
- changing role geerlingguy.docker from 6.0.1 to unspecified
- downloading role 'docker', owned by geerlingguy
- downloading role from https://github.com/geerlingguy/ansible-role-docker/archive/6.0.1.tar.gz
- extracting geerlingguy.docker to /home/berthin/.ansible/roles/geerlingguy.docker
- geerlingguy.docker (6.0.1) was installed successfully

Here you can see my debugging efforts, not that interesting to be honest:

- name: Check current docker-compose version.
  command: "{{ docker_compose_path }} --version"
  register: docker_compose_vsn
  check_mode: false
  changed_when: false
  failed_when: false

- set_fact:
    docker_compose_current_version: "{{ docker_compose_vsn.stdout | regex_search('(\\d+(\\.\\d+)+)') }}"
  when: docker_compose_vsn.stdout is defined

- name: Debug-stdout-no
  ansible.builtin.debug:
    msg: >
      docker_compose_vsn.stdout is not {{ docker_compose_vsn.stdout }}
  when: >
    docker_compose_vsn.stdout is not defined

- name: Debug-stdout-yes
  ansible.builtin.debug:
    msg: >
      docker_compose_vsn.stdout is defined {{ docker_compose_vsn.stdout }}
  when: >
    docker_compose_vsn.stdout is defined

- name: Debug-current-version-no
  ansible.builtin.debug:
    msg: >
      docker_compose_current_version {{ docker_compose_current_version }}
  when: >
    docker_compose_current_version is not defined

- name: Debug-current-version-yes
  ansible.builtin.debug:
    msg: >
      docker_compose_current_version is defined  {{ docker_compose_current_version }}
  when: >
    docker_compose_current_version is defined

- name: Debug
  ansible.builtin.debug:
    msg:
    - " docker_compose_vsn {{ docker_compose_vsn }} "
    - " stdout {{ docker_compose_vsn.stdout }} "
    - " version {{ docker_compose_version }} "
    - " current version {{ docker_compose_current_version }} "

- name: Delete existing docker-compose version if it's different.
  file:
    path: "{{ docker_compose_path }}"
    state: absent
  when: >
    docker_compose_current_version is defined
    and (docker_compose_version | regex_replace('v', '')) not in docker_compose_current_version

and the output:

TASK [geerlingguy.docker : Check current docker-compose version.] ***********************************************************
task path: /home/berthin/.ansible/roles/geerlingguy.docker/tasks/docker-compose.yml:2
ok: [pc] => {
    "changed": false,
    "cmd": "/usr/local/bin/docker-compose --version",
    "failed_when_result": false,
    "rc": 2
}

MSG:

[Errno 2] No such file or directory: b'/usr/local/bin/docker-compose'

TASK [geerlingguy.docker : set_fact] ****************************************************************************************
task path: /home/berthin/.ansible/roles/geerlingguy.docker/tasks/docker-compose.yml:9
ok: [pc] => {
    "ansible_facts": {
        "docker_compose_current_version": null
    },
    "changed": false
}

TASK [geerlingguy.docker : Debug-stdout-no] *********************************************************************************
task path: /home/berthin/.ansible/roles/geerlingguy.docker/tasks/docker-compose.yml:13
skipping: [pc] => {}

TASK [geerlingguy.docker : Debug-stdout-yes] ********************************************************************************
task path: /home/berthin/.ansible/roles/geerlingguy.docker/tasks/docker-compose.yml:20
ok: [pc] => {}

MSG:

docker_compose_vsn.stdout is defined

TASK [geerlingguy.docker : Debug-current-version-no] ************************************************************************
task path: /home/berthin/.ansible/roles/geerlingguy.docker/tasks/docker-compose.yml:27
skipping: [pc] => {}

TASK [geerlingguy.docker : Debug-current-version-yes] ***********************************************************************
task path: /home/berthin/.ansible/roles/geerlingguy.docker/tasks/docker-compose.yml:34
ok: [pc] => {}

MSG:

docker_compose_current_version is defined  None

TASK [geerlingguy.docker : Debug] *******************************************************************************************
task path: /home/berthin/.ansible/roles/geerlingguy.docker/tasks/docker-compose.yml:41
ok: [pc] => {}

MSG:

[' docker_compose_vsn {\'stdout\': \'\', \'msg\': "[Errno 2] No such file or directory: b\'/usr/local/bin/docker-compose\'",
\'failed\': False, \'rc\': 2, \'cmd\': \'/usr/local/bin/docker-compose --version\', \'stderr\': \'\', \'stdout_lines\': [], \
'stderr_lines\': [], \'changed\': False, \'failed_when_result\': False} ', ' stdout  ', ' version v2.11.1 ', ' current versio
n None ']