ansible 通过密码方式推送主机公钥

很多情况下,运维需要批量上架一批服务器,然后利用ansible等脚手架工具来批量管理。

一般服务器安装好后会设置一个默认的root密码,我们就利用root默认密码的方式,结合ansible将管理机的公钥推送到服务器,后续就利用公钥来管理了。

Note: inventory(资产)就是被管理主机的一个合集,可以是写死的静态列表,也可以是动态的,比如从资产系统里提取。

/etc/ansible/hosts
[servers]
172.17.2.162
172.17.2.113
172.17.2.115
172.17.2.106
172.17.2.152
172.17.2.248
172.17.2.249
172.17.2.193
172.17.2.125
172.17.2.243
# group变量,指定ansible通过ssh密码的方式连接
[servers:vars]
ansible_user='root'
ansible_password='123123'

还可以将组嵌入到另外一个组,比如将docker和k8s两个组并入all这个组里:

[k8s]
172.17.2.241
172.17.2.242
172.17.2.243
172.17.2.244
172.17.2.245
172.17.2.246
172.17.2.247
[docker]
172.17.2.248
172.17.2.249
[all:children]
k8s
docker
[all:vars]
ansible_user=root
ansible_password=123123

更多参数

Note:

  • 修改/etc/ansible/ansible.cfg中 host_key_checking = False 不然ssh报错;
  • 通过密码方式需要安装sshpass包;

测试:

ansible servers -o -m shell -a 'ip a|grep 172'

输出:

172.17.2.115 | CHANGED | rc=0 | (stdout)     inet 172.17.2.115/24 brd 172.17.2.255 scope global dynamic eth0
...

2.1 通过copy公钥

Warning: 该操作覆盖目标文件!

ansible servers -m copy -a "src=/root/.ssh/id_rsa.pub dest=/root/.ssh/authorized_keys mode=600"

2.2 通过authorized_key模块

创建playbook:

upload_ssh_keys.yml
---
- hosts: servers
  gather_facts: false
  tasks:
  - name: deliver authorized_keys
    authorized_key:
      user: root
      key: "{{ lookup('file', '/root/.ssh/id_rsa.pub') }}"
      state: present
      exclusive: no

运行playbook:

# 管控机如果还没生成ssh key的话,执行下面的命令
ssh-keygen -t rsa
# 运行playbook
ansible-playbook upload_ssh_keys.yml

现在就可以把之前的/etc/ansible/hosts里的密码部分全部删除,只留下主机列表了。

ansible servers -m ping -o
ansible server -m shell -a "hostname"
  • linux/ansible/推送公钥.txt
  • 最后更改: 2020/01/17 10:13
  • 由 mrco