Você poderia tentar um local_action nos hosts para ver se você pode se conectar às respectivas portas e registrar o que tiver sucesso e definir isso como um fato. Você deseja desativar a coleta de fatos porque, caso contrário, o módulo de instalação falhará ao tentar se conectar com os hosts que já foram reconfigurados. Uma vez que você tenha feito essa jogada, adicione outras abaixo com gather_facts e todo o resto.
- name: determine ssh port
hosts: all
gather_facts: false
vars:
custom_ssh_port: 222
tasks:
- name: test default ssh port
local_action: wait_for port=22 timeout=5 host={{inventory_hostname}}
register: default_ssh
ignore_errors: true
- name: set ansible_ssh_port to default
set_fact: ansible_ssh_port=22
when: default_ssh.elapsed < 5
- name: test ssh on high port
local_action: wait_for port={{custom_ssh_port}} timeout=5 host={{inventory_hostname}}
register: high_ssh
when: default_ssh.elapsed >= 5
ignore_errors: true
- name: set ansible_ssh_port high
set_fact: ansible_ssh_port={{custom_ssh_port}}
when: default_ssh.elapsed >= 5 and high_ssh.elapsed < 5
Foi apontado para mim que isso vai acabar com o tempo para playbooks onde você usa isso. Você também pode definir ansible_ssh_port na seção vars das execuções que devem ser executadas somente em hosts com a porta ssh reconfigurada. por exemplo,
- name: change ssh ports
tasks:
- name: edit sshd_config
lineinfile ..
notify: restart ssh
handlers:
- name: restart ssh
service: sshd state=restarted
- name: continue setup
vars:
- ansible_ssh_port : 5422
tasks:
...