一:因业务需要在openstack上的两个虚拟机关联两个VIP,而且数量比较大,因此使用如下脚本配置:

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)

  

  

12-13 20:34