Como tornar a senha de uso Ansible se a chave foi rejeitada?

9

Minhas novas instâncias do servidor estão configuradas para login na raiz via ssh com senha. Eu quero que meu playbook Ansible reconfigure-o para usar as chaves e desabilite o login root com senha na primeira execução, então eu preciso de algo assim:

  • tente fazer login com a chave
  • se não conseguir entrar com chave:

    • faça login com senha
    • adicione a chave a authorized_keys
    • desabilitar o login root com senha
    • reconectar-se opcionalmente usando a chave
  • faça outras tarefas

Como posso conseguir isso?

EDITAR : Para ser claro, não estou perguntando como adicionar chave ou desativar o root, apenas para o contexto. Eu estou perguntando como fallback para senha se não pudesse autenticar com a chave. Com --ask-pass ou ansible_ssh_pass set, o Ansible não tentará usar a autenticação de chave pública

    
por petr0 04.11.2013 / 14:56

3 respostas

5

Você pode tentar a opção PreferredAuthentications , configurando-a como publickey,password . O padrão inclui estes nesta ordem, junto com outras opções, de forma que ansible esteja presumivelmente configurando isso. Adicioná-lo via -o ou o cliente ssh_config pode impedir isso.

Você pode usar um script de wrapper. Por exemplo, com isso em key_or_password.sh e pass.sh que fornece a senha, executar bash key_or_password.sh root@host tentará uma publickey seguida de um login de senha não interativo.

export DISPLAY=dummy:0
export SSH_ASKPASS=$PWD/pass.sh
exec setsid ssh -v -o 'PreferredAuthentications publickey,password' "$@"

O log indica qual método foi bem sucedido, por exemplo,

debug1: Authentication succeeded (publickey).
    
por 21.04.2015 / 17:59
5

Você pode usar --ask-pass ao executar o ansioso-playbook.

Para outras tarefas que você pediu, é possível por vários meios, por exemplo, copiar o módulo.
Desabilitar o login root também pode ser feito, por exemplo. por modelar sshd_conf ou inserir linha no arquivo conf.

    
por 26.02.2014 / 12:35
4

Veja o que eu faço se ansible_user for diferente para a "primeira execução" do playbook (por exemplo, se você tiver apenas um usuário root e for configurar um novo usuário com uma chave SSH) :

  • Guarde a senha em ansible_pass como você 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 você tiver usuários configurados corretamente no servidor.
  • Defina uma variável de ansible_user_first_run para o usuário que você usará na "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 e changed_when: False
  • Se isso falhar, atualize ansible_user para o valor de ansible_user_first_run

Este é 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 em algumas configurações do servidor (por exemplo, quando o servidor está configurado para não aceitar senhas e você está tentando primeiro com uma chave e uma senha ... estranho!) Também o transporte ssh é mais rápido, então vale a pena mesmo assim.

    
por 09.02.2016 / 15:40