Jesse's home


  • 首页

  • 关于

  • 标签

  • 分类

  • 归档

kvm自动创建虚拟机,自定义IP地址

发表于 2020-06-30 | 分类于 Linux-Basic , shell&shell脚本 |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
#!/bin/bash
#通过KVM模板自动化创建虚拟机(需要电脑中存在模板).以及创建完虚拟机后,自动修改IP地址
#该脚本需要以root身份执行


#镜像和模板源文件
src_img_path=/opt/vmx/linux/hadoop.dev.base.img
src_xml_path=/etc/libvirt/qemu/hadoop.dev.base.xml

#镜像和模板源文件父目录
prefix_img_path=/opt/vmx/linux
prefix_xml_path=/etc/libvirt/qemu

#获取新虚拟机名称
get_newname(){
while true
do
read -p "请输入新虚拟机名称(主机名):" newname
if [ $newname ];then
if `virsh list --all | grep "\b${newname}\b"`;then
echo "该虚拟机已经存在.请检查系统当前虚拟机"
else

#设置新虚拟机镜像和模板路径
new_img_path=${prefix_img_path}/${newname}.qcow2
new_xml_path=${prefix_xml_path}/${newname}.xml
break
fi
else
echo "************"
echo "请输入虚拟机主机名!"
echo "************"
fi
done
}
#设置新虚拟机内存
get_newmemary(){
while true
do
current_free_mem=`free -g|awk '/^Mem/{print $4}'`
mem_total=`free -g|awk '/^Mem/{print $2}'`
echo "目前本机内存总大小:${mem_total}g"
echo "当前空闲内存大小为:${current_free_mem}g"
read -p "请输入新虚拟机内存大小(单位G):" newmemary
if [ $newmemary ];then
if [[ $newmemary < $mem_total ]];then
break
else
echo "**********************************"
echo "输入的数值必须小于当前内存总大小!"
echo "**********************************"
fi
else
echo "********************"
echo "请输入新虚拟机内存!"
echo "********************"
fi
done
}
#设置新虚拟机CPU
get_newcpu(){
while true
do
core=`cat /proc/cpuinfo| grep "processor"| wc -l`
echo "可用core个数:${core}"
read -p "请输入新虚拟机处理器核数:" newcpu
if [ $newcpu ];then
if [ $newcpu -le $core ];then
break
else
echo "******************************"
echo "不能超过可用个数或者输入错误!"
echo "******************************"
fi
else
echo "**************"
echo "输入不能为空!"
echo "**************"
fi
done
}

#设置IP
get_ip(){

while true
do
read -p "请输入新虚拟机的IP地址(格式:172.16.10.[2-240]):" ip
if `echo $ip| grep -E "172.16.10.[0-9]{1,3}$" > /dev/null 2>&1`;then
ipaddr=$(echo $ip | awk -F "." '{print $4}')
#valid_check=$(echo $ip | awk -F "." '2<$4 && $4<241 {print "yes"}')
#if [ "$valid_check" == "yes" ];then
if [ $ipaddr -gt 2 -a $ipaddr -lt 241 ];then
if ! `ping -W 3 -c 1 $ip > /dev/null 2>&1`;then
break

else
echo "当前IP已经被占用,请重新输入"

fi

else
echo "IP地址必须要在2-240之间"

fi

else
echo "IP地址格式不对,请重新输入"

fi
done


}

#复制模板、xml
copy_model_xml(){
cp $src_img_path $new_img_path
cp $src_xml_path $new_xml_path
}
#修改xml文件
modification_xml(){
uuid=`uuidgen`
sed -ri "s/(<name>).*(<\/name>)/\1${newname}\2/" $new_xml_path
sed -ri "s/(<uuid>).*(<\/uuid>)/\1${uuid}\2/" $new_xml_path
mem_kb=$((${newmemary}*1024*1024))

sed -ri "s/(<memory.*>).*(<\/memory>)/\1${mem_kb}\2/" $new_xml_path
sed -ri "s/(<currentMemory.*>).*(<\/currentMemory>)/\1${mem_kb}\2/" $new_xml_path
sed -ri "s/(<vcpu.*>).*(<\/vcpu>)/\1${newcpu}\2/" $new_xml_path
sed -ri "s@(<source file=').*('\/>)@\1${new_img_path}\2@" $new_xml_path #定义新虚拟机的xml文件路径

sed -i "s@port='5930'@port='"59${ipaddr}"'@" $new_xml_path #配置VNC端口号.格式59+ip地址最后一位
mac_addr=`openssl rand -hex 3 | sed -r 's/..\B/&:/g'` #生成一个随机的MAC地址

sed -ri "s/(<mac address='..:..:..:).*('\/>)/\1${mac_addr}\2/" $new_xml_path #配置MAC地址
}
#define
define_vm(){
virsh define $new_xml_path #从xml文件中生成新虚拟机
echo "**********"
echo "${newname}建完成!"
echo "**********"
}

