Shell编程利用循环生成连续的ip地址(或者连续的主机名称)
一.应用场景
个人在进行集群部署的时候为了方便集群服务器的管理,通常会编写一键启动或者一键部署的脚本,以hadoop集群为例子,网络上有很多的集群启动样本,但是基本上都是针对于3台左右的集群服务器来规定的,因为个人工作原因,常常需要部署几十台服务器,如果按照一般shell脚本,容易出现如下情况。
for host in bigdata1 bigdata2 bigdata3 bigdata4 bigdata5
bigdata6 bigdata7 bigdata8 bigdata9 bigdata10 bigdata11
bigdata12 bigdata13 bigdata14 bigdata15 bigdata16 bigdata17
bigdata18 bigdata19 bigdata20 bigdata21 bigdata22 bigdata23
bigdata24 bigdata25 bigdata26 bigdata27 bigdata28
#启动前28个集群服务
do
echo ==================== 开启$host ====================
ssh -yes $host /home/bigdata/module/hadoop-3.3.4/bin/yarn --daemon start nodemanager
ssh -yes $host /home/bigdata/module/hadoop-3.3.4/bin/hdfs --daemon start datanode
done
以上是部署28台hadoop集群的nm和dn的分发脚本,很明显,for语句后面太多服务器,看起来十分杂乱,因此需要对其进行一定程度的优化。
二.解决方案
观察host或者ip地址规律,使用while循环或者嵌套循环(当服务器大于255时需要嵌套循环),如下
#!/bin/bash
i=1
host=""
while ((i <= 100))
do
host="192.168.1.$i"
echo $host
((i++))
done
输出结果为ip为192.168.1.1-192.168.1.100
而后将echo替换为for中的执行语句
echo ==================== 开启$host ====================
ssh -yes $host /home/bigdata/module/hadoop-3.3.4/bin/yarn --daemon start nodemanager
ssh -yes $host /home/bigdata/module/hadoop-3.3.4/bin/hdfs --daemon start datanode
#!/bin/bash
i=1
host=""
while ((i <= 100))
do
host="192.168.1.$i"
echo ==================== 开启$host ====================
ssh -yes $host /home/bigdata/module/hadoop-3.3.4/bin/yarn --daemon start nodemanager
ssh -yes $host /home/bigdata/module/hadoop-3.3.4/bin/hdfs --daemon start datanode
((i++))
done
如果确定了主机名,可以将192.168.1.X更换为主机名(例如bigdataX)前提是hosts文件夹配置完毕,即可完成对应的代码优化
注意事项
这种方法只适用于连续的主机名或者ip地址的部署,如果需要部署的服务器地址不连续,可以考虑利用服务器的部署文档,将ip地址写入一个host中,定义一个连续的hostname,在编写shell语句后使用hostname调用,达到连续的效果