Ansible提供了一个authorized_key模块,它可以用来分发SSH公钥。
但需注意,authorized_key模块并不负责主机认证的阶段,所以需要我们自己去处理主机认证阶段,有三种处理方式:
1.使用ssh-keyscan命令将主机信息添加到Ansible端的~/.ssh/known_hosts中
2.使用Ansible提供的known_hosts模块添加主机信息
3.禁止主机认证的阶段
禁止主机认证阶段的方式有多种,比如去ssh或Ansible的配置文件中禁止主机认证(两种配置都可以,因为Ansible默认是基于ssh进行连接的),以Ansible配置文件为例,设置如下项即可:
host_key_checking = False
---
- name: configure ssh connection
hosts: new
gather_facts: false
tasks:
- authorized_key:
key: "{{lookup('file','~/.ssh/id_rsa.pub')}}"
state: present
user: root
执行该playbook,主机加上了-k选项,它会提示用户输入ssh连接密码。如果所有目标主机的密码都相同,则只需输入一次即可:
$ ansible-playbook -k anth_key.yml
user参数和key参数是必须的,key指定公钥字符串。user参数表示将密钥分发给目标主机上的哪个用户,默认会将公钥写入目标主机的/home/USERNAME/.ssh/authorized_keys文件中,默认情况下会创建缺失的目录(比如.ssh目录)并设置好权限。
这里还使用了state参数,state参数值为present时,表示如果对方文件中已有完全相同的公钥信息,则不写入,否则写入。如果值为absent,则表示删除目标节点上与本次待分发公钥完全相同的数据。总结起来就是:
(1).present:保证目标节点上会保存Ansible端本次分发的公钥
(2).absent:保证目标节点上没有Ansible端本次分发的公钥