Aqui está o que eu faço se ansible_user
for diferente para a 'primeira execução' do manual (por exemplo, se você tiver apenas um root
usuário e configurar um novo usuário com uma chave SSH):
- Armazene a senha
ansible_pass
como faria se estivesse usando logins de senha (lembre-se de usar o Vault). Essa deve ser a senha do usuário que você está usando para a 'primeira execução' do manual.
- Defina
ansible_user
como o nome de usuário do usuário que você deseja usar após a primeira execução, quando tiver os usuários configurados corretamente no servidor.
- Defina uma variável de
ansible_user_first_run
como o usuário que você usará para a 'primeira execução' do manual, por exemplo root
.
- Use um comando local para tentar se conectar ao servidor com a chave SSH correta, usando
ignore_errors
echanged_when: False
- Se isso falhar, atualize
ansible_user
para o valor deansible_user_first_run
Aqui está o código:
---
- name: Check if connection is possible
command: ssh -o User={{ ansible_user }} -o ConnectTimeout=10 -o PreferredAuthentications=publickey -o PubkeyAuthentication=yes {{ inventory_hostname }} echo "Worked"
register: result
connection: local
ignore_errors: yes
changed_when: False
- name: If no connection, change user_name
connection: local
set_fact:
ansible_user: "{{ ansible_user_first_run }}"
when: result|failed
Nota: Vale a pena configurar, transport = ssh
pois o paramiko pode falhar inesperadamente no login no servidor em algumas configurações (por exemplo, quando o servidor está configurado para não aceitar senhas, e você está tentando primeiro com uma chave e depois com uma senha ... estranho!) Além disso, o transporte ssh é mais rápido, portanto vale a pena.
Observação adicional: se você estiver usando esse método, precisará especificar gather_facts: false
no arquivo de definição do playbook para que as tarefas de configuração / coleta de fatos não sejam executadas automaticamente antes de chegar ao estágio de teste de senhas. Se você precisar de algum dos fatos ansíveis, precisará chamar explicitamente setup
sua função antes de acessar qualquer dado normalmente disponível em locais como ansible_devices
etc. Uma boa maneira de fazer isso é chamar setup
uma when
cláusula que verifique se o fato de que você está usando está vazio ou não antes de chamá-lo em sua função.