Вы можете попробовать local_action на хостах, чтобы посмотреть, сможете ли вы подключиться к соответствующим портам и зарегистрировать тот, который будет успешным, и установить это как факт. Вы хотите отключить сбор фактов, потому что в противном случае модуль установки потерпит неудачу, когда он попытается соединиться с уже перенастроенными узлами. Как только вы закончите эту игру, просто добавьте другие ниже с collect_facts и все остальное.
- 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
Мне было указано, что это унесет время для playbooks, где вы используете это. Вы также можете установить ansible_ssh_port в разделе игр vars, который должен запускаться только на хостах с перенастроенным портом ssh. например
- 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:
...