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

说明

物理机的迁移和云主机不同的地方在于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
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容