云服务器cloud-init初始化工具的使用与配置

[TOC]

在云平台中,创建云主机的时候希望能够对主机进行一些初始化操作,如配置ip,主机名,密码,ssh登录等。openstack上可以使用cloud-init进行初始化。

建议阅读cloud-init官方文档,读几遍,确保知道在配置些什么,以及这些配置项是如何生效的,模块频率是怎样。

要实现在云主机中的初始化配置,首先就要让云主机获取到用户输入的配置数据,在cloud-init中以cdrom方式读取,即openstack将用户数据打包成iso挂载给云主机,云主机启动后内部的cloud-init默认从cdrom里面读取数据,然后进行初始化操作。

Users and Groups模块的模块频率是每个实例执行一次,也就是说制作的镜像起了云主机之后,再修改这个模块配置重启机器是不再生效了。
与Users and Groups模块的模块频率相似的还有Write_files、Set Passwords模块。
Bootcmd模块的模块频率是每个实例可以执行多次,也就是说,起了云主机之后,再修改这个模块配置重启机器之后也会生效。
与Bootcmd模块的模块频率相似的还有Runcmd。

OpenStack虚拟机镜像指南
cloud-init 原理(执行的整个过程)
Cloud-init的认识和应用

cloud-init 是 linux 的一个工具,当系统启动时,cloud-init 可从 nova metadata 服务或者 config drive 中获取 metadata,完成包括但不限于下面的定制化工作:

设置默认语言环境
设置实例主机名
添加 ssh keys到 .ssh/authorized_keys
设置用户密码
配置网络安装软件包

cloud-init安装方式

cloud-init官方文档
官方配置参数参考
阿里云官方文档 安装cloud-init

前提条件
• 准备一台KVM机器,用于制作初始的centos7镜像
• 已为Linux云服务器绑定弹性IP。
• 已登录Linux云服务器。
• Linux云服务器的网卡属性为DHCP方式。

网卡配置文件为动态IP获取

# cat /etc/sysconfig/network-scripts/ifcfg-eth0
TYPE=Ethernet
BOOTPROTO=dhcp
NAME=eth0
DEVICE=eth0
ONBOOT=yes

# ip: 
ifconfig eth0 | awk 'NR==2{print $2}'
192.168.122.223

1. 下载cloud-init

wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
yum install cloud-init -y 

rpm -qa |grep cloud-init
cloud-init-18.5-6.el7.centos.x86_64

cloud-init -v
/usr/bin/cloud-init 18.5

cloud-init init --local

#设置开机自启动
systemctl enable cloud-init-local.service cloud-init.service cloud-config.service cloud-final.service

2. 安装相应的包

# ACPI服务是控制重启和关闭实例
yum -y install acpid
systemctl enable acpid

# 安装cloud-utils-growpart 允许分区调整
yum -y install cloud-utils-growpart

# CentOS系统必须要禁用默认zeroconf路由,以便精确访问OpenStack数据源
echo "NOZEROCONF=yes" >> /etc/sysconfig/network

#配置GRUB_CMDLINE_LINUX内容
[root@centos7 ~]# vim /etc/default/grub
GRUB_CMDLINE_LINUX="crashkernel=auto console=tty0 console=ttyS0,115200n8"
#保存更改
[root@centos7 ~]# grub2-mkconfig -o /boot/grub2/grub.cfg

3. 配置Cloud-Init工具

  1. 用户可以根据需要根据用户类型配置登录云服务器的用户权限。使用root帐户登录,需要开启root用户的ssh权限,并开启密码远程登录。
    o 若用户选择注入密码,则通过自己注入的密码进行远程SSH或noVNC登录。
    o 若用户选择注入密钥,则通过自己注入的密钥进行远程SSH登录。

配置ssh文件

vim /etc/ssh/sshd_config
PasswordAuthentication yes

在需要免密码登录的机器上执行下面命令,产生密钥对(controller节点上)

ssh-keygen -t rsa -f ~/.ssh/id_rsa -P ''
[root@controller ~]# cat ~/.ssh/id_rsa.pub 
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDCzU9H5oJxgPpWhtXPwETEpFx425UdirDrTBRt6K/kfx7T6AcnuxzIQ6T64TmGhi72FTz7KtfYUtoIzq7specBthD8X8DTA8C9A6nIEwuHgAh12i0OugmdMmzs8g1QvKxZknFOiX32dlWQBZqU1z9V0NmaMRAxvgvYK6YR5GrHFr5QfSr3rPCMOE1qmZ7QQwfxcEFcmwz1xK65LK1VZh1TPzj7DmW97Clr0F/a11a86ekw8uXsMeowSbdGH546y9FbJlopAPZyprS7kEcwUOaj9VcfF+1LxNjjeHuPsfoquYPElgd52GIC0HE+sW5f+9otbZt2GKZUFBeuehC7g05f root@controller

