如果密钥被拒绝,如何使Ansible使用密码?

我的新服务器实例被configuration为通过ssh使用密码login到root。 我想我的Ansible剧本重新configuration它来使用密钥,而不是在第一次运行密码的rootlogin,所以我需要这样的东西:

  • 尝试使用密钥login
  • 如果不能用键login:

    • 用密码login
    • 将密钥添加到authorized_keys
    • 用密码禁用rootlogin
    • 可select使用键重新连接
  • 做其他任务

我怎么能做到这一点?

编辑 :要清楚,我不问如何添加键或禁用根,这只是上下文。 我问如何回退到密码,如果它无法通过密钥进行身份validation。 使用--ask-passansible_ssh_pass设置,Ansible甚至不会尝试使用公钥authentication

您可以尝试PreferredAuthentications选项,将其设置为publickey,password 。 默认包括这些顺序,以及其他选项,所以大概是这样设置的。 通过-o或客户端ssh_config添加它可能会阻止这一点。

您可能能够使用包装脚本。 例如,在key_or_password.sh和一个给出密码的pass.sh中,运行bash key_or_password.sh root@host会尝试一个publickey,然后是非交互式密码login。

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

日志表明哪个方法成功,例如

 debug1: Authentication succeeded (publickey). 

如果ansible_user与playbook的“首次运行”不同(例如,如果您只有一个root用户,并且要使用SSH密钥设置一个新用户),那么我会这样做:

  • 将密码存储在ansible_pass就像您使用密码login(请记住使用保险柜)一样,这应该是用于“首次运行”剧本的用户的密码。
  • 当用户在服务器上正确设置时,将ansible_user设置为第一次运行后希望使用的用户的用户名。
  • 将一个variablesansible_user_first_run设置为您要用于“首次运行”剧本的用户,例如root
  • 使用本地命令尝试使用正确的SSH密钥连接到服务器,使用ignore_errorschanged_when: False
  • 如果失败, ansible_user更新为ansible_user的值

代码如下:

 --- - 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 

注意:值得设置transport = ssh因为paramiko在一些configuration中可能意外地无法login到服务器(例如,当服务器设置为不接受密码,而您首先尝试使用密钥然后input密码…奇怪!)另外ssh传输速度更快,所以无论如何它是值得的。

运行ansible-playbook时可以使用--ask-pass

对于您所要求的其他任务,可以通过各种方式实现,例如复制模块。
禁用根login也可以完成例如。 通过模板化sshd_conf或在conf文件中插入行。