shell脚本批量配置多台主机静态ip
关于脚本
服务器使用之前,都需要先配置静态IP
,那就将这种简单重复
的工作,交给脚本来处理吧,让我们运维有更多的时间喝茶看报刷微博
脚本使用
sh ssh.sh ip.txt
ssh.sh
为脚本的名称,自行设定,不是固定项ip.txt
为ip、密码、主机名的记录文件,文件名称可以自行设定,不是固定项,内容格式如下:
192.168.72.46 123.com k8s-01
192.168.72.47 123.com k8s-02
192.168.72.48 123.com k8s-03
192.168.72.49 123.com k8s-04
192.168.72.50 123.com k8s-05
- 注:ip、密码、主机名之间的间距为
一个空格
,脚本内的切割命令,指定的分隔符
也是一个空格
,请注意文本格式
注意项目
- 此脚本配置了
单向免密
- 此脚本配置了
hosts解析
- 此脚本修改了
hostname
- 此脚本会
重启网卡
服务 - 此脚本会用到
expect
,请提前安装 - 此脚本目前适用于
suse
、centos
、redhat
发行版,其他发行版,后面继续更新
(我的测试环境是suse 12 sp3、centos 7.7、redhat 7、fedora 32) - 此脚本会
删除脚本所在目录下
的所有.template结尾的文件
,建议脚本放到干净的目录
执行 - 此脚本内定义了以下
固定变量
,请根据自身情况进行修改:CARDNAME
为网卡名称(ip a
或者ifconfig
查看)GATEWAY
为网关,CentOS网卡配置文件内的DNS1
默认为和网关IP一致
NETMAST
为子网掩码前缀domain_template
函数内,写了几个常用的国内dns服务器
,可以自行修改或删减
脚本正文
#!/usr/bin/env bash
PWD=$(cd $(dirname $0) ; pwd)
FILENAME=$1
CARDNAME='eth0'
GATEWAY='192.168.72.2'
NETMASK='24'
# 检查linux发行版,suse和centos的网卡配置文件所在目录是不一样的
function check_os (){
RELEASE=$(grep PRETTY_NAME /etc/os-release | awk -F '"' '{print $2}' | awk '{print $1}')
if [ ${RELEASE} == "SUSE" ]
then
printf "[\e[0;35mINFO\e[0m]\e[0;35mYour system is ${RELEASE}\e[0m\n"
ifcfg_dir='/etc/sysconfig/network'
fi
if [ ${RELEASE} == "CentOS" ] || [ ${RELEASE} == "Red" ] || [ ${RELEASE} == "Fedora" ]
then
printf "[\e[0;35mINFO\e[0m]\e[0;35mYour system is ${RELEASE}\e[0m\n"
ifcfg_dir='/etc/sysconfig/network-scripts/'
fi
}
# 检查ip.txt文件是否创建了,以及执行方式是否正确
function check_file (){
if [ ! -n "${FILENAME}" ]; then
printf "[\e[0;31mERROR\e[0m]\e[0;35m No host ip address account file supplied !!!\e[0m\n"
printf "[\e[0;35mUsage\e[0m] $0 [\e[0;35mip.txt\e[0m]\n"
exit 1
fi
IPADDRESS=()
PASSWORDS=()
HOSTNAMES=()
while read line
do
ip_addres=$(echo ${line} | cut -d " " -f1)
pass_word=$(echo ${line} | cut -d " " -f2)
host_name=$(echo ${line} | cut -d " " -f3)
IPADDRESS[${#IPADDRESS[*]}]=${ip_addres}
PASSWORDS[${#PASSWORDS[*]}]=${pass_word}
HOSTNAMES[${#HOSTNAMES[*]}]=${host_name}
done < ${FILENAME}
}
# 配置ssh免密
function ssh_auth () {
[ -d /root/.ssh ] && mv /root/.ssh{,.bak.`date +%F`}
ssh-keygen -t rsa -P "" -f /root/.ssh/id_rsa -q > /dev/null 2>&1
for ((i = 0; i < ${#IPADDRESS[@]}; i++))
do
ip_addres=${IPADDRESS[$i]}
pass_word=${PASSWORDS[$i]}
printf "[\e[0;35mINFO\e[0m]\e[0;35m${ip_addres}\e[0m\n"
expect -c "
spawn ssh-copy-id -i /root/.ssh/id_rsa.pub root@${ip_addres}
expect {
\"*yes/no*\" {send \"yes\r\"; exp_continue}
\"*assword*\" {send \"${pass_word}\r\"; exp_continue}
\"*assword*\" {send \"${pass_word}\r\";}
}"
done
}
# 创建hosts文件模板
function hosts_template () {
for ((i = 0; i < ${#IPADDRESS[@]}; i++))
do
ip_addres=${IPADDRESS[$i]}
host_name=${HOSTNAMES[$i]}
echo "${ip_addres} ${host_name}" >> ${PWD}/hosts.template
done
printf "[\e[0;35mINFO\e[0m]\e[0;35mhosts_template Completed\e[0m\n"
}
# 生成网卡配置文件模板
function ifcfg_template () {
if [ ${RELEASE} == "SUSE" ]
then
for ((i = 0; i < ${#IPADDRESS[@]}; i++))
do
ip_addres=${IPADDRESS[$i]}
sed -e "s%^IPADDR=.*%IPADDR=\'${ip_addres}/${NETMASK}\'%g" \
/etc/sysconfig/network/ifcfg-${CARDNAME} \
> ${PWD}/ifcfg-${CARDNAME}-${ip_addres}.template
done
printf "[\e[0;35mINFO\e[0m]\e[0;35mifcfg_template Completed\e[0m\n"
fi
if [ ${RELEASE} == "CentOS" ] || [ ${RELEASE} == "Red" ] || [ ${RELEASE} == "Fedora" ]
then
cat > ${PWD}/ifcfg-${CARDNAME}.template <<EOF
TYPE="Ethernet"
PROXY_METHOD="none"
BROWSER_ONLY="no"
BOOTPROTO="none"
DEFROUTE="yes"
IPV4_FAILURE_FATAL="no"
NAME="${CARDNAME}"
DEVICE="${CARDNAME}"
ONBOOT="yes"
IPADDR=""
PREFIX=""
GATEWAY=""
DNS1=""
EOF
for ((i = 0; i < ${#IPADDRESS[@]}; i++))
do
ip_addres=${IPADDRESS[$i]}
sed -e "s%^IPADDR=.*%IPADDR=\"${ip_addres}\"%g" \
-e "s%^PREFIX=.*%PREFIX=\"${NETMASK}\"%g" \
-e "s%^GATEWAY=.*%GATEWAY=\"${GATEWAY}\"%g" \
-e "s%^DNS1=.*%DNS1=\"${GATEWAY}\"%g" \
-e "s%^DEVICE=.*%DEVICE=\"${CARDNAME}\"%g" \
-e "s%^NAME=.*%NAME=\"${CARDNAME}\"%g" ${PWD}/ifcfg-${CARDNAME}.template \
> ${PWD}/ifcfg-${CARDNAME}-${ip_addres}.template
done
printf "[\e[0;35mINFO\e[0m]\e[0;35mifcfg_template Completed\e[0m\n"
fi
}
# 生成网关配置文件模板
function ifroute_template () {
if [ ${RELEASE} == "SUSE" ]
then
echo "default ${GATEWAY} - ${CARDNAME}" > ${PWD}/ifroute-${CARDNAME}.template
fi
printf "[\e[0;35mINFO\e[0m]\e[0;35mifroute_template Completed\e[0m\n"
}
# 生成DNS配置文件模板
function domain_template () {
cat > ${PWD}/resolv.conf.template <<EOF
nameserver 101.6.6.6
nameserver 223.5.5.5
nameserver 119.29.29.29
nameserver 180.76.76.76
nameserver 114.114.114.114
EOF
printf "[\e[0;35mINFO\e[0m]\e[0;35mdomain_template Completed\e[0m\n"
}
# 分发模板文件到其他节点
function scp_template () {
for ((i = 0; i < ${#IPADDRESS[@]}; i++))
do
ip_addres=${IPADDRESS[$i]}
host_name=${HOSTNAMES[$i]}
if [ ${RELEASE} == "SUSE" ]
then
scp ${PWD}/hosts.template ${ip_addres}:/etc/ > /dev/null
scp ${PWD}/ifcfg-${CARDNAME}-${ip_addres}.template ${ip_addres}:${ifcfg_dir}/ifcfg-${CARDNAME} > /dev/null
scp ${PWD}/ifroute-${CARDNAME}.template ${ip_addres}:${ifcfg_dir}/ifroute-${CARDNAME} > /dev/null
scp ${PWD}/resolv.conf.template ${ip_addres}:/etc/ > /dev/null
ssh root@${ip_addres} "cat /etc/hosts.template >> /etc/hosts && rm -f /etc/hosts.template"
ssh root@${ip_addres} "cat /etc/resolv.conf.template >> /etc/resolv.conf && rm -f /etc/resolv.conf.template"
ssh root@${ip_addres} "hostnamectl set-hostname --static ${host_name}"
printf "[\e[0;35mINFO\e[0m]\e[0;35m${ip_addres} scp_template Completed\e[0m\n"
fi
if [ ${RELEASE} == "CentOS" ] || [ ${RELEASE} == "Red" ] || [ ${RELEASE} == "Fedora" ]
then
scp ${PWD}/hosts.template ${ip_addres}:/etc/ > /dev/null
scp ${PWD}/ifcfg-${CARDNAME}-${ip_addres}.template ${ip_addres}:${ifcfg_dir}/ifcfg-${CARDNAME} > /dev/null
scp ${PWD}/resolv.conf.template ${ip_addres}:/etc/ > /dev/null
ssh root@${ip_addres} "cat /etc/hosts.template >> /etc/hosts && rm -f /etc/hosts.template"
ssh root@${ip_addres} "cat /etc/resolv.conf.template >> /etc/resolv.conf && rm -f /etc/resolv.conf.template"
ssh root@${ip_addres} "hostnamectl set-hostname --static ${host_name}"
printf "[\e[0;35mINFO\e[0m]\e[0;35m${ip_addres} scp_template Completed\e[0m\n"
fi
done
}
# 重启network服务
function restart_network () {
if [ ${RELEASE} == "SUSE" ]
then
for ((i = 0; i < ${#IPADDRESS[@]}; i++))
do
ip_addres=${IPADDRESS[$i]}
ssh root@${ip_addres} "systemctl restart network && \
ping www.baidu.com -c 1 | awk 'NR == 2'"
printf "[\e[0;35mINFO\e[0m]\e[0;35m${ip_addres} restart_network Completed\e[0m\n"
done
fi
if [ ${RELEASE} == "CentOS" ] || [ ${RELEASE} == "Red" ] || [ ${RELEASE} == "Fedora" ]
then
for ((i = 0; i < ${#IPADDRESS[@]}; i++))
do
ip_addres=${IPADDRESS[$i]}
ssh root@${ip_addres} "systemctl restart NetworkManager && \
ping www.baidu.com -c 1 | awk 'NR == 2'"
printf "[\e[0;35mINFO\e[0m]\e[0;35m${ip_addres} restart_network Completed\e[0m\n"
done
fi
}
function main () {
check_os
check_file
hosts_template
ifcfg_template
ifroute_template
domain_template
ssh_auth
scp_template
restart_network
rm -f ${PWD}/*.template
}
main
shell脚本批量配置多台主机静态ip的更多相关文章
- 一键配置树莓派wifi、静态ip等
系统老是被我玩坏,重新烧录系统后配置又太麻烦,用shell脚本一键配置一下wifi和静态IP #!/bin/bash touch /media/fanghaoyu/boot/ssh echo &quo ...
- shell脚本批量ssh登陆主机并执行命令
shell脚本批量ssh登陆主机并执行命令 今天在客户现场遇到了这个问题,客户没有管理工具,无法批量登陆主机下发命令,几个个C段啊,让我一个一个登陆,.................. 所以写了个s ...
- Linux shell脚本 批量创建多个用户
Linux shell脚本 批量创建多个用户 #!/bin/bash groupadd charlesgroup for username in charles1 charles2 charles3 ...
- Shell 脚本批量创建数据库表
使用 Shell 脚本批量创建数据表 系统:Centos6.5 64位 MySQL版本:5.1.73 比如下面这个脚本: #!/bin/bash #批量新建数据表 for y in {0..199}; ...
- shell脚本批量执行命令----必需判断上一步执行结果--没有捷径
# 注意:shell脚本批量执行命令,不能只写一个函数,然后把所有命令复制进去,之前试过这样是不行的.必须要有一个判断命令执行成功与否的语句 # 简单的命令可以不加结果判断符号,但是遇到解压包.sed ...
- shell脚本批量开启防火墙端口
# 注意:shell脚本批量执行命令,不能只写一个函数,然后把所有命令复制进去,之前试过这样是不行的.必须要有一个判断命令执行成功与否的语句 # 简单的命令可以不加结果判断符号,但是遇到解压包.sed ...
- linux系统配置文件或shell脚本批量注释
1. 配置文件批量注释 1.1 批量注释 ① 进入命令行模式,按ctrl + v进入 visual block模式,键盘上下箭头选中多行,把需要注释的行标记起来 ② 按大写字母I,再输入注释符:# ③ ...
- ubuntu Server 设置主机静态 ip地址
ubuntu Server 设置主机静态 ip地址 1:先输入 ifconfig 查看当前网络配置 2:然后关闭 eth0 网卡 sudo ifdown eth0 3:配置静态ip sudo vim ...
- CentOS7Linux中自动化运维工具Ansible的安装,以及通过模块批量管理多台主机
使用自动化运维工具Ansible集中化管理服务器 Ansible概述 Ansible是一款为类Unix系统开发的自由开源的配置和自动化工具.它用Python写成,类似于saltstack和Puppet ...
随机推荐
- JS 判断上传文件类型
var video_src_file = $("#video_src_file").val(); var fileTypes = new Array("flv" ...
- Could not find resource mybatis.xml 找不到mybatis主配置文件的三种解决方式
第一种:先清除target目录 再重新compile编译 第二种:让idea重构项目 第三种 :手动添加到target目录下的classes包下
- springBoot--原理分析
起步依赖分析 分析spring-boot-starter-parent 按住Ctrl点击pom.xml中的spring-boot-starter-parent,跳转到了spring-boot-star ...
- 【刷题-LeetCode】123 Best Time to Buy and Sell Stock III
Best Time to Buy and Sell Stock III Say you have an array for which the ith element is the price of ...
- porcupine语音唤醒python实现
note it is not for arm pyaudio <= 3.6 version porcupine 3.5 3.6 not 3.7 code import struct import ...
- 从服务之间的调用来看 我们为什么需要Dapr
Dapr 相关的文章我已经写了20多篇了[1] . 当向其他人推荐Dapr 的时候,需要回答的一个问题就是: Dapr 似乎并不是特别令人印象深刻.它提供了一组"构建块",解决了与 ...
- 【然天一】随机读写(4k)百盘天梯
随机读写适用于大量小文件的读写,是最贴近办公和编程的使用场景.现在很多硬盘厂商只宣传它们的连续读写(Seq),但除了游戏和视频剪辑场景之外并没有什么卵用. 总结一下: 傲腾秒杀全部 NAND SLC ...
- AT2644 [ARC076C] Connected?
可以发现这个问题是存在边界的,那么我们可以先放宽一下条件思考一下没有边界的情况. 通过手玩可以发现,若不存在边界总是可以完成这个任务的. 因为两条曲线之间不存在交点,那么每次我们可以从空隙穿过一条直线 ...
- AT3913 XOR Tree
经过长时间的思考,我发现直接考虑对一条链进行修改是很难做出本题的,可能需要换一个方向. 可以发现本题中有操作的存在,是没有可以反过来做的做法的,因此正难则反这条路应该走不通. 那么唯一的办法就是简化这 ...
- 理解java线程的中断(interrupt)
一个线程在未正常结束之前, 被强制终止是很危险的事情. 因为它可能带来完全预料不到的严重后果比如会带着自己所持有的锁而永远的休眠,迟迟不归还锁等. 所以你看到Thread.suspend, Threa ...