说明
物理机的迁移和云主机不同的地方在于mac地址会改变,因此导致的问题是迁移虽然成功了,但是mac地址和原来机器不同,因此还是无法正常运行;
解决这个问题我想到的办法是通过cloud-init再重置一次网卡的配置。
问题
需要解决这个问题需要两点:
1 如何通过cloud-init 重置网络?
2 如何通过cloud-init 执行自定义脚本?
解决步骤
重置网络
最简单的步骤是cloud-init clean -r 直接还原所有cloud-init 配置,重启
或者根据实验得出的办法,代码如下:
入口是run()函数
class NetworkConfigReset:
def __init__(self):
self.mac_list = self._get_mac_list()
def run(self):
if not self._mac_is_all_in_use() and not self._net_is_up():
self._reset_network()
def _reset_network(self):
file_name = '/var/lib/cloud/data/instance-id'
if os.path.exists(file_name):
os.remove(file_name)
os.popen('cloud-init init --local')
os.popen('service network restart')
def _get_mac_list(self):
# with open('net_info.txt', 'r') as f:
# data = f.read()
# print(data)
data = os.popen('ip a').read()
mac_list = re.findall('((?:[\da-fA-F]{2}[:\-]){5}[\da-fA-F]{2})', data)
return mac_list
def _mac_is_all_in_use(self):
for mac in self.mac_list:
if mac == '00:00:00:00:00:00':
continue
cmd = 'grep -Ilr "%s" /etc/udev/rules.d|wc -l' % mac
#print(cmd)
res = os.popen(cmd).read().strip()
#print(res)
if res == "0":
return False
return True
def _net_is_up(self):
res = os.popen('ip a | grep "state UP" | grep -v tmfifo_net0 | wc -l').read().strip()
if res == '0':
return False
return True
通过cloud-init 执行自定义脚本
通过参考 查阅,可以设置自定义的配置来执行;
其中 runcmd 执行一次
bootcmd 每次开机都会执行
新建文件 /etc/cloud/cloud.cfg.d/upm_init.cfg
#cloud-config
runcmd:
- python /usr/local/ucloud/upm_init.py udisk
bootcmd:
- python /usr/local/ucloud/upm_init.py network