OpenStack实践之CloudInit+ConfigDrive定制实例

Windows Windows 2个月前 (08-15) 11次浏览 未收录 0个评论 扫描二维码

环境:

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

架构图:

OpenStack实践之CloudInit+ConfigDrive定制实例

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)

OpenStack实践之CloudInit+ConfigDrive定制实例

各阶段作用

Generator:读取配置文件cloud.cfg;

Local:定位“本地”数据源和配置网络;

Network:读取cloud_init_modules模块的指定配置;

Config:读取cloud_config_modules模块的指定配置

Final :分别读取cloud_final_modules模块的指定配置

OpenStack实践之CloudInit+ConfigDrive定制实例

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:~$sudosystemctlrestartdevstack@n*

关闭dhcp

为确保实例通过config driver获取的metadata,这里关闭dhcp服务

OpenStack实践之CloudInit+ConfigDrive定制实例

启动实例

root@openstack-controller:~#novaboot--flavorm1.small--imagecentos7--availability-zonenova:openstack-controller--nicnet-name=vxlan100--key-namecentos7--security-groupscentos7--user-data/tmp/centos.config--config-drivetruecentos7-init

通过–config-drive true启用config-driver,通过–user-data /tmp/centos.config加载配置,ubuntu的配置文件为/tmp/ubuntu.config

打印的日志,传入的user_data

OpenStack实践之CloudInit+ConfigDrive定制实例

绑定浮动IP

OpenStack实践之CloudInit+ConfigDrive定制实例

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.*/nameserver218.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:rebootnow
timeout:30
condition:true

验证是否生效

验证定制的配置文件centos.config是否生效

OpenStack实践之CloudInit+ConfigDrive定制实例

实例可以直接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,"$anameserver218.104.1xx.xxx",/etc/resolv.conf]

 

验证是否生效

验证定制的配置文件ubuntu.config是否生效

OpenStack实践之CloudInit+ConfigDrive定制实例

实例可以直接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-initlatest]#moremeta_data.json
[root@centos7-initlatest]#moreuser_data

OpenStack实践之CloudInit+ConfigDrive定制实例

OpenStack实践之CloudInit+ConfigDrive定制实例

meta_data.json中存放了public_keys,hostname等信息,user_data对应centos.config。

cloud-init.log日志分析

[root@centos7-init~]#view/var/log/cloud-init.log

第一阶段服务

OpenStack实践之CloudInit+ConfigDrive定制实例

第二阶段服务

OpenStack实践之CloudInit+ConfigDrive定制实例

第三阶段服务

OpenStack实践之CloudInit+ConfigDrive定制实例

OpenStack实践之CloudInit+ConfigDrive定制实例

在第三阶段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

第四阶段服务

OpenStack实践之CloudInit+ConfigDrive定制实例

在第四阶段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

第五阶段服务

OpenStack实践之CloudInit+ConfigDrive定制实例

在第五阶段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

OpenStack实践之CloudInit+ConfigDrive定制实例

cloud init的modules里面提供了丰富的定制信息,详情可以参考Cloud-Init官网:

cloud-init调试

各服务单独调试

init-local:cloud-initinit--local
cloud_init_modules:cloud-initinit
cloud_config_modules:cloud-initmodules--mode=config
cloud_final_modules:cloud-initmodules--mode=final

[root@centos7-init ~]# cloud-init init –local

OpenStack实践之CloudInit+ConfigDrive定制实例

OpenStack实践之CloudInit+ConfigDrive定制实例

调试某模块的某个配置

[root@centos7-init~]#cloud-initsingle--nametimezone

OpenStack实践之CloudInit+ConfigDrive定制实例

调试cloud_config_modules模块的timezone配置

实践总结:

1.各模块的各配置项依次读取生效

在定制实例时,会依次读取配置文件cloud.cfg配置项。

实验环境的主机需配DNS才能访问外网,通过cloud_config_modules模块的runcmd配置项配置DNS,由于配置项package-update-upgrade-install在runcmd之前,cloud-init会先安装软件,这时外网是不通的,所以报错。

OpenStack实践之CloudInit+ConfigDrive定制实例

2.cetos的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时,正常的单引号”需替换为””,否则执行报错。

OpenStack实践之CloudInit+ConfigDrive定制实例

 

5.某个配置项不合法则整个配置不生效

runmcd有个配置非法

OpenStack实践之CloudInit+ConfigDrive定制实例

报错日志

OpenStack实践之CloudInit+ConfigDrive定制实例

此时整个centos.config配置文件不生效

cloud-init配置文件已上传github:https://github.com/loong576/cloud-init.git

喜欢 (0)
[]
分享 (0)
关于作者:
发表我的评论
取消评论
表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址