cloud-init制作centos7镜像

一、环境说明
你需要准备一台KVM机器,用于制作初始的centos7镜像。建议最终将ISO镜像转为QCOW2。

二、配置好网络
ISO镜像的centos7系统刚装好,网络可能不通,所以要检查网络。
ping 外网检测

# ping www.baidu.com

如果未能ping通,请依次检测ip,route

# vi /etc/sysconfig/network-script/ifcfg-eth0

可以先将dhcp动态分配IP改为静态IP

#cgls 
#BOOTPROTO=dhcp
BOOTPROTO=static
IPADDR=172.16.5.133
GATEWAY=172.16.1.1
NETMASK=255.255.0.0
ONBOOT=yes

重启网卡使其生效

# service network restart

检查路由

# route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         172.16.1.1      0.0.0.0         UG    100    0        0 eth0
169.254.169.254 172.16.88.100   255.255.255.255 UGH   100    0        0 eth0
172.16.0.0      0.0.0.0         255.255.0.0     U     100    0        0 eth0 

如果你缺失第一个路由,是肯定无法ping通外网的这里写代码片
添加dns

# vim /etc/resolv.conf
nameserver 114.114.114.114
nameserver 8.8.8.8

添加路由

# route add default gw 172.16.1.1

试一下ping百度

# ping www.baidu.com

成功之后我们可以开始下一步操作。

三、安装相应的包
安装ACPI服务
这个服务是控制重启和关闭实例

# yum -y install acpid
# systemctl enable acpid

配置获取元数据
一个实例必须与元数据服务进行交互任务后再启动。 例如:必须得到实例 ssh公钥并运行脚本的用户数据。 为了确保实例执行这些任务,推荐安装一个cloud-init包。
使用cloud-init获取公钥,cloud-init包将从元数据服务器和一个帐户的关键的地方自动获取公钥 。
安装cloud-init。

# yum -y install cloud-init

cloud-init通过编辑/etc/cloud/cloud.cfg,对镜像进行定制。我们现在暂时不修改这个文件,将其他配置弄完再进行定制。

安装cloud-utils-growpart允许分区调整

# yum -y install cloud-utils-growpart

实例需要访问元数据服务, 必须禁用默认zeroconf路线。

# echo "NOZEROCONF=yes" >> /etc/sysconfig/network

配置控制台
如果希望在仪表盘界面查看nova控制台的日志,需要做以下配置:

# vi /etc/default/grub

修改GRUB_CMDLINE_LINUX为以下内容

GRUB_CMDLINE_LINUX="crashkernel=auto console=tty0 console=ttyS0,115200n8"

保存更改

# grub2-mkconfig -o /boot/grub2/grub.cfg

出现以下内容,配置结束。

Generating grub configuration file ...
Found linux image: /boot/vmlinuz-3.10.0-229.14.1.el7.x86_64
Found initrd image: /boot/initramfs-3.10.0-229.14.1.el7.x86_64.img
Found linux image: /boot/vmlinuz-3.10.0-229.4.2.el7.x86_64
Found initrd image: /boot/initramfs-3.10.0-229.4.2.el7.x86_64.img
Found linux image: /boot/vmlinuz-3.10.0-229.el7.x86_64
Found initrd image: /boot/initramfs-3.10.0-229.el7.x86_64.img
Found linux image: /boot/vmlinuz-0-rescue-605f01abef434fb98dd1309e774b72ba
Found initrd image: /boot/initramfs-0-rescue-605f01abef434fb98dd1309e774b72ba.img
done

三、进行定制
修改配置项,修改之前说两句。
阅读cloud-init官方文档,读几遍,确保你知道你在配置些什么,以及这些配置项是如何生效的,模块频率是怎样。
Users and Groups模块的模块频率是每个实例执行一次,也就是说你制作的镜像起了云主机之后,再修改这个模块配置重启机器是不再生效了。
与Users and Groups模块的模块频率相似的还有Write_files、Set Passwords模块。
Bootcmd模块的模块频率是每个实例可以执行多次,也就是说,起了云主机之后,再修改这个模块配置重启机器之后也会生效。
与Bootcmd模块的模块频率相似的还有Runcmd。

vi /etc/cloud/cloud.cfg

将locale_configfile: /etc/sysconfig/i18n之前的配置替换为以下内容。

groups:
  - centos

users:
  - name: demo
    expiredate: 2016-09-01
    groups: centos
    homedir: /home/bh
    lock_passwd: false
    passwd: $6$dfdfsdsf$y9obLvZMtAb.uWTIU1OTrZqZImHvCCs01ntDFwO0DnfFxXtgaLq2YoMK6yJ0KjfI260DH0Pv7T6Sj9TXVuUag0
  - name: root
    ssh_authorized_keys:
      - ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDYbA+xgxzm3pySQfW6oh7yr4xYD6n6T/upHuWAdVp/sU2ukeoDU/U6qPBpJuMVRzfaT6pyJEgK7gknaKu/GZxMfnA/9Dt5JJln6PmstWZoWclmxvS7MPCqeL0+ESFvMx64UZFIePbClb5kh1UFggQ5WwDvAIC+1HysI3qGOIZ/RoYUrOHNdgQJzV8xcpWLeDKF2MBNQt/Pyzl+WLxoTN6cd4XlrA9E729t8OwrK5mvTe9CUpWKYELGV6bfqNLGNcUT5LYx9tqyanB4KA1eBC5/9MhBjGeO+EcsQv6zooVJTIAE65XmCEib4WukQcUTr8Td7+6+wMY9463us2OrVVw7

