更新时间:2024-03-01 GMT+08:00

配置Cloud-Init工具

操作场景

Cloud-Init工具安装完成后,请参考本节操作配置Cloud-Init工具。

前提条件

  • 已安装Cloud-Init工具。
  • 已为云服务器绑定弹性公网IP。
  • 已登录云服务器
  • 云服务器的网卡属性为DHCP方式。

配置步骤说明

包含如下两步操作:

  1. 配置Cloud-Init工具。

    具体操作请参考配置Cloud-Init工具

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

    具体操作请参考检查Cloud-Init工具相关配置是否成功

配置Cloud-Init工具

  1. 用户可以根据需要及用户类型配置登录云服务器的用户权限。使用普通账户(非root)登录,需要禁用root用户的ssh权限,禁用密码远程登录,仅支持证书登录的方式,提高云服务器的安全性。
    • 用户可通过给普通账户注入的密钥进行远程SSH登录(推荐只开启密钥方式创建云服务器)。
    • 用户也可以通过noVNC控制台提示的随机密码进行noVNC登录。

    执行以下命令,使用vi编辑器打开“sshd_config”文件。

    vi /etc/ssh/sshd_config

  2. 将“sshd_config”文件中的“PasswordAuthentication”的值修改为“no”。

    如果是SUSE和openSUSE操作系统,需要同时配置“sshd_config”文件中的以下两个参数为“no”。

    • PasswordAuthentication
    • ChallengeResponseAuthentication
  3. 执行以下命令,使用vi编辑器打开“cloud.cfg”文件。

    vi /etc/cloud/cloud.cfg

  4. (可选)在“/etc/cloud/cloud.cfg”中配置“apply_network_config”为“false”。

    对于使用Cloud-Init 18.3及以上版本的用户,需执行本操作。

    图1 配置示例
  5. 在“/etc/cloud/cloud.cfg”中禁用root用户的ssh权限,并增加普通用户(后续弹性云服务器通过VNC登录使用的用户)、且为该用户设置密码和赋予sudo权限。

    针对Ubuntu、Debian操作系统,需将“/etc/cloud/cloud.cfg中的manage_etc_hosts”参数设置为“localhost”,否则会出现非root用户切换root超时问题。

    以下以Ubuntu操作系统为例。

    • 新建一个可产生随机密码的可执行权限的脚本“/etc/cloud/set_linux_random_password.sh”。

      cat /etc/cloud/set_linux_random_password.sh

      文件内容参考如下:
      #!/bin/bash
      
      password=$(cat /dev/urandom | tr -dc 'A-Za-z0-9!@#$%&+=' | head -c 9)
      
      echo "linux:$password" | chpasswd
      sed -i -e '/^Login/d' /etc/issue
      sed -i -e '/^Initial/d' /etc/issue
      sed -i -c -e '/^$/d' /etc/issue
      echo -e "\nInitial login with linux:$password\n" >> /etc/issue

      “set_linux_random_password.sh”是拥有可执行权限的,可以通过chmod +x /etc/cloud/set_linux_random_password.sh命令添加权限。

    • 用户登录弹性云服务器后,请执行以下命令,添加页面显示友好提示:首次登录要及时修改非root账户密码。

      echo -e '\e[1;31m#################################\\e[0m' > /etc/motd

      echo -e '\e[1;31m# Important !!! #\e[0m' >> /etc/motd

      echo -e '\e[1;31m# Please change password for user linux after first login. #\e[0m' >> /etc/motd

      echo -e '\e[1;31m#################################\e[0m' >> /etc/motd

      echo -e '' >> /etc/motd

  6. 参照以下加粗部分增加普通登录用户,并为该用户设置密码和赋予sudo的权限,并通过bootcmd每次新创建弹性云服务器时调用产生随机密码的脚本。

    修改配置文件时,请注意配置文件的格式(对齐,空格)要与示例保持一致。

    system_info: 
        # This will affect which distro class gets used 
        distro: rhel 
        # Default user name + that default users groups (if added/used) 
        default_user: 
          name: linux  #登录使用的用户名。 
          lock_passwd: False  #False,表示当前不禁用密码登录的方式,注意部分操作系统此处配置为0表示不禁用。 
          gecos: Cloud User 
          groups: users  #可选项,将用户添加到另外的组里,groups必须是系统里/etc/group已存在的组。 
          passwd: $6$I63DBVKK$Zh4lchiJR7NuZvtJHsYBQJIg5RoQCRLS1X2Hsgj2s5JwXI7KUO1we8WYcwbzeaS2VNpRmNo28vmxxCyU6LwoD0
          sudo: ["ALL=(ALL) NOPASSWD:ALL"]  #表示设置用户具有root用户的所有权限。 
          shell: /bin/bash  #shell执行采用bash方式。 
        # Other config here will be given to the distro class and/or path classes 
        paths: 
           cloud_dir: /var/lib/cloud/ 
           templates_dir: /etc/cloud/templates/ 
        ssh_svcname: sshd
    
    bootcmd:
    - [cloud-init-per, instance, password, bash, 
    /etc/cloud/set_linux_random_password.sh] 

    其中passwd不是密码本身,而是通过SHA512加密过的,此处的SHA512加密方法仅为举例使用。关于更多参数的详情,请参考:https://cloudinit.readthedocs.io/en/latest/topics/examples.html

    可以参考以下步骤生成SHA512加密密码。此处以生成cloud.1234的加密密码为例。

    [root@** ~]# python -c "import crypt, getpass, pwd; print crypt.mksalt()"
    $6$I63DBVKK
    [root@** ~]# python -c "import crypt, getpass, pwd; print crypt.crypt('cloud.1234', '\$6\$I63DBVKK')"
    $6$I63DBVKK$Zh4lchiJR7NuZvtJHsYBQJIg5RoQCRLS1X2Hsgj2s5JwXI7KUO1we8WYcwbzeaS2VNpRmNo28vmxxCyU6LwoD0
  7. 配置agent访问OpenStack数据源。
    在“/etc/cloud/cloud.cfg”最后一行添加如下内容,配置agent访问OpenStack数据源。
    datasource_list: [ OpenStack ]
    datasource:
      OpenStack:
        metadata_urls: ['http://169.254.169.254']
        max_wait: 120
        timeout: 5
    • max_wait和timeout可由用户自定义是否需要配置,上述示例中max_wait和timeout的取值仅供参考。
    • 当操作系统版本低于Debian8、CentOS 5时,不支持配置agent访问OpenStack数据源。
    • CentOS、EulerOS操作系统云服务器必须要禁用默认的zeroconf路由,以便精确访问OpenStack数据源。

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

  8. 在配置文件“/etc/cloud/cloud.cfg”中禁用Cloud-Init接管网络。

    当Cloud-Init版本等于或高于0.7.9版本时,在配置文件“/etc/cloud/cloud.cfg”中增加如下内容,禁用Cloud-Init接管网络。

    network:
      config: disabled

    增加的内容需严格按照yaml格式进行配置。

    图2 禁用Cloud-Init接管网络
  9. 修改cloud.cfg配置文件里面的cloud_init_modules配置。

    在“cloud_init_modules”中将ssh从最后提前到第一位处理,提高云服务器ssh登录速度。

    图3 提高云服务器ssh登录速度
  10. 修改以下配置,使得镜像创建的云服务器主机名不带“.novalocal”后缀,且主机名称中可以带点号。
    1. 执行如下命令,修改“__init__.py”文件。

      vi /usr/lib/python2.7/site-packages/cloudinit/sources/__init__.py

      按“i”进入编辑模式,根据关键字toks查询,修改内容如下信息所示。
      if toks:
          toks = str(toks).split('.')
      else:
          #toks = ["ip-%s" % lhost.replace(".", "-")]  #屏蔽此行
          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 hostname   #屏蔽此行
          return "%s.%s" % (hostname, domain)   #增加此行
      else:
          return hostname

      修改完成后按“ESC”退出编辑模式,输入:wq!保存并退出。

      图4 修改__init__.py文件
    2. 执行如下命令进入“cloudinit/sources”文件夹。

      cd /usr/lib/python2.7/site-packages/cloudinit/sources/

    3. 执行如下命令,删除“__init__.pyc”文件和优化编译后的“__init__.pyo”文件。

      rm -rf __init__.pyc

      rm -rf __init__.pyo

    4. 执行如下命令,清理日志信息。

      rm -rf /var/lib/cloud/*

      rm -rf /var/log/cloud-init*

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

    vim /etc/cloud/cloud.cfg.d/05_logging.cfg

    图5 配置为cloudLogHandler

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

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

cloud-init init --local

正确安装的Cloud-Init会显示Cloud-Init的版本详细信息,并且无任何错误信息。例如,正确安装的情况下,不含有缺少文件的提示信息。

执行如下命令,可将系统用户密码有效期设置为最大。此操作可选。

chage -M 99999 $user_name

其中,user_name为系统用户,例如root账户。

密码有效期建议设置为99999。