前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >OpenStack实践(十):Cloud Init+Config Drive定制实例

OpenStack实践(十):Cloud Init+Config Drive定制实例

作者头像
loong576
修改2019-10-23 11:28:48
4.7K0
修改2019-10-23 11:28:48
举报
文章被收录于专栏:运维ABC运维ABC

环境:

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

代码语言:txt
复制
stack@openstack-controller:~$ view /etc/nova/nova.conf
flat_injected = True

该配置是为了关闭DHCP服务时实例网卡也能被正确配置,重启计算服务后配置生效。

代码语言:txt
复制
stack@openstack-controller:~$ sudo systemctl restart devstack@n*

关闭dhcp

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

启动实例

代码语言:txt
复制
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

代码语言:txt
复制
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

代码语言:txt
复制
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,挂载并查看

代码语言:txt
复制
[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日志分析

代码语言:txt
复制
[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调试

各服务单独调试

代码语言:txt
复制
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

调试某模块的某个配置

代码语言:txt
复制
[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,原因待查

尝试过的参数

代码语言:txt
复制
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

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2019-02-15 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
Elasticsearch Service
腾讯云 Elasticsearch Service(ES)是云端全托管海量数据检索分析服务,拥有高性能自研内核,集成X-Pack。ES 支持通过自治索引、存算分离、集群巡检等特性轻松管理集群,也支持免运维、自动弹性、按需使用的 Serverless 模式。使用 ES 您可以高效构建信息检索、日志分析、运维监控等服务,它独特的向量检索还可助您构建基于语义、图像的AI深度应用。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档