bootcmd:
  - echo 123321 >> /root/bootcmd.log

write_files:
  - encoding: b64
    content: CiMgVGhpcyBmaWxlIGNvbnRyb2xzIHRoZSBzdGF0ZSBvZiBTRUxpbnV4...
    owner: root:root
    path: /etc/sysconfig/cjm
    permissions: '0644'
  - content: |
      # My new /etc/sysconfig/samba file

      SMDBOPTIONS="-D"
    path: /etc/sysconfig/cgls

runcmd:
  - [ sh, -c, sh /root/bootcmd.sh ]
  - [ sh, -c, echo "=========hello world'=========" >> /root/runcmd.log ]

ssh_pwauth: yes
chpasswd:
  list: |
    root:cjm123
  expire: False  

preserve_hostname: flase
fqdn: qwehost.local
hostname: qwehost

manage_etc_hosts: true

复制过去的时候注意格式问题。
注意格式问题:
1.确定空行一致性,统一以空2格作为区分。
2.冒号后空一格
3.写多行需要按照yuml语法编写
如果格式出了问题,你配置的cloud-init将全部失效。

解释配置:
1.配置了用户组

groups:
  - centos

2.配置用户,创建了demo用户,设置了过期时间,所属用户组,用户目录,以及是否开启密码登录,并为其设置了密码。
为root用户,设置了ssh免密码登录,附上了公钥。
密码是通过加密的产生的,生成命令为:

# python -c 'import crypt; print crypt.crypt("cgls", "$6$dfdfsdsf")'

在需要免密码登录的机器上执行下面命令,产生密钥对。

# ssh-keygen -t rsa

将公钥内容复制到配置中。

cat /root/.ssh/id_rsa.pub
users:
  - name: demo
    expiredate: 2016-09-01
    groups: centos
    homedir: /home/bh
    lock_passwd: false
    passwd: $6$dfdfsdsf$y9obLvZMtAb.uWTIU1OTrZqZImHvCCs01ntDFwO0DnfFxXtgaLq2YoMK6yJ0KjfI260DH0Pv7T6Sj9TXVuUag0
  - name: root
    ssh_authorized_keys:
      - ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDYbA+xgxzm3pySQfW6oh7yr4xYD6n6T/upHuWAdVp/sU2ukeoDU/U6qPBpJuMVRzfaT6pyJEgK7gknaKu/GZxMfnA/9Dt5JJln6PmstWZoWclmxvS7MPCqeL0+ESFvMx64UZFIePbClb5kh1UFggQ5WwDvAIC+1HysI3qGOIZ/RoYUrOHNdgQJzV8xcpWLeDKF2MBNQt/Pyzl+WLxoTN6cd4XlrA9E729t8OwrK5mvTe9CUpWKYELGV6bfqNLGNcUT5LYx9tqyanB4KA1eBC5/9MhBjGeO+EcsQv6zooVJTIAE65XmCEib4WukQcUTr8Td7+6+wMY9463us2OrVVw7

3.Bootcmd只用于在引导过程之后不能做的时候再使用

bootcmd:
  - echo 123321 >> /root/bootcmd.log

4.写文件,第一个是加密之后的内容,第二个是正常内容。

write_files:
  - encoding: b64
    content: CiMgVGhpcyBmaWxlIGNvbnRyb2xzIHRoZSBzdGF0ZSBvZiBTRUxpbnV4...
    owner: root:root
    path: /etc/sysconfig/cjm
    permissions: '0644'
  - content: |
      # My new /etc/sysconfig/samba file

      SMDBOPTIONS="-D"
    path: /etc/sysconfig/cgls

5.与bootcmd类似,可在引导之后使用

runcmd:
  - [ sh, -c, sh /root/bootcmd.sh ]
  - [ sh, -c, echo "=========hello world'=========" >> /root/runcmd.log ]

6.设置root用户密码

ssh_pwauth: yes
chpasswd:
  list: |
    root:cjm123
  expire: False  

最后就是修改静态IP为dhcp动态获取了

# vi /etc/sysconfig/network-scripts/ifcfg-eth0 
#cgls 
BOOTPROTO=dhcp
#BOOTPROTO=static
#IPADDR=172.16.5.133
#GATEWAY=172.16.1.1
#NETMASK=255.255.0.0
ONBOOT=yes

关机

# poweroff

四、开启云主机
上传镜像到openstack上

# openstack image create "centos7_init" --file centos7.0-3.qcow2 --disk-format qcow2 --container-format bare --public

控制台界面中自己开启云主机,可以看到自己定制的centos7有没有成功了。

你可能感兴趣的:(centos7系统,openstack,cloud-init)