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

Ansible 快速安装

RHEL7 安装

在控制 节点/etc/hosts 文件生成其它节点dns 名称

cat >>/etc/hosts<<EOF
192.168.200.27 node1
192.168.200.28 node2
192.168.200.29 node3
192.168.200.30 node4
192.168.200.31 node5
192.168.200.32 node6
192.168.200.33 node7
EOF
cat >> /etc/yum.repos.d/epel.repo <<'EOF'    
[epel]
name=epel repo 
baseurl=https://mirrors.tuna.tsinghua.edu.cn/epel/7/$basearch 
enabled=1 
gpgcheck=0
EOF

yum update
yum install ansible -y

Ansible 命令行补全功能

https://cn-ansibledoc.readthedocs.io/zh-cn/latest/installation_guide/intro_installation.html#id2

$ sudo yum install epel-release
$ sudo yum install python-argcomplete
#激活命令行实例功能
 activate-global-python-argcomplete

配置ssh 互信

1、控制节点生成ssh 密钥对
ssh-keygen -t rsa -f ~/.ssh/id_rsa -N ''
2、将各节点的主机信息(host key)写入control_node的~/.ssh/known_hosts文件:
for host in 10.100.10.{64..83} node{01..07};do
     ssh-keyscan $host >>~/.ssh/known_hosts 2>/dev/null
   done
3、.将control_node上的ssh公钥分发给各节点:
# sshpass -p选项指定的是密码
   for host in 10.100.10.{64..83} node{01..07};do
     sshpass -p'Thtf#997' ssh-copy-id root@$host &>/dev/null
   done