openstack非DHCP网络配置注入和cloud-init分析
来源:互联网 发布:小米口罩知乎 编辑:程序博客网 时间:2024/06/11 14:58
原理:基于config drive方式,将配置的网络信息注入到openstack/content/0000文件中,然后虚机启动后,由cloudinit读取此文件数据,由cloud-init中的基础组件进行虚机网络设置。
openstack的环境配置:
1.设置网络关闭dhcp功能。如果是使用中进行配置关闭,还需要查看网络中是否存在dhcp类型port.将dhcp类型的port删除掉。
2.配置nova.conf文件:
flat_injected = True #使能network信息注入功能
injected_network_template = ******** #配置产生网络metadata数据的模板位置。
默认在nova安装目录下,存在interfaces.template模板;
nova/virt/interfaces.template
实验时,copy上述文件到/etc/nova目录下。设置injected_network_template为:
injected_network_template = /etc/nova/interfaces.template
启动虚机时,nova-compute服务会按照interfaces.template的格式,生成content/0000文件。如:
接下来分析cloudinit是如何生效网络配置的:
cloudinit 首先通过挂在的目录获取content/0000数据,这个处理是由cloud init的util.py文件中的方法处理的。
通过日志可以知道,由DataSourceConfigDrive.py处理了更新network interfaces操作。具体是下面的函数
def on_first_boot(data, distro=None): """Performs any first-boot actions using data read from a config-drive.""" if not isinstance(data, dict): raise TypeError("Config-drive data expected to be a dict; not %s" % (type(data))) net_conf = data.get("network_config", '') if net_conf and distro: LOG.debug("Updating network interfaces from config drive") distro.apply_network(net_conf) files = data.get('files', {}) if files: LOG.debug("Writing %s injected files", len(files)) for (filename, content) in files.items(): if not filename.startswith(os.sep): filename = os.sep + filename try: util.write_file(filename, content, mode=0o660) except IOError: util.logexc(LOG, "Failed writing file: %s", filename)
所以,network注入后,网卡的配置工作是在cloudinit的最初的阶段就开始执行了。 从 distro.apply_network(net_conf),可以知道,实现apply_network是根据具体的linux发行版本来实现的: 注意cloudinit的源码结构: 其中就有distros文件夹: 所以,对于直接使用命令实现注入配置功能,都会和具体的操作系统有关。 在distro的__init__.py中可以找到apply_network的实现:def apply_network(self, settings, bring_up=True): # Write it out dev_names = self._write_network(settings) # Now try to bring them up if bring_up: return self._bring_up_interfaces(dev_names) return False
其会调用:self._write_network
其实现?
@abc.abstractmethod def _write_network(self, settings): # In the future use the http://fedorahosted.org/netcf/ # to write this blob out in a distro format raise NotImplementedError()
在__init__.py中,_write_network未实现,实际上他会在具体的guest操作系统中进行实现。
举例,如果是debain系统,则此函数在distrio/debain.py中实现如下;
def _write_network(self, settings): util.write_file(self.network_conf_fn, settings) return ['all']
参考资料:http://blog.oddbit.com/2015/06/26/openstack-networking-without-dhcp/
windows系列的镜像,使用cloudbase时,需要额外使用插件:cloudbaseinit.plugins.common.networkconfig.NetworkConfigPlugin
在cloudbase-init和cloudbase-init-unattend中都需要添加。
在虚机中加载config drive的cdrom :mount/dev/disk/by-label/config-2 /mnt/config
- openstack非DHCP网络配置注入和cloud-init分析
- openstack 密码注入之cloud-init 简单介绍
- OpenStack解决非UEC镜像的虚拟机cloud-init不工作不能自动修改主机名称不能注入user data
- openstack dhcp agent 分析
- 制作centos6.5 镜像,安装cloud-init 支持openstack 密码注入
- 制作centos6.5 镜像,安装cloud-init 支持openstack 密码注入
- openstack使用cloud-init进行初始化
- cloud-init调试配置项
- CentOS7 DHCP网络配置
- 配置非DHCP下的IP和MAC绑定
- ubuntu安装cloud-init制作成openstack镜像---cloud-init篇
- OpenStack Nova:虚拟机初始化user-data & Cloud-init
- 配置Windows网络同时支持DHCP和静态IP
- 使用Cloud-init配置管理员密码
- 安装和配置DHCP
- openstack虚拟机网络配置
- OpenStack网络配置设计
- cloud service 心得: openstack, cloudinit和puppet
- k近邻算法
- 从node.js想到的
- JAVA中定义对象属性为int类型初始化问题
- HTML 标签自定义属性的问题
- 单链表的运算
- openstack非DHCP网络配置注入和cloud-init分析
- acm之母函数题目4
- C#多线程详解
- mysql用存储过程写入 一个表A中没有存在在另一个表B的数据
- windows下nginx安装、配置与使用
- 剑指offer——二进制中1的个数
- URL基本介绍
- android:excludefromRecents属性控制在不在recent列表中显示
- oracle三层嵌套分页