我的新服务器实例被configuration为通过ssh使用密码login到root。 我想我的Ansible剧本重新configuration它来使用密钥,而不是在第一次运行密码的rootlogin,所以我需要这样的东西:
如果不能用键login:
做其他任务
我怎么能做到这一点?
编辑 :要清楚,我不问如何添加键或禁用根,这只是上下文。 我问如何回退到密码,如果它无法通过密钥进行身份validation。 使用--ask-pass或ansible_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设置为第一次运行后希望使用的用户的用户名。 ansible_user_first_run设置为您要用于“首次运行”剧本的用户,例如root 。 ignore_errors和changed_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文件中插入行。