network_setting(){

#该脚本使用guestmount工具,Centos7中安装libguestfs-tools-c可以获得guestmount工具
#脚本在不登陆虚拟机的情况下,修改虚拟机的IP地址信息

mountpath="/tmp/${newname}"
[ ! -d $mountpath ] && mkdir $mountpath

guestmount -d ${newname} -i $mountpath

#修改IP地址: 注意这里要通过这种方式才能修改IP..不能使用sed命令直接修改原文件,否则虚拟机启动后无法识别ifcfg-eth0文件
cat > ${mountpath}/etc/sysconfig/network-scripts/ifcfg-eth0 << EOF
TYPE=Ethernet
PROXY_METHOD=none
BROWSER_ONLY=no
BOOTPROTO=static
DEFROUTE=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_FAILURE_FATAL=no
IPV6_ADDR_GEN_MODE=stable-privacy
NAME=eth0
DEVICE=eth0
ONBOOT=yes
IPADDR=$ip
NETMASK=255.255.255.0
GATEWAY=172.16.10.254
DNS1=114.114.114.114
EOF
#sed -i "/IPADDR/s@.*@IPADDR=${ip}@" ${mountpath}/etc/sysconfig/network-scripts/ifcfg-eth0
#修改主机名
echo "${newname}" > ${mountpath}/etc/hostname

echo "虚拟主机IP地址和主机名配置完成"

#卸载临时挂载目录
umount /tmp/${newname}

#删除临时挂载目录
rm -rf /tmp/${newname}

}
#------------运行分界线------------------------------------

get_newname
get_newmemary
get_newcpu
get_ip
copy_model_xml
modification_xml
define_vm
network_setting

参考 https://blog.csdn.net/qq_41814635/article/details/82256970

分析统计Nginx日志的响应时间

发表于 2020-06-30 | 分类于 Linux-Basic , shell&shell脚本 |

分析统计Nginx日志的响应时间

Nginx日志格式如下:

1
2
3
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" $http_x_forwarded_for "$request_time"';

实际日志如下:

1
2
3
4
5
6
7
8
9
10
11
[work@iqg-yyq2 ~]$ head  /data/logs/nginx/iqg_api_v5.access.log
100.97.74.45 - - [11/Mar/2019:03:46:01 +0800] "HEAD / HTTP/1.0" 200 0 "-" "-" - "0.001"
100.117.85.154 - - [11/Mar/2019:03:46:01 +0800] "HEAD / HTTP/1.0" 200 0 "-" "-" - "0.001"
100.97.74.22 - - [11/Mar/2019:03:46:02 +0800] "HEAD / HTTP/1.0" 200 0 "-" "-" - "0.002"
100.117.85.96 - - [11/Mar/2019:03:46:02 +0800] "HEAD / HTTP/1.0" 200 0 "-" "-" - "0.001"
100.117.85.133 - - [11/Mar/2019:03:46:02 +0800] "HEAD / HTTP/1.0" 200 0 "-" "-" - "0.001"
100.117.85.172 - - [11/Mar/2019:03:46:02 +0800] "HEAD / HTTP/1.0" 200 0 "-" "-" - "0.002"
100.97.74.0 - - [11/Mar/2019:03:46:02 +0800] "HEAD / HTTP/1.0" 200 0 "-" "-" - "0.001"
100.97.73.184 - - [11/Mar/2019:03:46:02 +0800] "HEAD / HTTP/1.0" 200 0 "-" "-" - "0.001"
100.117.85.85 - - [11/Mar/2019:03:46:02 +0800] "HEAD / HTTP/1.0" 200 0 "-" "-" - "0.001"
100.97.74.62 - - [11/Mar/2019:03:46:02 +0800] "HEAD / HTTP/1.0" 200 0 "-" "-" - "0.001"

最后一行为响应时间.但是是个字符串,还不能直接用awk来统计

下面这个脚本用来统计响应时间:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27

#!/bin/bash

