Ansible 使用authorized_key颁发密钥

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端本次分发的公钥