Allowing some molecule hosts to fail

I got a special use case: where I has a group of hosts I wanted to test with molecule but I knew that at least one of them will fail with current code. I did not want to fail the execution due to the expected failure, so I ended up doing this complex logic below.

The first part detects only reacable hosts and avoid failing the playbook if they are reacable (something that can happen if for example molecule fails to even create them).

The second part is effectively running the tests and adds the hosts that pass to the passed group.

The last playbook decides the final outcome by comparing the list of required hosts with the list of passed ones.

I am not very please with the size of the current solution so if anyone has some better ways to do it, I would be more than happy to hear it.


- name: identify reachable hosts
  hosts: all
  gather_facts: false
  ignore_errors: true
  ignore_unreachable: true
    - block:
        - name: this does nothing
          shell: exit 1
          register: result
        - add_host:
            name: "{{ inventory_hostname }}"
            group: reachable

- name: Converge
  hosts: reachable
  gather_facts: false
    - block:
        - shell: exit 0
    - debug: msg="{{ inventory_hostname }} is reachable"

    - add_host:
        name: "{{ inventory_hostname }}"
        group: passed

- name: Determine final outcome
  hosts: localhost
    - fail:
        msg: |
          Not enough hosts passed{{ ':'}} {{ missing | join(', ') }}
          - localhost
        missing: "{{ required | difference(groups['passed']) }}"
      when: "{{ missing }}"