Ansible 可用于安装软件、自动执行日常任务、置备基础架构和网络组件、提高安全性和合规性、修补系统以及编排复杂的工作流,尤其是Playbook更是其核心。但是对于一些小公司来讲,其实用性就不是很普遍,通常运维工程师会通过编写shell或者Python脚本的方式实现自动化,但是若批量的管理服务器有存在一定的限制性。此文章则重点解决批量化主机管理,通过shell脚本+主机清单的方式实现类Ansible功能。
在linux运维和开发中,我们经常需要远程登录服务器进行操作,登录的过程是一个交互的过程,可能会需要输入yes/no password等信息。而Expect是建立在tcl基础上的一个工具,他的引入就解决了shell脚本中不可交互的问题。
基本命令:
spawn:启动进程,并跟踪后续交互信息
expect:判断上次输出结果里是否包含指定的字符串,有则立即返回,否则就等待超时时间后返回,只能捕捉由spawn启动的进程的输出
send:向进程发送字符串,用于模拟用户的输入
interact:执行完成后保持交互状态,把控制权交给控制台
Timeout:指定超时时间,过期则继续执行后续指令
exp_continue:允许expect继续向下执行指令
send_user:回显命令,相当于echo
$argv 参数数组:Expect脚本可以接受从bash传递的参数.可以使用[lindex $argv n]获得,n从0开始,分别表示第一个,第二个…参数
interact或expect eof结束脚本的执行
案例:实际工作可根据实际需求适当修改
1、编写主机清单
cat >> /opt/host.txt << EOF
11.11.11.10 123456
11.11.11.11 Cmp,123
11.11.11.23 nbcv,123
EOF
2、编写shell脚本(注意和主机清单文件放在同一目录下)
```
#!/bin/bash
start_time=`date +%s`
username="root"
n_dir=$(pwd)
IP_tup=($(awk -F' ' '{print $1}' $n_dir/host.txt))
KE_tup=($(awk -F' ' '{print $2}' $n_dir/host.txt))
i=0
for IP in ${IP_tup[*]}
do
for KEY in ${KE_tup[$i]}
do
{
/usr/bin/expect << EOF
set timeout 1
spawn ssh $username@$IP
expect {
"*yes/no*" { send "yes\r" }
"*password:" { send "$KEY\r" }
}
expect "*#" { send "hostname\r" }
expect "*#" { send "exit\r" }
expect eof
EOF
}&
i=`expr $1 + 1`
break
done
done
wait
stop_time=`date +%s`
total_time=`expr $stop_time - $start_time`
echo "程序实际运行时间(单位/秒):$total_time"
```
感谢阅读!