近日,有朋友问我一个问题:群集(至少两三台以上的机器了吧..)需要同时执行相同操作比如重启服务,问我有没有什么简便的方法。我提供了两种方式
ansible方法和Shell脚本实例,需要的朋友可以参考下
一:shell脚本实现
实现思路:利用免密码(有人觉得免密码麻烦,其实一点都不麻烦,那是因为你没理解原理,这里我就不讲原理了)ssh到目标机器执行命令
前提知识
ssh执行远程操作命令格式代码如下:
ssh -t -p$port $user@$ip “cmd”
$port : ssh连接端口号
$user: ssh连接用户名
$ip:ssh连接的ip地址
-t :提供一个远程服务器的虚拟tty终端
cmd:远程服务器需要执行的操作
附其他参数:
1 ConnectTimeout=3 连接时超时时间,3秒
2 ConnectionAttempts=5 连接失败后重试次数,5次
3 PasswordAuthentication=no 是否使用密码认证,(在遇到没做信任关系时非常有用,不然会卡在那里)
4 StrictHostKeyChecking=no 第一次登陆服务器时自动拉取key文件,(跟上面一样,并且在第一次ssh登陆时,自动应答yes)
5 ServerAliveInterval=60 设置保持连接时间,即为了保持会话,每隔60s向服务端发一次信号。
准备工作
基于公私钥认证或者用户名密码认证能确保登录到远程服务器(有点基本运维知识的人做这个事情都不是问题)
cmd如果是脚本,注意绝对路径问题(相对路径在远程执行时就是坑)
配置ssh免登录:
首先找一台管理机(随便那台机器什么配置都可以,只要能和远程执行的机器通信就行)
(1)ssh-keygen -t rsa. ###生成公钥/私钥对
不足
这个命令可以满足我们大多数的需求,但是通常运维部署很多东西的时候需要root权限,但是有几处限制:
远程服务器禁止root用户登录
在远程服务器脚本里转换身份用expect需要send密码,操作繁琐,不够安全
示例脚本
#!/bin/bash
#变量定义
ip_array=("192.168.0.162") ##主机列表可以写在括号里,多个主机空格分割,也可以写个文件-主机清单
user="root"
remote_cmd="/etc/init.d/sshd restart"
port="22"
#本地通过ssh执行远程服务器的脚本
for ip in $
do
ssh -t -p$ $@$ "$" >> /var/log/ssh.log
done
二:利用Ansible实现
ansible安装(原理这里就不在赘述了,不懂的小伙伴自行百度)
ansible只是一个进程 不需要添加数据库也不需要启动和运行守护进程它只是一个进程你可以轻松使用它安装在任何一点主机上面(除了windows)ansible管理机不能安装到windows上面
版本的选择 因为2.0有非常大的改进 一般都会使用2.0以上的版本
控制机的要求 因为ansible是python写的 所以需要在安装了python2.6或者2.7以上的python版本才可以安装
管理节点的要求 需要安装ssh python版本在2.5以上
安装有3个方式
wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-6.repo(下载yum源)
yum -y install ansible
pip install ansible
从github下载
准备工作
ansible是基于ssh工作的,所以配置免密码登录是必需的!参考上个方法配置
ansible执行
4.1测试主机连通性
修改主机和配置
命令行参数
###声明:本文章操作性简单,理论知识不强,仔细看都能看懂,只适用于实验和小型维护, 大神请路过!!!谢谢支持
领取专属 10元无门槛券
私享最新 技术干货