1.1:版本1:
手动执行并绑定2个VIP:
# cat /home/www/vip.py
#!/bin/env python
#coding:utf-8
#Author: ZhangJie
import sys
import subprocess
def admin_env(): #导入admin用户环境变量
obj = subprocess.Popen(("source /root/script/admin-ocata.sh"),shell=True,stdout=subprocess.PIPE)
data = obj.stdout.read()
print data
def ip_data():
VIP1=sys.argv[1]
VIP2=sys.argv[2]
VM1_IP=sys.argv[3]
VM2_IP=sys.argv[4]
#查询并保存第一台实例的ID,用于后面的VIP 关联
obj = subprocess.Popen(("openstack port list | grep -w %s | awk '{print $2}'" % (VM1_IP)),shell=True,stdout=subprocess.PIPE)
VM1_ID = obj.stdout.read()
VM1_ID = VM1_ID.split()[0]
print ("第一台虚拟机的ID 是%s") % (VM1_ID)
#查询并保存第二台实例的ID,用于后面的VIP 关联
obj = subprocess.Popen(("openstack port list | grep -w %s | awk '{print $2}'" % (VM2_IP)),shell=True,stdout=subprocess.PIPE)
VM2_ID = obj.stdout.read()
VM2_ID = VM2_ID.split()[0]
print ("第一台虚拟机的ID 是%s") % (VM2_ID)
#将第一个VIP 关联至网络
obj = subprocess.Popen(("neutron port-create --fixed-ip ip_address=%s da8e2dca-aa88-40fa-bfec-7fb02c010068" % (VIP1)),shell=True,stdout=subprocess.PIPE) restful = obj.stdout.read()
print restful
#将第二个VIP 关联至网络
obj = subprocess.Popen(("neutron port-create --fixed-ip ip_address=%s da8e2dca-aa88-40fa-bfec-7fb02c010068" % (VIP2)),shell=True,stdout=subprocess.PIPE) restful = obj.stdout.read()
print restful
#将第一个虚拟机关联至两个VIP
obj = subprocess.Popen(("neutron port-update %s --allowed_address_pairs list=true type=dict ip_address={%s,%s}" % (VM1_ID,VIP1,VIP2)),shell=True,stdout=subprocess.PIPE) restful = obj.stdout.read()
print restful
print ("第一台虚拟机%s已经关联至VIP: %s和%s") % (VM1_IP,VIP1,VIP2)
#将第二个虚拟机关联至两个VIP
obj = subprocess.Popen(("neutron port-update %s --allowed_address_pairs list=true type=dict ip_address={%s,%s}" % (VM2_ID,VIP1,VIP2)),shell=True,stdout=subprocess.PIPE) restful = obj.stdout.read()
print restful
print ("第二台虚拟机%s已经关联至VIP: %s和%s") % (VM2_IP,VIP1,VIP2)
def main():
admin_env()
ip_data()
if __name__ == '__main__':
main()
注意:将VIP关联的网络ID(da8e2dca-aa88-40fa-bfec-7fb02c010068)需要修改为新的网络ID。
执行脚本:
# python vip.py 192.168.1.248 192.168.1.249 192.168.1.200 192.168.1.201 #前面两个是VIP地址,后面两个是虚拟机IP地址。
1.2:版本2:
如果有很多VIP (几百个)需要与虚拟机进行批量绑定,如果要手动一个个操作实在太慢而且容易出错,因此可以将VIP 和虚拟机的对应关系保存到文本文件,然后再从文本文件读取VIP 传递给脚本做自动做绑定:
保存VIP文本格式如下:
# cat /home/www/vip.txt VIP1 VIP2 VMIP1 VMIP2 VIP3 VIP4 VMIP3 VMIP3 。。。。。。。。。。。。
绑定脚本内容如下:
# cat vip.py
#!/bin/env python
#coding:utf-8
#Author: ZhangJie
import sys,subprocess
with open("vip.txt") as f:
for a in f.readlines():
VIP1,VIP2,VM1_IP,VM2_IP = a.split()[0],a.split()[1],a.split()[2],a.split()[3]
obj = subprocess.Popen(("openstack port list | grep -w %s | awk '{print $2}'" % (VM1_IP)),shell=True,stdout=subprocess.PIPE)
VM1_ID = obj.stdout.read()
VM1_ID = VM1_ID.split()[0]
print ("第一台虚拟机%s的ID 是%s") % (VM1_IP,VM1_ID)
#查询并保存第二台实例的ID,用于后面的VIP 关联
obj = subprocess.Popen(("openstack port list | grep -w %s | awk '{print $2}'" % (VM2_IP)),shell=True,stdout=subprocess.PIPE)
VM2_ID = obj.stdout.read()
VM2_ID = VM2_ID.split()[0]
print ("第一台虚拟机%s的ID 是%s") % (VM2_IP,VM2_ID)
#将第一个VIP 关联至网络
obj = subprocess.Popen(("neutron port-create --fixed-ip ip_address=%s da8e2dca-aa88-40fa-bfec-7fb02c010068" % (VIP1)),shell=True,stdout=subprocess.PIPE)
restful = obj.stdout.read()
print restful
#将第二个VIP 关联至网络
obj = subprocess.Popen(("neutron port-create --fixed-ip ip_address=%s da8e2dca-aa88-40fa-bfec-7fb02c010068" % (VIP2)),shell=True,stdout=subprocess.PIPE)
restful = obj.stdout.read()
print restful
#将第一个虚拟机关联至两个VIP
obj = subprocess.Popen(("neutron port-update %s --allowed_address_pairs list=true type=dict ip_address={%s,%s}" % (VM1_ID,VIP1,VIP2)),shell=True,stdout=subprocess.PIPE)
restful = obj.stdout.read()
print restful
print ("第一台虚拟机%s已经关联至VIP: %s和%s") % (VM1_IP,VIP1,VIP2)
#将第二个虚拟机关联至两个VIP
obj = subprocess.Popen(("neutron port-update %s --allowed_address_pairs list=true type=dict ip_address={%s,%s}" % (VM2_ID,VIP1,VIP2)),shell=True,stdout=subprocess.PIPE)
restful = obj.stdout.read()
print restful
print ("第二台虚拟机%s已经关联至VIP: %s和%s") % (VM2_IP,VIP1,VIP2)