编辑配置文件/etc/cloud/cloud.cfg

设置开放root密码远程登录并开启root用户的ssh权限。配置文件中的disable_root字段为1表示为禁用,为0表示不禁用。设置disable_root值为0,ssh_pwauth为1,lock_passwd设置为false,false表示不锁住用户密码。

[root@centos7-2 ~]# cat /etc/cloud/cloud.cfg
users:
  - name: root
    ssh_authorized_keys:
      - ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDCzU9H5oJxgPpWhtXPwETEpFx425UdirDrTBRt6K/kfx7T6AcnuxzIQ6T64TmGhi72FTz7KtfYUtoIzq7specBthD8X8DTA8C9A6nIEwuHgAh12i0OugmdMmzs8g1QvKxZknFOiX32dlWQBZqU1z9V0NmaMRAxvgvYK6YR5GrHFr5QfSr3rPCMOE1qmZ7QQwfxcEFcmwz1xK65LK1VZh1TPzj7DmW97Clr0F/a11a86ekw8uXsMeowSbdGH546y9FbJlopAPZyprS7kEcwUOaj9VcfF+1LxNjjeHuPsfoquYPElgd52GIC0HE+sW5f+9otbZt2GKZUFBeuehC7g05f root@controller

disable_root: 0
ssh_pwauth: 1

#datasource_list: [ 'OpenStack' ]
#datasource:
#  OpenStack:
#    metadata_urls: ["http://169.254.169.254"]
#    timeout: 5
#    max_wait: 60

preserve_hostname: flase
manage_etc_hosts: true

#建议提前配置好网卡配置文件为dhcp获取,否则在私有云上创建的实例可能会导致获取不到IP地址;
#原因是cloud-init中的自动配置网卡文件可能会导致mac地址不一致
network:
  config: disabled

runcmd:
 - [ sh, -c, echo "=========Welcome To OpenStack'=========" > /root/runcmd.log ]

cloud_init_modules:
 - ssh
 - migrator
 - bootcmd
 - write-files
 - growpart
 - resizefs
 - set_hostname
 - update_hostname
 - update_etc_hosts
 - rsyslog
 - users-groups

cloud_config_modules:
 - mounts
 - locale
 - set-passwords
 - yum-add-repo
 - package-update-upgrade-install
 - timezone
 - puppet
 - chef
 - salt-minion
 - mcollective
 - disable-ec2-metadata
 - runcmd
 - ntp-conf

cloud_final_modules:
 - rightscale_userdata
 - scripts-per-once
 - scripts-per-boot
 - scripts-per-instance
 - scripts-user
 - ssh-authkey-fingerprints
 - keys-to-console
 - phone-home
 - final-message
 - power-state-change

system_info:
   distro: centos
   paths:
      cloud_dir: /var/lib/cloud/
      templates_dir: /etc/cloud/templates/
   ssh_svcname: sshd

# vim:syntax=yaml
chpasswd:
   list: |
     root:XXXX@2019  #设置要修改的密码
   expire: False

用微秒生成随机密码的命令

date +%N|sha512sum| head -c8

如果希望能够修改 instance 的 hostname(默认 instance 每次重启后 cloud-init 都会重新将 hostname 恢复成初始值),将cloud_init_modules 列表中下面两项删除或注释掉:

# - set_hostname
# - update_hostname

(可选配置)在/etc/cloud/cloud.cfg文件中自定义网络配置

在cloud.cfg文件增加该配置之后,cloud-init不会管理/etc/sysconfig/network-scripts/下网络配置,需要自行管理。
建议提前配置好网卡配置文件为dhcp获取,否则在私有云上创建的实例可能会导致获取不到IP地址;原因是cloud-init中的自动配置网卡文件可能会导致mac地址不一致。

network:
  config: disabled

(可选配置)设置root用户密码

chpasswd:
  list: |
    root:123456
  expire: False  

修改以下配置使得镜像创建的云服务器主机名不带.novalocal后缀且主机名称中可以带点号。
a. 执行如下命令,修改__init__.py文件

# vim /usr/lib/python2.7/site-packages/cloudinit/sources/__init__.py
if toks: 
    toks = str(toks).split('.')
else :
    toks = ["ip-%s" % lhost.replace(".", "-")]
else :
    toks = lhost.split(".novalocal") 
    
if len(toks) > 1: 
    hostname = toks[0]
    # domain = '.'.join(toks[1: ])
