Да, это возможно, но на первый взгляд большинство решений будут выглядеть довольно сложными. Возможно, вам лучше просто определить "загрузочную" пьесу, которую вы исполняете только один раз. Это то, что я должен установить Python и настроить первоначального пользователя.
Однако, чтобы ответить на вопрос напрямую, вот решение, которое должно работать:
# Experiment to "fix" `ansible_user` depending upon host availability
- hosts: all
gather_facts: false # Otherwise initial connection will fail
vars:
- bootstrap_user: root
tasks:
- debug:
msg: |
ansible_user: {{ ansible_user | d('unset') }};
remote_user: {{ remote_user | d('unset') }}
- action: ping
ignore_unreachable: true # requires Ansible >= 2.7
ignore_errors: yes
register: pingtest
# Works (mostly) for Ansible >= 2.2.
# Might think this alone would work, but only if NOT *ALL* hosts failed up to
# this point, which makes running the playbook on only a single host pointless.
# Therefore, also set `ignore_unrechable` in `ping` above.
# - https://github.com/ansible/ansible/issues/26362
# - https://github.com/ansible/ansible/issues/19673
# - https://github.com/ansible/ansible/issues/18075
- meta: clear_host_errors
- name: set ansible_user if no ping failed
set_fact:
ansible_user: "{{ bootstrap_user }}"
when: pingtest.failed | d(pingtest.unreachable) | d(false)
- debug:
msg: "ansible_user: {{ ansible_user | d('unset') }}"
# Connect as ansible_user from here on
- name: Show remote user
shell: "echo $USER"
changed_when: false
В целом, следующие две ссылки помогут вам понять переменные (и приоритет, который важен здесь), а также восстановление после ошибок: