cloud-init 适配迁移mac地址变动及自定义脚本

2022-12-28  本文已影响0人  w_dll

说明

物理机的迁移和云主机不同的地方在于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
上一篇 下一篇

猜你喜欢

热点阅读