美文网首页OpenStack
云服务器cloud-init初始化工具的使用与配置

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

作者: Linux丶晨星 | 来源:发表于2020-05-27 11:40 被阅读0次

    [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
    

    相关文章

      网友评论

        本文标题:云服务器cloud-init初始化工具的使用与配置

        本文链接:https://www.haomeiwen.com/subject/fjqwahtx.html