使用Python腳本創建OVS交換機網路
#coding=utf-8
#!/usr/bin/python
import os
import commands
class ovsnet:
def __init__(self):
self.num =30
self.br = []
for i in range(0,self.num):
brs = 'br{}'.format(i)
self.br.append(brs)
# 查看並刪除已經創建的網橋
def delallbr(self):
(status, output) = commands.getstatusoutput('ovs-vsctl list-br')
brall = output.splitlines()
for i in range(0,len(brall)):
os.system('ovs-vsctl del-br '+brall[i])
# 創建網橋,創建交換機端口並設置編號
def addbr(self):
for i in range(0,self.num):
os.system('ovs-vsctl add-br '+self.br[i])
os.system('ovs-vsctl add-port '+self.br[i]+' '+self.br[i]+'port0'+' -- set Interface '+self.br[i]+'port0'+' ofport_request=1')
os.system('ovs-vsctl add-port '+self.br[i]+' '+self.br[i]+'port1'+' -- set Interface '+self.br[i]+'port1'+' ofport_request=2')
#設置交換機的dpid
for i in range(0,self.num):
if i+1<16:
os.system('ovs-vsctl set bridge '+self.br[i]+' other_config:datapath-id=000000000000000'+str(hex(i+1))[2:])
else:
os.system('ovs-vsctl set bridge '+self.br[i]+' other_config:datapath-id=00000000000000'+str(hex(i+1))[2:])
# 添加鏈路
def addLink(self):
os.system('ovs-vsctl set interface '+self.br[0]+'port1 type=patch options:peer='+self.br[1]+'port0')
os.system('ovs-vsctl set interface '+self.br[1]+'port0 type=patch options:peer='+self.br[0]+'port1')
for i in range(1,self.num-1):
os.system('ovs-vsctl set interface '+self.br[i]+'port1 type=patch options:peer='+self.br[i+1]+'port0')
os.system('ovs-vsctl set interface '+self.br[i+1]+'port0 type=patch options:peer='+self.br[i]+'port1')
os.system('ovs-vsctl set interface '+self.br[self.num-2]+'port1 type=patch options:peer='+self.br[self.num-1]+'port0')
os.system('ovs-vsctl set interface '+self.br[self.num-1]+'port0 type=patch options:peer='+self.br[self.num-2]+'port1')
# 使用OVS模擬虛擬主機
def addHost(self):
os.system('ovs-vsctl add-port br1 br1-p0')
os.system('ovs-vsctl add-port br1 br1-p1')
os.system('ovs-vsctl add-port br2 br2-p0')
os.system('ovs-vsctl add-port br2 br2-p1')
os.system('ovs-vsctl add-port br3 br3-p0')
os.system('ovs-vsctl add-port br3 br3-p1')
os.system('ovs-vsctl set interface br1-p0 type=internal')
os.system('ovs-vsctl set interface br1-p1 type=internal')
os.system('ovs-vsctl set interface br2-p0 type=internal')
os.system('ovs-vsctl set interface br2-p1 type=internal')
os.system('ovs-vsctl set interface br3-p0 type=internal')
os.system('ovs-vsctl set interface br3-p1 type=internal')
# 需要提前設置網路域:ip netns add ns0
self.addIP('ns0','br1-p0','192.168.1.1/24')
self.addIP('ns1','br1-p1','192.168.1.2/24')
self.addIP('ns2','br2-p0','192.168.1.3/24')
self.addIP('ns3','br2-p1','192.168.1.4/24')
self.addIP('ns4','br3-p0','192.168.1.5/24')
self.addIP('ns5','br3-p1','192.168.1.6/24')
#設置好虛擬主機後,可以用命令:ip netns exec ns0 ping 192.168.1.2,查看主機的連接
def addIP(self,ns,port,ip):
os.system('ip link set '+port+' netns '+ns)
os.system('ip netns exec '+ns+' ip addr add '+ip+' dev '+port)
os.system('ip netns exec '+ns+' ifconfig '+port+' promisc up')
# 將OVS交換機連接到控制器
def addController(self):
for i in range(0,self.num):
os.system('ovs-vsctl set-controller '+self.br[i]+' tcp:10.108.171.181:6633')
if __name__ == '__main__':
a = ovsnet()
a.delallbr()
a.addbr()
a.addLink()
a.addHost()
a.addController()