Ansible 密钥分发
Posted 系统运维分享
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Ansible 密钥分发相关的知识,希望对你有一定的参考价值。
自动化运维的概念越来越深入人心,而且随着云计算崛起,也越发重要。那么传统的自动化运维工具有Puppet、Ansible、Saltstack。各有各的优点,但是ansible是比较特别一个,他不需要agent端。Github上的热度越来越高。笔者使用Ansible确实对比起来更方便,更好玩。因为不需要agent,是通过ssh控制被控机的。所以SSH密钥免密码是最方便的认证方式。但是当机器数量很大时候手动复制公钥就很低效了。那么通过脚本来密钥分发是必不可少的。
当然,也不是十全十美的。需要以下条件或者建议。
1、客户端需要统一的管理账号xxx,密码尽量复杂些,通过密码生成器生成(不建议用root)
2、在sudoer文件中配置管理账号 :xxx ALL=(ALL) NOPASSWD:ALL
好了,接下来就是主角了。两个脚本(expect和shell)
expect 脚本:这是一个交互的脚本语言。
#!/usr/bin/expect
if { $argc !=2 } {
send_user "usege:expect fenfa_sshkey.exp file host" #这里是使用方法
exit
}
#define var
set file [lindex $argv 0] ##expect 变量的设置方法和shell不一样。
set host [lindex $argv 1]
set password "密码" ##这里是管理账号的密码,客户机都一样的。
spawn ssh-copy-id -i $file "管理账号@$host" ##spawn后面跟执行的命令
expect { ##expect顾名思义是期待的意思
"yes/no" {send "yes";exp_continue} ##期待到yes/no,就发送yes,然后继续
"*password" {send "$password"}
}
expect eof
shell脚本:对上述脚本进行循环各个客户端机器。
#!/bin/bash
. /etc/init.d/functions
for ip in `cat iplist` #这里是单独一个文件保存被控端IP
do
expect fenfa_sshkey.exp ~/.ssh/id_rsa.pub $ip #执行上述exp脚本
if [ $? -eq 0 ];then #这是一个反馈意思上一条命令成功如果是0标识成功
action "$ip" /bin/true #那么就ok。这里action是一个function函数(开头引用的)
else
action "$ip" /bin/false
fi
done
以上是关于Ansible 密钥分发的主要内容,如果未能解决你的问题,请参考以下文章