自动化运维之批量修改主机名
背景:
某行在一大数据项目中采购了一百多台服务器,客户要求服务器尽快上线,因数量较多,逐一手工登陆去修改,工作量很大,也是单调的机械劳动。鉴于此,使用脚本进行批量更改。
脚本开发思路:
考虑到在其中某一台机器上建立公钥私钥,把它的公钥一次性拷贝给其他机器,从而建立这台机器到其他机器的授信,并且,为了保证这个过程的无须手工干预,需要用expect脚本解决交互问题。
接着,使用expect脚本与shell脚本相结合的方式,对主机名字进行批量更改。为了永久修改,还需要修改其他机器的/etc/sysconfig/network 文件中的HOSTNAME字段的名称,使其与刚刚用hostname修改的主机名一致。
脚本开发步骤:
-
使用脚本生成公钥私钥,脚本如下:
#!/bin/bash
ssh-keygen -t rsa -P '' -f '/root/.ssh/id_rsa'
查看下生成的公钥私钥,命令如下:
[root@h3c .ssh]# cd /root/.ssh && ll
-
建立一个存有ip地址与主机名对应的文件,内容如下:
[root@h3c kewai]# cat /root/ip.txt
192.168.100.113,topcheer
192.168.100.114,huawei
说明:逗号是为了使用 awk -F "," 也可以使用其他的分隔符。
-
下面的expect脚本是用来拷贝公钥到其他机器的,expect脚本替我们处理了交互问题
[root@h3c kewai]# cat ssh-copy-id-batch.exp
#!/usr/bin/expect
set ip [lindex $argv 0]
set timeout 60
set password "root"
spawn ssh-copy-id -i root@$ip
expect {
"yes/no" {exp_send "yes\r";exp_continue}
"*password:" {exp_send "$password\r"}
}
expect eof
exit
-
通过下面的bash脚本调用上面的expect脚本,从而批量把公钥拷贝给其他机器
[root@h3c kewai]# cat ssh-copy-id-batch.sh
#!/bin/bash
for i in $(awk '{print $1}' /root/ip.txt)
do
ip=$(awk -v IP="$i" '{if(IP==$1) print $1}' /root/ip.txt|awk -F"," '{print $1}')
name=$(awk -v IP="$i" '{if(IP==$1) print $1}' /root/ip.txt | awk -F"," '{print $2}')
echo "name=$name"
echo $ip
expect ssh-copy-id-batch.exp $ip
done
说明:通过上面的操作,我们已经在这台机器到其他所有要改主机名的机器建立了授信,这样,从这台机器登陆到其他机器就不需要密码了。
-
使用expect脚本去修改主机名
[root@h3c kewai]# cat modify-server-name.exp
#!/usr/bin/expect
set ip [lindex $argv 0]
set name [lindex $argv 1]
set timeout 60
spawn ssh $ip /bin/hostname $name
expect eof
exit
-
通过下面的脚本去调用上面的expect脚本就可以批量修改主机名了
[root@h3c kewai]# cat modify-server-name.sh
#!/bin/bash
for i in $(awk '{print $1}' /root/ip.txt)
do
ip=$(awk -v IP="$i" '{if(IP==$1) print $1}' /root/ip.txt|awk -F, '{print $1}')
name=$(awk -v IP="$i" '{if(IP==$1) print $1}' /root/ip.txt | awk -F, '{print $2}')
expect modify-server-name.exp $ip $name
done
说明:因为hostname修改主机名是临时的,因此,需要修改/etc/sysconfig/network里面的HOSTNAME的值才能永久修改主机名,所以,我们继续编写脚本去批量修改每个机器该文件的HOSTNAME字段的值。
-
使用脚本修改主机名配置文件
[root@h3c kewai]# cat modify-server-name.2.exp
#!/usr/bin/expect
set ip [lindex $argv 0]
set name [lindex $argv 1]
#set password "root"
set timeout 60
spawn ssh $ip /bin/sed -i 's/.*/HOSTNAME=$name/g' /etc/sysconfig/network
expect eof
exit
-
再通过下面的bash脚本去调用上面的expect脚本,就可以批量永久修改主机名了
[root@h3c kewai]# cat modify-server-name.2.sh
#!/bin/bash
for i in $(awk '{print $1}' /root/ip.txt)
do
ip=$(awk -v IP="$i" '{if(IP==$1) print $1}' /root/ip.txt|awk -F, '{print $1}')
name=$(awk -v IP="$i" '{if(IP==$1) print $1}' /root/ip.txt | awk -F, '{print $2}')
expect modify-server-name.2.exp $ip $name
done
说明:expect脚本与shell脚本最好放在同一个目录下!如下:
-
为了方便使用,将脚本进行整合,整合后的脚本如下:
[root@h3c kewai]# cat plgm.sh
#!/bin/bash`
ssh-keygen -t rsa -P '' -f '/root/.ssh/id_rsa'
for i in $(awk '{print $1}' /root/ip.txt)
do
ip=$(awk -v IP="$i" '{if(IP==$1) print $1}' /root/ip.txt|awk -F"," '{print $1}')
name=$(awk -v IP="$i" '{if(IP==$1) print $1}' /root/ip.txt | awk -F"," '{print $2}')
echo "name=$name"
echo $ip
expect ssh-copy-id-batch.exp $ip
expect modify-server-name.exp $ip $name
expect modify-server-name.2.exp $ip $name
done
说明:expect脚本与shell脚本最好放在同一个目录下(黄色部分)!如下: