Ansible 前传(密钥分发)(ansible_become_user)

Ansible 前传(密钥分发)(ansible_become_user)

解决方案goocz2025-02-01 11:08:2028A+A-

自动化运维的概念越来越深入人心,而且随着云计算崛起,也越发重要。那么传统的自动化运维工具有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\n" #这里是使用方法

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\r";exp_continue} ##期待到yes/no,就发送yes,然后继续

"*password" {send "$password\r"}

}

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

每天三分钟,知识效率高。轻文章,更高效。

欢迎关注同名微信公众账号DevOps24h。

点击这里复制本文地址 以上内容由goocz整理呈现,请务必在转载分享时注明本文地址!如对内容有疑问,请联系我们,谢谢!

果子教程网 © All Rights Reserved.  蜀ICP备2024111239号-5