else :
    hostname = toks[0]
if fqdn and domain != defdomain: 
    return "%s.%s" % (hostname, domain)
else :
    return hostname

执行如下命令进入cloudinit/sources文件夹。

cd /usr/lib/python2.7/site-packages/cloudinit/sources/
#执行如下命令,删除__init__.pyc文件和优化编译后的__init__.pyo文件
rm -rf init.pyc
rm -rf init.pyo
#执行如下命令,清理日志信息。
rm -rf /var/lib/cloud/*
rm -rf /var/log/cloud-init*

执行以下命令编辑Cloud-Init日志输出路径配置文件,设置日志处理方式handlers

#建议配置为cloudLogHandler。
vim /etc/cloud/cloud.cfg.d/05_logging.cfg
...
[logger_cloudinit]
level=DEBUG
qualname=cloudinit
handlers=cloudLogHandler
propagate=1

检查Cloud-Init工具相关配置是否成功

执行以下命令,无错误发生,说明Cloud-Init配置成功

[root@centos7 ~]# cloud-init init --local
Cloud-init v. 18.5 running 'init-local' at Wed, 27 May 2020 01:42:00 +0000. Up 1977.24 seconds.

设置完成后关闭虚拟机,准备下一阶段生成镜像

history -c
shutdown -h now

4. 上传镜像到openstack

如果对接ceph存储。可以把qcow2格式转换为raw格式的镜像再上传
Ceph缺点是不支持从qcow2格式的镜像引导,所以需要转换raw格式的镜像

[root@kvm image]# ll -h /tmp/centos7.qcow2 
-rw-r--r--. 1 root root 1.6G May 20 17:27 /tmp/centos7.qcow2

#将镜像从qcow2格式转换为raw格式;并下载到本地
[root@kvm image]# qemu-img convert -f qcow2 -O raw /tmp/centos7.qcow2 CentOS-7-x86_64-Minimal-2003-cloud-init.raw

将镜像上传到openstack的glance节点上(在controller节点上)

openstack image create --container-format bare --disk-format raw --file /server/tools/CentOS-7-x86_64-Minimal-2003.raw --unprotected --public CentOS-7-x86_64-Minimal-2003

#从QEMU中检索块设备映像信息
[root@controller tools]# qemu-img info CentOS-7-x86_64-Minimal-2003.raw
image: CentOS-7-x86_64-Minimal-2003.raw
file format: raw
virtual size: 5.0G (5368709120 bytes)
disk size: 5.0G

在ceph上查看镜像和glance池的数据

[root@cephnode01 ~]# rbd info  images/e7439786-1143-43fe-a509-f84d666c3fbf
rbd image 'e7439786-1143-43fe-a509-f84d666c3fbf':
    size 5 GiB in 640 objects
    order 23 (8 MiB objects)
    snapshot_count: 1
    id: 801f954c565d6
    block_name_prefix: rbd_data.801f954c565d6
    format: 2
    features: layering, exclusive-lock, object-map, fast-diff, deep-flatten
    op_features: 
    flags: 
    create_timestamp: Thu May 21 11:37:21 2020
    access_timestamp: Thu May 28 18:02:27 2020
    modify_timestamp: Thu May 21 12:54:51 2020

创建实例并查看cloud-init配置是否成功

cloud-init中添加了controller管理节点的ssh秘钥,并且修改了root密码为XXXX@2019

Openstack的config-drive机制

虚拟机镜像需要确保安装了 cloud-init
OpenStack 提供了命令行参数--config-drive 用于配置是否在创建虚拟机时使用 config drive 机制

nova boot --config-drive=true --image image-name --key-name mykey --flavor 1 --user-data \
./my-user-data.txt myinstance --file /etc/network/interfaces=/home/myuser/instance-interfaces

在/etc/nova/nova.conf中配置,直接使OpenStack计算服务在创建虚拟机时默认使用config drive 机制

注意

  • 如果镜像没有设置cloud_init,即使在计算节点的 /etc/nova/nova.conf 中配置 force_config_drive = true,也不会调用元数据信息

  • 如果镜像设置了cloud_init,在计算节点的 /etc/nova/nova.conf 中没有配置 force_config_drive = true,依然会调用元数据信息

  • 而此时因为不知道怎么去调,所以会有一些报错信息,这样会导致开机比较久,而且每次开机都会读取元数据信息

[DEFAULT]
force_config_drive=true
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,015评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,262评论 1 292
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,727评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,986评论 0 205
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,363评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,610评论 1 219
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,871评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,582评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,297评论 1 242
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,551评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,053评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,385评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,035评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,079评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,841评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,648评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,550评论 2 270