OpenStack实践(十):CloudInit+ConfigDrive定制实例
环境:
专业领域包括网站设计、成都网站建设、商城建设、微信营销、系统平台开发, 与其他网站设计及系统开发公司不同,创新互联建站的整合解决方案结合了帮做网络品牌建设经验和互联网整合营销的理念,并将策略和执行紧密结合,为客户提供全网互联网整合方案。
openstack版本 | pike |
控制节点主机 | openstack-controller(ubuntu 16.04.5) 172.27.34.37 |
计算节点主机 | openstack-computer(ubuntu 16.04.5) 172.27.34.38 |
vxlan100 | centos7-init(172.27.100.2)、ubuntu1604(172.27.100.20) |
centos7镜像 | CentOS-7-x86_64-GenericCloud-1809.qcow2c |
ubuntu16.04镜像 | xenial-server-cloudimg-amd64-disk1.img |
cloud-init | cloud-init 0.7.9 |
ubuntu安装详见:Ubuntu16.04.5以lvm方式安装全记录
openstack安装详见:OpenStack实践(一):Ubuntu16.04下DevStack方式搭建p版OpenStack
浮动ip搭建详见:OpenStack实践(九):Open vSwitch方式实现floating IP
架构图:
cloud-init简介
cloud-init是linux的一个工具,当系统启动时,cloud-init可从nova metadata服务或者config drive中获取metadata,完成包括但不限于下面的定制化工作:
1.设置 default locale
2.设置 hostname
3.添加 ssh keys到 .ssh/authorized_keys
4.设置用户密码
5.配置网络
为了实现instance定制工作,cloud-init会按5个阶段执行任务:
1.Generator (cloud-config.target)
2.Local (cloud-init-local.service)
3.Network (cloud-init.service)
4.Config (cloud-config.service)
5.Final (cloud-final.service)
各阶段作用
Generator:读取配置文件cloud.cfg;
Local:定位“本地”数据源和配置网络;
Network:读取cloud_init_modules模块的指定配置;
Config:读取cloud_config_modules模块的指定配置
Final :分别读取cloud_final_modules模块的指定配置
cloud image
ubuntu镜像:http://cloud-images.ubuntu.com/
centos7镜像:http://cloud.centos.org/centos/7/images/
这些镜像已经预装cloud-init
config drive
当无dhcp服务时,可以通过config drive获得metadata
配置config driver
stack@openstack-controller:~$ view /etc/nova/nova.conf flat_injected = True
该配置是为了关闭DHCP服务时实例网卡也能被正确配置,重启计算服务后配置生效。
stack@openstack-controller:~$ sudo systemctl restart devstack@n*
关闭dhcp
为确保实例通过config driver获取的metadata,这里关闭dhcp服务
启动实例
root@openstack-controller:~# nova boot --flavor m1.small --image centos7 --availability-zone nova:openstack-controller --nic net-name=vxlan100 --key-name centos7 --security-groups centos7 --user-data /tmp/centos.config --config-drive true centos7-init
通过--config-drive true启用config-driver,通过--user-data /tmp/centos.config加载配置,ubuntu的配置文件为/tmp/ubuntu.config
打印的日志,传入的user_data
绑定浮动IP
user-data:centos.config
root@openstack-controller:~# more /tmp/centos.config #cloud-config chpasswd: list: | root:rootroot centos:centos expire: false ssh_pwauth: yes hostname: loong576 yum_repos: epel-163: baseurl: http://mirrors.163.com/centos/$releasever/os/$basearch/ name: Centos-7 enabled: true resolv_conf: nameservers: ['218.104.1xx.1xx', '8.8.8.8'] searchdomains: - localdomain domain: localdomain options: rotate: true timeout: 1 manage_resolv_conf: true packages: - vim - wget - httpd timezone: 'Asia/Shanghai' runcmd: - [ sed, -i, "s/^ *SELINUX=enforcing/SELINUX=disabled/g", /etc/selinux/config ] - [ mkdir, /dropme ] - [ touch, /root/abc.txt ] - [ sed, -i, "s/^ *nameserver.*/nameserver 218.104.1xx.1xx/g", /etc/resolv.conf ] - [ rpm, --import, /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7 ] power_state: delay: now mode: reboot message: reboot now timeout: 30 condition: true
验证是否生效
验证定制的配置文件centos.config是否生效
实例可以直接root登陆(默认只能通过创建密钥对方式登陆)成功获取到ip,配置了yum源、时区,runcmd运行正常,关闭了selinux(power-state-change正常),产生了测试文件,修改了DNS信息
user-data:ubuntu.config
root@openstack-controller:~# more /tmp/ubuntu.config #cloud-config chpasswd: list: | root:rootroot ubuntu:ubuntu expire: false ssh_pwauth: yes hostname: ubuntu1604 apt: primary: - arches: [default] uri: "http://mirrors.aliyun.com/ubuntu/" search: - "http://mirrors.aliyun.com/ubuntu/" resolv_conf: nameservers: ['218.104.1xx.1xx', '8.8.8.8'] searchdomains: - localdomain domain: localdomain options: rotate: true timeout: 1 manage_resolv_conf: true packages: - apache2 timezone: 'Asia/Shanghai' runcmd: - [ mkdir, /dropme ] - [ sed, -i, "$a nameserver 218.104.1xx.xxx", /etc/resolv.conf ]
验证是否生效
验证定制的配置文件ubuntu.config是否生效
实例可以直接ubuntu登陆(默认只能通过创建密钥对方式登陆)成功获取到ip,配置了hostname、apt源、时区,runcmd运行正常,产生了测试文件,修改了dns信息
查看config drive
sr0就是config driver,挂载并查看
[root@centos7-init ~]# lsblk [root@centos7-init ~]# mount /dev/sr0 /mnt [root@centos7-init ~]# cd /mnt/openstack/latest/ && ll [root@centos7-init latest]# more meta_data.json [root@centos7-init latest]# more user_data
meta_data.json中存放了public_keys,hostname等信息,user_data对应centos.config。
cloud-init.log日志分析
[root@centos7-init ~]# view /var/log/cloud-init.log
第一阶段服务
第二阶段服务
第三阶段服务
在第三阶段init-network服务会依次读取cloud_init_modules模块中以下配置:check-cache、consume-user-data、consume-vendor-data、config-migrator、config-bootcmd、config-write-files、config-growpart、config-resizefs、config-set_hostname、config-update_etc_hosts、config-rsyslog、config-users-groups、config-ssh
第四阶段服务
在第四阶段modules-config服务会依次读取cloud_config_modules模块中以下配置:check-cache、consume-user-data、consume-vendor-data、config-migrator、config-bootcmd、config-write-files、config-growpart、config-resizefs、config-set_hostname、config-update_etc_hosts、config-disable-ec2-metadata、config-runcmd
第五阶段服务
在第五阶段modules-final服务会依次读取cloud_final_modules模块中以下配置:config-rightscale_userdata、config-scripts-per-boot、config-scripts-per-instance、config-scripts-user、config-ssh-authkey-fingerprints、config-keys-to-console、config-phone-home、config-final-message、config-power-state-chang
cloud init的modules里面提供了丰富的定制信息,详情可以参考Cloud-Init官网:https://cloudinit.readthedocs.io/en/latest/index.html#
cloud-init调试
各服务单独调试
init-local:cloud-init init --local cloud_init_modules:cloud-init init cloud_config_modules:cloud-init modules --mode=config cloud_final_modules:cloud-init modules --mode=final
[root@centos7-init ~]# cloud-init init --local
调试某模块的某个配置
[root@centos7-init ~]# cloud-init single --name timezone
调试cloud_config_modules模块的timezone配置
实践总结:
1.各模块的各配置项依次读取生效
在定制实例时,会依次读取配置文件cloud.cfg配置项。
实验环境的主机需配DNS才能访问外网,通过cloud_config_modules模块的runcmd配置项配置DNS,由于配置项package-update-upgrade-install在runcmd之前,cloud-init会先安装软件,这时外网是不通的,所以报错。
2.centos的hostname设置不生效
尝试了很多参数组合,都没有到hostname,原因待查
尝试过的参数
hostname: loong576 manage_etc_hosts: true preserve_hostname: true fqdn: loong576
ubuntu没有这个问题,只需设置hostname即可,重启系统也任然生效。
3.DNS配置不生效
配置项resolv_conf不生效。centos和ubuntu都不生效,centos貌似是个bug,参考:https://bugzilla.redhat.com/show_bug.cgi?id=1489270,ubuntu建议将dns信息写入网卡/etc文件/network/interfaces。
4.runcmd执行命令是应该是双引号
这个有点坑,在用sed命令执行关闭selinux和配置DNS时,正常的单引号''需替换为"",否则执行报错。
5.某个配置项不合法则整个配置不生效
runmcd有个配置非法
报错日志
此时整个centos.config配置文件不生效
cloud-init配置文件已上传github:https://github.com/loong576/cloud-init.git
参考:
https://cloudinit.readthedocs.io/en/latest/
https://docs.openstack.org/ironic/latest/install/configdrive.html
https://help.ubuntu.com/community/CloudInit
https://blog.csdn.net/allison_ywt/article/details/52943480
https://blog.51cto.com/cloudman/1912640
分享文章:OpenStack实践(十):CloudInit+ConfigDrive定制实例
标题网址:http://scjbc.cn/article/iegodo.html