[ $# -ne 2 ] && echo "Usage: ./loganalysis.sh two parameters: logfile path and cost time" && exit 0

[ ! -f "$1" ] && echo "the file doesn't exsit,please check again" && exit 0
logfile=$(basename $1)

[ "$2" -lt 0 ] && echo " the second parameter is not a digit" && exit 0
cost_time=$2

cat $1 | awk '{print $NF}' | awk -F "\"" '{print $2}' > time.txt
echo "split request_time over!!!"

paste -d " " $1 time.txt > new.log
echo "build new logfile over!!!"

awk '($NF>'$cost_time'){print $0}' new.log > slow-${logfile}
echo "please see slowtime in slow-${logfile}"

rm -f time.txt
rm -f new.log

# analyze the access frequence of API

echo "#############the access frequence of API ##################"
awk '{++S[$4]} END { for (i in S) print "URL:"i "\t" "access times:"S[i]}' slow-${logfile}

下面是统计iqg_api_v5.access.log这个日志响应时间超过1秒的记录

1
2
3
4
5
[work@iqg-yyq2 ~]$ ./loganalysis.sh /data/logs/nginx/iqg_api_v5.access.log 1
split request_time over!!!
build new logfile over!!!
please see slowtime in slowtime.txt!!!
[work@iqg-yyq2 ~]$

查看最终结果:

1
2
3
4
5
6
7
8
9
10
11
12
work@iqg-yyq2 ~]$ head slowtime.txt
100.117.85.64 [11/Mar/2019:14:14:15 "HEAD / 1.223
100.97.74.41 [11/Mar/2019:14:14:16 "HEAD / 1.984
100.97.74.104 [11/Mar/2019:14:14:16 "HEAD / 1.880
100.97.74.5 [11/Mar/2019:14:14:16 "HEAD / 1.758
100.117.85.100 [11/Mar/2019:14:14:16 "HEAD / 1.757
100.97.73.213 [11/Mar/2019:14:14:16 "HEAD / 1.767
100.117.85.160 [11/Mar/2019:14:14:16 "HEAD / 1.662
100.97.74.118 [11/Mar/2019:14:14:16 "HEAD / 1.566
100.97.73.141 [11/Mar/2019:14:14:16 "HEAD / 1.215
100.117.56.238 [11/Mar/2019:14:14:16 "HEAD / 1.132
[work@iqg-yyq2 ~]$

将服务器日志归档到阿里云OSS的脚本

发表于 2020-06-30 | 分类于 Linux-Basic , shell&shell脚本 |

将服务器日志归档到阿里云OSS的脚本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
#!/bin/bash
#Descripion: upload trade center logs file to Aliyun OSS
#Author: HuangYong
#date: 2019-04-29

buket=mg-tradecenter-log-archived #OSS Buket name
year=$(date +%Y) #年份
year_dir=log-archived-${year} #OSS年份目录
month=$(date +%m) #月份
ossutil64_dir=/home/work

yesterday_logtime=$(date +%Y%m%d --date="-1 day") #upload yeasterday logfile
log_dir=/data/logs/apps/trade-center/trade-center # tradecenter log file parent dir
log_prefix="trade-center.log" #logfile prefix
hostname=api1 #tradecenter server

#判断是否安装ossutil64工具
[ ! -f "/home/work/ossutil64" ] && echo "请安装ossutil64软件" && exit 1

#判断年份目录是否存在,不存在则创建
if ! `${ossutil64_dir}/ossutil64 ls oss://${buket}/${year_dir}/ > /dev/null 2>&1`;then
${ossutil64_dir}/ossutil64 mkdir oss://${buket}/${year_dir}/
fi

#判断月份目录是否存在,不存在则创建
if ! `${ossutil64_dir}/ossutil64 ls oss://${buket}/${year_dir}/${month} > /dev/null 2>&1`;then
${ossutil64_dir}/ossutil64 mkdir oss://${buket}/${year_dir}/${month}/
fi


# 打包昨天的日志文件

cd $log_dir

for log_type in "debug" "error" "netrcd-admin" "netrcd-callback" "netrcd-gateway" "netrcd-notify" "script";do

log_name="${log_prefix}.${log_type}.$yesterday_logtime"
if [ -f $log_name ];then
tar -zc -f ${hostname}.${log_name}.tar.gz $log_name
fi
done

# 上传文件到OSS

${ossutil64_dir}/ossutil64 cp $log_dir --include="${hostname}*.tar.gz" -r -f oss://${buket}/${year_dir}/${month}/

#上传完成后,删除打包的日志
[ $? == 0 ] && rm -f $log_dir/${hostname}*

docker学习笔记---docker-compose

发表于 2020-06-29 | 分类于 docker |

docker学习笔记——docker-compose

docker compose 定义并且运行多个docker容器.使用YAML风格文件定义一个compose文件.利用compose文件创建和启动所有服务.

使用docker compose基本只需要3个步骤

  • 在Dockerfile文件定义app环境
  • 在docker-compose.yml文件中定义组成app的各个服务
  • run docker-compose up 和compose 启动和运行app

下面文档均可以在docker-compose官方找到详细资料:docker-compose

docker-compose安装

阅读全文 »

docker学习笔记---Docker镜像篇

发表于 2020-06-29 | 分类于 docker |

docker笔记——镜像篇

介绍

docker镜像是一个只读的Docker容器模板.含有启动docker容器所需的文件系统结构以及内容.因此是启动一个容器的基础.docker镜像的文件内容以及一些运行docker容器的配置文件组成了docker容器的静态文件运行环境—rootfs.

可以这么理解,docker镜像是docker容器的静态视角.docker容器是docker镜像的运行状态


1.rootfs

rootfs是docker容器的根目录.如:/dev,/proc,/bin,/etc …….传统的Linux容器操作系统内核启动时,首先挂载一个只读(read-only)的rootfs.当系统检测到完整性后,再将其切换到读写(read-write)模式.而在docker架构中.也沿用了Linux内核的启动方法.在docker为容器挂载rootfs时,将rootfs设置为只读模式,挂载完毕后,在已有的只读rootfs上再挂载一个读写层.

读写层位于docker容器文件系统的最顶层.下面可能挂载了多个只读层.

阅读全文 »

docker学习笔记---docker容器篇

发表于 2020-06-29 | 分类于 docker |

docker学习笔记— docker容器篇

一.创建并启动容器

  • 创建容器
1
docker create -it 镜像名:tag
  • 查看所有容器(包括运行中,已退出,错误容器)
1
docker ps -a
  • 查看所有容器的ID
1
docker ps -qa
  • 启动容器
1
docker start container_id
  • 使用指定的镜像直接创建并启动容器
1
2
3
4
docker run -it 镜像名:标签 COMMAND

jesse@jesse-virtual-machine:~$ docker run -it ubuntu:16.04 /bin/bash
root@66a29f973548:/# ----------此时已经进入到容器的bash环境
阅读全文 »

docker学习笔记---docker网络之overlay

发表于 2020-06-29 | 分类于 docker |

docker官网学习-7.docker网络之overlay

介绍

overlay网卡在多个docker宿主机之间创建一个分布式的网络,允许多个容器安全通信.

当初始化一个swarm集群,或者加入docker宿主机到一个swarm集群中.Docker会在该宿主机上创建2个网络:

  • ingress: 负责swarm集群的控制以及数据流量
  • docker_gwbridge:一个Bridge网络,负责连接swarm集群中的每个docker节点

overlay网络的创建方式和bridge一样.也是docker network create命令


创建overlay网络

阅读全文 »

docker学习笔记---理解swarm集群

发表于 2020-06-29 | 分类于 docker |

理解swarm集群

一个swarm是一组运行docker服务器的的集群,docker服务器可以是物理机也可以是虚拟机.

swarm manager可以使用多种策略来运行容器.比如”emptiest node”—部署容器到压力最小的服务器上,或者”global”—确保每台服务器都只允许一个容器实例.你可以在Compose文件中指示swarm manager去选择何种策略

swarm managers是swarm进群中唯一可以执行命令,或者授权其他服务器以”workers”身份加入swarm集群的服务器.


初始化swarm,加入节点

试验环境:

1.10.0.0.50 —swarm manager
2.10.0.0.12 —worker 节点

  • 初始化swarm,并且指定通告的IP
阅读全文 »

docker学习笔记---docker网络之bridge

发表于 2020-06-29 | 分类于 docker |

docker官网学习–docker网络之bridge

本节介绍docker基础网络概念.以便能认识和利用各种不同的网络类型功能.

docker的网络支持插件化,驱动化定制.有一些网络驱动已经默认集成到docker中.docker网络主要有以下类型

  • bridge
  • host
  • overlay
  • macvlan
  • none
  • 其他网络插件

阅读全文 »

docker学习笔记---学习Docker Stack

发表于 2020-06-29 | 分类于 docker |

学习Docker Stack

介绍

一个stack是一组共享依赖包的多个相关的services,并且可以编排和扩展.其实从第4小节开始,在利用compose文件部署app时,就已经开始一直使用stack.但是还只是运行在一个单一服务器的单一service.
现在,你可以学习在多个服务器上,运行多个相关的services.


  • 使用下面的docker-compose.yml文件替换第4小节中的docker-compose.yml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
version: "3"
services:
web:
# replace username/repo:tag with your name and image details
image: ianch/friendlyhello:v1
deploy:
replicas: 5
resources:
limits:
cpus: "0.1"
memory: 50M
restart_policy:
condition: on-failure
ports:
- "4000:80"
networks:
- webnet
Visualizer:
image: dockersamples/visualizer:stable
ports:
- "8080:8080"
volumes:
- "/var/run/docker.sock:/var/run/docker.sock"
deploy:
placement:
constraints: [node.role == manager]
networks:
- webnet
networks:
webnet:
阅读全文 »
1…456…21
Jesse

Jesse

求知若饥,虚心若愚.

209 日志
44 分类
41 标签
RSS
© Tue Jun 12 2018 08:00:00 GMT+0800 (GMT+08:00) — 2021 Jesse