Ansible | 首次使用时密钥分发问题

Posted Nick技术栈

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Ansible | 首次使用时密钥分发问题相关的知识,希望对你有一定的参考价值。

Ansible,是默认基于SSH通信的。所以,登陆的时候,都要进行身份认证。当然,在我们机器比较少(两三台)的时候,可以逐个逐个输入密码,去拷贝一个密钥。当数量达到一定大的时候,就不允许我们这样去做了。那么我们有下面这几种方法:

    1、利用Ansible里面的模块+yaml来做

    2、利用export工具,利用export工具和ssh联合,免交互分发密钥

    3、利用sshpass工具,来做


下面来一个个做介绍:


 方法一:利用Ansible里面的模块+yaml来做

 

 我们需要配置的文件有

  •     /etc/ansible/hosts

  •    /etc/ansible/ansible.cfg

Step 1:/etc/ansible/hosts


要加入我们需要配置的主机组例子:[node]192.168.120.133 ansible_user=root ansible_ssh_pass="12123"192.168.120.129 ansible_user=root ansible_ssh_pass="12123"
#在没有密钥。又不想输密码的情况下。#需要把密码加上(ansible_ssh_pass)

Step 2:/etc/ansible/ansible.cfg

在七十行左右的位置#host_key_checking = False放开成为host_key_checking

不检查密钥;


Step 3:写yaml脚本

---
- hosts: node user: root tasks: - name: ssh-copy authorized_key: user=root key="{{ lookup('file', '/root/.ssh/id_rsa.pub') }}" tags: - sshkey

一定要安装格式来。yaml是严格的格式控制的语言。

hosts要和上面Step 1写的匹配!


Step 4:执行ansible-Playbook!

ansible-playbook push.ssh.yaml 

成功的输出:

Ansible | 首次使用时密钥分发问题



常见错误

[root@localhost ~]# ansible-playbook push.ssh.yaml 
PLAY [node] ***************************************************************************************************
TASK [Gathering Facts] ****************************************************************************************fatal: [192.168.120.133]: UNREACHABLE! => {"changed": false, "msg": "Failed to connect to the host via ssh: Permission denied (publickey,gssapi-keyex,gssapi-with-mic,password).", "unreachable": true}fatal: [192.168.120.129]: UNREACHABLE! => {"changed": false, "msg": "Failed to connect to the host via ssh: Permission denied (publickey,gssapi-keyex,gssapi-with-mic,password).", "unreachable": true} to retry, use: --limit @/root/push.ssh.retry
PLAY RECAP ****************************************************************************************************192.168.120.129 : ok=0 changed=0 unreachable=1 failed=0 192.168.120.133 : ok=0 changed=0 unreachable=1 failed=0

遇到这个错误的时候,要看看我们的防火墙配置是否正确,以及前面的免检查密钥配置是否正确!还有密码写得有没有问题!


Step 5:开启/etc/ansible/ansible.cfg密钥检查以及删除/etc/ansible/hosts密码

---------------/etc/ansible/ansible.cfg
# uncomment this to disable SSH key host checking#host_key_checking = False
---------/etc/hosts------------------
[node]192.168.120.133 ansible_user=root192.168.120.129 ansible_user=root

Step 6:验证!

[root@localhost ~]# ansible node -m ping

成功!!



方法二:利用export工具,利用export工具和ssh联合,免交互分发密钥:


可以参考上一篇文章



方法三:利用sshpass工具实现:


思路:编写一个shell脚本,把密码和账户以参数方式传递

echo "-----------------`date +%Y-%m-%d/%H:%M:%S`------------------" >> ./ssh_cp_log#to produce ssh-keygenexpect ./ssh1.expcat ./userlist|while read linedo ip=`echo $line|awk '{print $1}'` user=`echo $line|awk '{print $2}'` pass=`echo $line|awk '{print $3}'` sshpass -p $pass ssh-copy-id $user@$ip >> /dev/null

#check if [ $? -eq 0 ] then echo $ip had copy success>>./ssh_cp_log else echo $ip fail!>>./ssh_cp_log fidoneecho result can see in ssh_cp_log

用户列表设置:一个存在一个不存在,顺带验证!

[root@node2 send.dir]# cat userlist 192.168.120.133 root 1192.168.120.153 root 2

结果:


以上是关于Ansible | 首次使用时密钥分发问题的主要内容,如果未能解决你的问题,请参考以下文章

Ansible 密钥分发

ssh密钥分发与ansible部署指南

自动化运维Ansible安装部署及使用

自动化运维Ansible之安装部署

ansible系列4-关闭ssh首次连接时提示

ansible一键部署NFS挂载