
# （可选）安装和配置Cloud-Init工具
#### 操作场景
为了保证使用私有镜像创建的新弹性云服务器可以通过"用户数据注入"功能注入初始化自定义信息（例如为弹性云服务器设置登录密码），请在创建私有镜像前安装Cloud-Init工具。
- 使用公共镜像创建的弹性云服务器，默认已经安装Cloud-Init，不需要执行安装及配置操作。
- 用户导入镜像创建的弹性云服务器，请按照指导安装及配置Cloud-Init。
- 安装Cloud-Init工具时需要从官网下载并安装，因此，需要提前为弹性云服务器绑定弹性公网IP。
- 不安装Cloud-Init工具，将无法对弹性云服务器进行自定义配置，只能使用镜像原有密码登录弹性云服务器。
 
![](https://support.huaweicloud.com/usermanual-ims/public_sys-resources/note_3.0-zh-cn.png)
Cloud-Init为开源软件，如果安装版本有安全漏洞，建议更新至最新版本。
#### 前提条件
- 已为弹性云服务器绑定弹性公网IP。
- 已登录弹性云服务器。
- 弹性云服务器的网卡属性为DHCP方式。
 
#### 安装步骤说明
1. 请先检查是否已安装Cloud-Init工具。 具体操作请参考[检查是否已经安装Cloud-Init工具]。
   
2. 安装Cloud-Init工具。 Cloud-Init安装方式分为：
   - [采用官方提供的包源安装Cloud-Init工具（优先推荐）]
   
   - [采用官方提供的Cloud-Init源码包通过pip方式安装Cloud-Init工具]
   
   - [采用官方源码编译安装方法]
    
 
 #### 检查是否已经安装Cloud-Init工具
请先执行如下步骤检查是否已安装Cloud-Init工具。在不同的操作系统下，查看是否已经安装Cloud-Init工具的方法不同。
- [python3 环境（以Ubuntu22.0.4为例）]
  - 若依赖**python3** 环境时，以Ubuntu22.0.4为例，执行以下命令查看是否安装Cloud-Init工具。
    ```
    which cloud-init
    ```
    - 回显类似如下，表示已经安装Cloud-Init工具，无需重复安装。
      ```
      /usr/bin/cloud-init
      ```
      
    
    - 回显类似如下，表示未安装Cloud-Init工具。
      ```
      /usr/bin/which: no cloud-init in (/usr/local/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin)
      ```
      
     
   
- [python2 环境（以CentOS 6系列为例）]
  - 若依赖**python2** 环境时，以CentOS 6系列为例，执行以下命令查看是否安装Cloud-Init工具。
    ```
    which cloud-init
    ```
    - 回显类似如下，表示已经安装Cloud-Init工具，无需重复安装。
      ```
      cloud-init-0.7.5-10.el6.centos.2.x86_64
      ```
      
    
    - 无回显信息表示未安装Cloud-Init工具。
      ![](https://support.huaweicloud.com/usermanual-ims/public_sys-resources/note_3.0-zh-cn.png)
      由于Cloud-Init工具存在多种安装方法，如果无回显信息，请再次使用**rpm -qa \|grep cloud-init** 命令进行检查。**which cloud-init** 和**rpm -qa \|grep cloud-init**任何一个命令显示已安装，表示操作系统已安装Cloud-Init工具。
      
     
   
如果已安装Cloud-Init工具，还需要执行以下操作：
- 请确认当前弹性云服务器操作系统中用于SSH登录的证书是否继续使用。如果不再使用该证书，请删除证书。
  - root用户对应目录下的文件（如"*/$path/$to/$root/* .ssh/authorized_keys"），执行以下命令：
    ```
    cd /root/.ssh
    rm authorized_keys
    ```
    
  
  - 非root用户对应目录下的证书文件（如"*/$path/$to/$none-root/* .ssh/authorized_keys"），执行以下命令：
    ```
    cd /home/centos/.ssh
    rm authorized_keys
    ```
    
   
- 执行以下命令，清除Cloud-Init工具产生的缓存，确保使用该私有镜像创建的弹性云服务器可以使用证书方式登录。
  ```
  sudo rm -rf /var/lib/cloud/*
  ```
  
![](https://support.huaweicloud.com/usermanual-ims/public_sys-resources/note_3.0-zh-cn.png)
设置完成后请勿重启弹性云服务器，否则，需重新设置。
 #### 采用官方提供的包源安装Cloud-Init工具（优先推荐）
在不同操作系统的弹性云服务器上安装Cloud-Init工具的方法不同，请在root用户下执行相关安装操作。
以下将介绍SUSE、CentOS、Fedora、Debian和Ubuntu操作系统安装Cloud-Init工具的具体方法。其他操作系统类型，请安装并配置对应类型的Cloud-Init工具，例如，使用CoreOS操作系统时需安装并配置coreos-cloudinit。
- [SUSE]
  - SUSE操作系统的Cloud-Init网络安装地址： [https://ftp5.gwdg.de/pub/opensuse/repositories/Cloud:/Tools/](https://ftp5.gwdg.de/pub/opensuse/repositories/Cloud:/Tools)
    <https://download.opensuse.org/repositories/Cloud:/Tools/>
    ![](https://support.huaweicloud.com/usermanual-ims/public_sys-resources/note_3.0-zh-cn.png)
    在上述提供的网络安装地址下选择相应操作系统版本的repo安装包进行安装。
    以SUSE Enterprise Linux Server 12为例，Cloud-Init工具的安装步骤如下。
    1. 登录到创建Linux私有镜像所使用的弹性云服务器。
    
    2. 执行以下命令，安装SUSE 12的网络安装源。
       ```
       zypper ar https://ftp5.gwdg.de/pub/opensuse/repositories/Cloud:/Tools/SLE_12_SP3/Cloud:Tools.repo
       ```
       
    
    3. 执行以下命令，更新网络安装源。
       ```
       zypper refresh
       ```
       
    
    4. 执行以下命令，安装Cloud-Init。
       ```
       zypper install cloud-init
       ```
       
    
    5. 执行以下命令，设置Cloud-Init为开机自启动服务。
       - SUSE 11：
         ```
         chkconfig cloud-init-local on; chkconfig cloud-init on; chkconfig cloud-config on; chkconfig cloud-final on
         service cloud-init-local status; service cloud-init status; service cloud-config status; service cloud-final status
         ```
         
       
       - SUSE 12以及openSUSE 12/13/42：
         ```
         systemctl enable cloud-init-local.service cloud-init.service cloud-config.service cloud-final.service
         systemctl status cloud-init-local.service cloud-init.service cloud-config.service cloud-final.service
         ```
         
       
       
       ![](https://support.huaweicloud.com/usermanual-ims/public_sys-resources/caution_3.0-zh-cn.png)
       对于SUSE和openSUSE操作系统，请执行以下步骤禁止动态修改主机名称。
       1. 执行以下命令，使用vi编辑器打开"dhcp"文件。
          ```
          vi /etc/sysconfig/network/dhcp
          ```
          
       
       2. 将"dhcp"文件中的"DHCLIENT_SET_HOSTNAME"的值修改为"no"。
         
     
   
- [CentOS]
  - CentOS操作系统的Cloud-Init网络安装地址如[表1]所示。请在提供的网络安装地址下选择相应的epel-release安装包进行安装。
     表1Cloud-Init网络安装地址 
    | 操作系统类型 | 版本     | 网络安装地址                                                                     |
    |:---|:---|:---|
    | CentOS | 6系列32位 | <https://archives.fedoraproject.org/pub/archive/epel/6/i386/>              |
    | CentOS | 6系列64位 | <https://archives.fedoraproject.org/pub/archive/epel/6/x86_64/>            |
    | CentOS | 7系列64位 | <https://archives.fedoraproject.org/pub/archive/epel/7/x86_64/Packages/e/> |
       
    1. 执行以下命令安装Cloud-Init：
       ```
       yum install 网络安装地址/epel-release-x-y.noarch.rpm
       yum install cloud-init
       ```
       ![](https://support.huaweicloud.com/usermanual-ims/public_sys-resources/note_3.0-zh-cn.png)
       "网络安装地址"表示Cloud-Init对应的epel-release安装包的地址，*"* *x-y"* 表示当前操作系统对应的Cloud-Init epel-release版本号，执行命令时需参考[表1]以及实际使用的安装包版本进行替换。
       - 以CentOS 6系列64位为例，当前版本号为6.8，则命令修改为：
         ```
         yum install https://archives.fedoraproject.org/pub/archive/epel/6/x86_64/epel-release-6-8.noarch.rpm
         ```
         
       
       - 以CentOS 7系列64位为例，当前版本号为7.14，则命令修改为：
         ```
         yum install https://archives.fedoraproject.org/pub/archive/epel/7/x86_64/Packages/e/epel-release-7-14.noarch.rpm
         ```
         
         
    
    2. 执行以下命令，设置Cloud-Init为开机自启动服务。
       ```
       systemctl enable cloud-init-local.service cloud-init.service cloud-config.service cloud-final.service
       systemctl status cloud-init-local.service cloud-init.service cloud-config.service cloud-final.service
       ```
       
     
   
- [Fedora]
  - Fedora操作系统安装Cloud-Init前，请确认操作系统已经配置好对应的网络安装源地址，请查看"/etc/yum.repo.d/fedora.repo"文件中是否已配置相关软件包安装源地址，如果没有配置相关地址源，请参考[Fedora官网相关信息](https://docs.fedoraproject.org/zh_CN/quick-docs/fedora-repositories/)配置软件包安装源。
    1. 执行以下命令，安装Cloud-Init。
       ```
       yum install cloud-init
       ```
       
    
    2. 执行以下命令，设置Cloud-Init为开机自启动服务。
       ```
       systemctl enable cloud-init-local.service cloud-init.service cloud-config.service cloud-final.service systemctl status cloud-init-local.service cloud-init.service cloud-config.service cloud-final.service
       ```
       
     
   
- [Debian/Ubuntu]
  - Debian和Ubuntu操作系统安装Cloud-Init前，请确认操作系统已经配置好对应的网络安装源地址，请查看"/etc/apt/sources.list"文件中是否已配置相关软件包安装源地址，如果没有配置相关地址源，请参考[Debian官网相关信息](https://www.debian.org/doc/manuals/debian-handbook/apt.zh-cn.html#sect.apt-sources.list)或者[Ubuntu官网相关信息](https://help.ubuntu.com/community/Repositories/CommandLine)配置软件包安装源。
    1. 执行以下命令，安装Cloud-Init。
       ```
       apt-get update
       apt-get install cloud-init
       ```
       
    
    2. 执行以下命令，设置Cloud-Init为开机自启动服务。
       ```
       systemctl enable cloud-init-local.service cloud-init.service cloud-config.service cloud-final.service
       systemctl status cloud-init-local.service cloud-init.service cloud-config.service cloud-final.service
       ```
       
     
   
**以cloud-init-23.2.2版本为例，介绍Centos、Fedora、Ubuntu、Debian和SUSE操作系统安装Cloud-Init工具的具体方法，安装步骤如下。**
cloud-init-23.2.2.tar.gz源码包下载地址：<https://launchpad.net/cloud-init/trunk/23.2.2/+download/cloud-init-23.2.2.tar.gz>
- [CentOS 7/Fedora 36]
  - CentOS 7/Fedora 36操作系统安装cloud-init-23.2.2版本操作步骤如下：
    ![](https://support.huaweicloud.com/usermanual-ims/public_sys-resources/notice_3.0-zh-cn.png)
    依赖python3 环境，确认已经安装python3。
    1. 查询当前系统环境是否已安装cloud-init, 执行有结果表示已经安装。
       ```
       cloud-init -v
       ```
       
    
    2. 删除cloud-init缓存目录。
       ```
       rm -rf /var/lib/cloud/*
       ```
       
    
    3. 安装cloud-init依赖包。
       ```
       yum install python3-pip -y
       yum install python3-devel
       ```
       
    
    4. 执行如下命令，下载cloud-init压缩包。
       ```
       wget https://launchpad.net/cloud-init/trunk/23.2.2/+download/cloud-init-23.2.2.tar.gz
       ```
       
    
    5. 执行如下命令，解压cloud-init压缩包。
       ```
       tar -zxvf cloud-init-23.2.2.tar.gz
       ```
       
    
    6. 执行如下命令进入cloud-init-23.2.2目录文件夹，并安装所有依赖库。
       ```
       cd cloud-init-23.2.2
       pip3 install -r requirements.txt
       ```
       
    
    7. 执行如下命令安装cloud-init。
       ```
       python3 setup.py build
       python3 setup.py install --init-system systemd
       ```
       
    
    8. 在配置文件/etc/cloud/cloud.cfg禁用cloud-init接管网络（可选）。
       ```
       vi /etc/cloud/cloud.cfg
       ```
       添加如下内容：
       ```
       network:
         config: disabled
       ```
       
    
    9. 重启cloud-init, 查看cloud-init 状态。
       ```
       systemctl restart cloud-init-local.service cloud-init.service cloud-config.service cloud-final.service
       systemctl status cloud-init-local.service cloud-init.service cloud-config.service cloud-final.service
       ```
       ![](https://support.huaweicloud.com/usermanual-ims/zh-cn_image_0000001688060529.png "点击放大")
       
    
    10. 设置cloud-init相关服务为开机自启动。
        ```
        systemctl enable cloud-init-local.service cloud-init.service cloud-config.service cloud-final.service
        ```
        
    
    11. 执行如下命令检查cloud-init版本以及是否正常运行。
        ```
        cloud-init -v
        cloud-init init --local
        ```
        ![](https://support.huaweicloud.com/usermanual-ims/zh-cn_image_0000001639899816.png "点击放大")
        
     
   
- [Ubuntu/debian]
  - Ubuntu 22.0.4/debian 11操作系统安装cloud-init-23.2.2版本操作步骤如下：
    ![](https://support.huaweicloud.com/usermanual-ims/public_sys-resources/notice_3.0-zh-cn.png)
    依赖python3 环境，确认已经安装python3。
    1. 检查并清理系统自带的cloud-init可能存在冗余的配置文件。
       ```
       rm -rf /var/lib/cloud/*
       rm -f /var/log/cloud-init*
       ```
       删除/etc/cloud/cloud.cfg.d/目录下除了log相关的配置文件外的所有文件。
       
    
    2. 执行如下命令更新apt，检查是否有wget，没有则安装。
       ```
       sudo apt update
       sudo apt install wget
       ```
       
    
    3. 执行如下命令，安装依赖包。
       ```
       apt-get install cloud-guest-utils -y
       apt-get install python3-pip -y
       apt-get install python3-devel
       ```
       
    
    4. 执行以下命令，下载cloud-init压缩包。
       ```
       wget https://launchpad.net/cloud-init/trunk/23.2.2/+download/cloud-init-23.2.2.tar.gz
       ```
       
    
    5. 执行如下命令，解压cloud-init压缩包。
       ```
       tar -zxvf cloud-init-23.2.2.tar.gz
       ```
       
    
    6. 进入cloud-init目录。
       ```
       cd cloud-init-23.2.2
       ```
       
    
    7. 执行如下命令安装所有依赖库。
       ```
       pip3 install -r requirements.txt
       ```
       
    
    8. 执行如下命令安装cloud-init。
       ```
       python3 setup.py install
       ```
       
    
    9. 在vi /etc/cloud/cloud.cfg配置禁止cloud-init接管网络（可选）。
       ![](https://support.huaweicloud.com/usermanual-ims/public_sys-resources/note_3.0-zh-cn.png)
       1.当cloud-init版本等于高于0.7.9版本，且用户需要自定义网络时，在cloud-init安装完成后，请执行如下命令，在编辑器中打开/etc/cloud/cloud.cfg。
       ```
       vi /etc/cloud/cloud.cfg
       ```
       2.输入i, 在/etc/cloud/cloud.cfg中将network修改为disabled, 禁用Cloud-Init接管网络配置（若没有该配置项请增加）:
       ```
       network:
         config: disabled
       ```
       
    
    10. 重启cloud-init, 查看cloud-init 状态。
        ```
        systemctl restart cloud-init-local.service cloud-init.service cloud-config.service cloud-final.service
        systemctl status cloud-init-local.service cloud-init.service cloud-config.service cloud-final.service
        ```
        
    
    11. 设置cloud-init相关服务为开机自启动。
        ```
        systemctl enable cloud-init-local.service cloud-init.service cloud-config.service cloud-final.service
        ```
        
    
    12. 执行如下命令检查cloud-init版本以及是否正常运行。
        ```
        cloud-init -v
        cloud-init init --local
        ```
        
    
    
    
    
   
- [SUSE Enterprise Linux Server]
  - SUSE Enterprise Linux Server 15操作系统安装cloud-init-23.2.2版本操作步骤如下：
    ![](https://support.huaweicloud.com/usermanual-ims/public_sys-resources/notice_3.0-zh-cn.png)
    依赖python3 环境，确认已经安装python3。
    1. 执行如下命令查看历史已配置好的安装源。
       ```
       zypper lr
       ```
       
    
    2. 执行如下命令删除历史配置的suse的cloud-init的源。
       ```
       zypper rr 步骤1中执行结果显示的序号
       ```
       
    
    3. 执行如下命令配置suse源。
       ```
       zypper ar https://ftp5.gwdg.de/pub/opensuse/repositories/Cloud:/Tools/SLE_15_SP4/Cloud:Tools.repo
       ```
       
    
    4. 执行如下命令刷新suse源。
       ```
       zypper refresh
       ```
       
    
    5. 执行如下命令安装cloud-init。
       ```
       zypper install cloud-init
       ```
       
    
    6. 安装cloud-init成功后，执行**cloud-init -v** ，若出现类似下图报错提示，需执行如下命令安装依赖包。
       ![](https://support.huaweicloud.com/usermanual-ims/zh-cn_image_0000001688251829.png "点击放大")
       ![](https://support.huaweicloud.com/usermanual-ims/zh-cn_image_0000001640131918.png "点击放大")
       ```
       pip install requests pyyaml oauthlib jsonschema jsonpatch jinja2 configobj
       ```
       
    
    7. 检查cloud-init是否安装成功，若出现下图报错提示，则需要在/etc/cloud/cloud.cfg配置datasource_list。
       ![](https://support.huaweicloud.com/usermanual-ims/zh-cn_image_0000001639765024.png "点击放大")
       ```
       datasource_list: [ OpenStack ]
       datasource:
         OpenStack:
           metadata_urls: ['https://169.254.169.254']
           max_wait: 120
           timeout: 5
           apply_network_config: false
       ```
       
    
    8. 修改配置文件后，重启cloud-init， 并查看cloud-init 的状态。
       ```
       systemctl restart cloud-init-local.service cloud-init.service cloud-config.service cloud-final.service 
       systemctl status cloud-init-local.service cloud-init.service cloud-config.service cloud-final.service
       ```
       
    
    9. 设置cloud-init相关服务为开机自启动。
       ```
       systemctl enable cloud-init-local.service cloud-init.service cloud-config.service cloud-final.service
       ```
       ![](https://support.huaweicloud.com/usermanual-ims/zh-cn_image_0000001688204517.png "点击放大")
       
    
    10. 执行如下命令检查cloud-init版本以及是否正常运行。
        ```
        cloud-init -v
        cloud-init init --local
        ```
        
     
   
 #### 采用官方提供的Cloud-Init源码包通过pip方式安装Cloud-Init工具
以cloud-init-0.7.9版本为例，Cloud-Init工具的安装步骤如下。
1. 下载cloud-init-0.7.9.tar.gz源码包，上传到弹性云服务器指定目录"/home/"下。 cloud-init-0.7.9.tar.gz源码包下载地址：
   <https://launchpad.net/cloud-init/trunk/0.7.9/+download/cloud-init-0.7.9.tar.gz>
   
2. 在"\~/.pip/"目录下新建pip.conf文件，编辑内容如下。
   ![](https://support.huaweicloud.com/usermanual-ims/public_sys-resources/note_3.0-zh-cn.png)
   "\~/.pip/"若不存在，可使用命令**mkdir \~/.pip**命令新建。
   ```
   [global]
   index-url  = https://<$mirror>/simple/
   trusted-host = <$mirror>
   ```
   ![](https://support.huaweicloud.com/usermanual-ims/public_sys-resources/note_3.0-zh-cn.png)
   编辑内容中**\<$mirror\>**部分可以选择公网PyPI源或教育网PyPI源进行替换。
   - 公网PyPI源：<https://pypi.python.org/>
   
   
   
   - 教育网PyPI源：<https://pypi.tuna.tsinghua.edu.cn/>
     <https://pypi.mirrors.ustc.edu.cn/>
     
     
3. 执行以下命令，安装本地下载的Cloud-Init源码包，安装过程中根据需要选择**--upgrade** 参数。
   ```
   pip install [--upgrade] /home/cloud-init-0.7.9.tar.gz
   ```
   ![](https://support.huaweicloud.com/usermanual-ims/public_sys-resources/note_3.0-zh-cn.png)
   安装Cloud-Init源码包的更多信息，请参见[cloud-init官方文档](https://cloudinit.readthedocs.io/?spm=a2c4g.11186623.0.0.c8bb67b7NIX4Oa)。
   
4. 执行命令**cloud-init -v** ，如回显如下类似信息表示安装Cloud-Init成功。
   ```
   cloud-init 0.7.9
   ```
   
5. 设置Cloud-Init相关服务为开机自启动。
   - 若操作系统是sysvinit自启动管理服务，则执行以下命令进行设置。
     ```
     chkconfig --add cloud-init-local; chkconfig --add cloud-init; chkconfig --add cloud-config; chkconfig --add cloud-final
     chkconfig cloud-init-local on; chkconfig cloud-init on; chkconfig cloud-config on; chkconfig cloud-final on
     service cloud-init-local status; service cloud-init status; service cloud-config status; service cloud-final status
     ```
     
   
   - 若操作系统是systemd自启动管理服务，则执行以下命令进行设置。
     ```
     systemctl enable cloud-init-local.service cloud-init.service cloud-config.service cloud-final.service
     systemctl status cloud-init-local.service cloud-init.service cloud-config.service cloud-final.service
     ```
     ![](https://support.huaweicloud.com/usermanual-ims/public_sys-resources/caution_3.0-zh-cn.png)
     采用官方提供的Cloud-Init源码包通过pip方式进行安装时要注意以下两点。
     1. Cloud-Init安装时需要添加syslog用户到adm组。存在syslog用户时直接添加syslog用户到adm组。不存在syslog用户时（如CentOS和SUSE），执行下列命令创建syslog用户，添加到adm组：
        ```
        useradd syslog
        groupadd adm
        usermod -g adm syslog
        ```
        
     
     2. 在"/etc/cloud/cloud.cfg"中system_info部分的distro要根据具体操作系统发行版本做相应修改（如根据具体操作系统发行版相应修改为：distro: ubuntu，distro: sles，distro: debian，distro: fedora）。
       
    
 
 #### 采用官方源码编译安装方法
官方源码编译安装方法的Cloud-Init工具Github开源地址：<https://github.com/canonical/cloud-init/>
1. 执行以下命令，下载Cloud-Init压缩包，并将其复制至新建的"/tmp/CLOUD-INIT"文件夹。
   ![](https://support.huaweicloud.com/usermanual-ims/public_sys-resources/note_3.0-zh-cn.png)
   0.7.6版本安装包下载地址：<https://github.com/canonical/cloud-init/archive/refs/tags/0.7.6.zip>
   0.7.9版本安装包下载地址：<https://github.com/canonical/cloud-init/archive/refs/tags/0.7.9.zip>
   Cloud-Init所有版本安装包下载地址：<https://github.com/canonical/cloud-init/releases>
   ```
   wget https://github.com/canonical/cloud-init/archive/refs/tags/0.7.6.zip
   mkdir /tmp/CLOUD-INIT
   cp cloud-init-0.7.6.zip /tmp/CLOUD-INIT
   cd /tmp/CLOUD-INIT
   ```
   
2. 执行如下命令，解压Cloud-Init压缩包。
   ```
   unzip cloud-init-0.7.6.zip
   ```
   
3. 执行如下命令进入cloud-init-0.7.6文件夹。
   ```
   cd cloud-init-0.7.6
   ```
   
4. 若cloud-init为18.3\~22.3版本，则需要进行如下适配。否则跳过本步骤，继续执行下一步。
   ```
   sed -i '/VALID_DMI_ASSET_TAGS =/a\VALID_DMI_ASSET_TAGS += ["HUAWEICLOUD"]' cloudinit/sources/DataSourceOpenStack.py
   cat cloudinit/sources/DataSourceOpenStack.py | grep VALID_DMI_ASSET_TAGS
   ```
   确认执行结果如下图，表示语句添加成功。
   ![](https://support.huaweicloud.com/usermanual-ims/zh-cn_image_0000001390619817.png "点击放大")
   
5. 按照操作系统类型，执行相应的命令安装Cloud-Init安装包。
   - CentOS6.x/SUSE11.x：
     ```
     python setup.py build
     python setup.py install --init-system sysvinit
     ```
     
   
   - CentOS7.x/SUSE12.x：
     ```
     python setup.py build
     python setup.py install --init-system systemd
     ```
     
   
   
   ![](https://support.huaweicloud.com/usermanual-ims/public_sys-resources/note_3.0-zh-cn.png)
   Cloud-Init安装时需要添加syslog用户到adm组。存在syslog用户时直接添加syslog用户到adm组。不存在syslog用户时（如CentOS和SUSE），执行下列命令创建syslog用户，添加到adm组：
   ```
   useradd syslog
   groupadd adm
   usermod -g adm syslog
   ```
   
6. 设置Cloud-Init相关服务为开机自启动。
   - 若操作系统是sysvinit自启动管理服务，则执行以下命令进行设置。
     ```
     chkconfig --add cloud-init-local; chkconfig --add cloud-init; chkconfig --add cloud-config; chkconfig --add cloud-final
     chkconfig cloud-init-local on; chkconfig cloud-init on; chkconfig cloud-config on; chkconfig cloud-final on
     service cloud-init-local status; service cloud-init status; service cloud-config status; service cloud-final status
     ```
     
   
   - 若操作系统是systemd自启动管理服务，则执行以下命令进行设置。
     ```
     systemctl enable cloud-init-local.service cloud-init.service cloud-config.service cloud-final.service
     systemctl status cloud-init-local.service cloud-init.service cloud-config.service cloud-final.service
     ```
     
    
7. 执行如下命令检查Cloud-Init是否安装成功。
   ```
   cloud-init -v
   cloud-init init --local
   ```
   回显如下类似信息所示表示安装Cloud-Init成功。
   ```
   cloud-init 0.7.6
   ```
   
 
#### 配置Cloud-Init工具
1. 设置开放root密码远程登录并开启root用户的ssh权限。
   以CentOS 6.7系列操作系统为例，在"/etc/cloud/cloud.cfg"设置"disable_root"值为"0"表示不禁用（部分OS的Cloud-Init配置使用"true"表示禁用，"false"表示不禁用），设置"ssh_pwauth"为"1"启用密码远程登录，"lock_passwd"设置为"False"表示不锁住用户密码。
   ```
   users:
    - name: root
      lock_passwd: False
   disable_root: 0
   ssh_pwauth: 1
   ```
   ![](https://support.huaweicloud.com/usermanual-ims/public_sys-resources/note_3.0-zh-cn.png)
   - 若用户选择注入密码，则通过自己注入的密码进行远程SSH或noVNC登录。
   
   - 若用户选择注入密钥，则通过自己注入的密钥进行远程SSH登录。
     

2. 在配置文件"/etc/cloud/cloud.cfg"中禁用Cloud-Init接管网络。 当Cloud-Init版本等于或高于0.7.9版本时，在配置文件"/etc/cloud/cloud.cfg"中增加如下内容，禁用Cloud-Init接管网络。
   图1禁用Cloud-Init接管网络   
   ![](https://support.huaweicloud.com/usermanual-ims/zh-cn_image_0000001347730670.png)
   ![](https://support.huaweicloud.com/usermanual-ims/public_sys-resources/note_3.0-zh-cn.png)
   增加的内容需严格按照yaml格式进行配置。
   
3. 配置agent访问数据源。
   - 在"/etc/cloud/cloud.cfg"最后一行添加如下内容，配置agent访问OpenStack数据源。
     ```
     datasource_list: [ OpenStack ]
     datasource:
       OpenStack:
         metadata_urls: ['http://169.254.169.254']
         max_wait: 120
         timeout: 5
         apply_network_config: false
     ```
     
   
   
   ![](https://support.huaweicloud.com/usermanual-ims/public_sys-resources/note_3.0-zh-cn.png)
   - max_wait和timeout可由用户自定义是否需要配置，上述回显信息中max_wait和timeout的取值仅供参考。
   
   - 当操作系统版本低于Debian8、CentOS 5时，不支持配置agent访问OpenStack数据源。
   
   - CentOS、EulerOS操作系统弹性云服务器必须要禁用默认的zeroconf路由，以便精确访问OpenStack数据源。 **echo "NOZEROCONF=yes" \>\> /etc/sysconfig/network**
     
   
   - apply_network_config: false为可选项，对于使用Cloud-Init 18.3及以上版本的用户，需添加此配置项。
     
4. 在配置文件"/etc/cloud/cloud.cfg"中补充如下内容。
   ```
   manage_etc_hosts: localhost
   ```
   防止启动弹性云服务器时，系统长时间卡在"Waiting for cloudResetPwdAgent"状态。
   图2新增manage_etc_hosts: localhost   
   ![](https://support.huaweicloud.com/usermanual-ims/zh-cn_image_0140701743.png "点击放大") 
5. 执行**vi /etc/ssh/sshd_config** 命令，在vi编辑器中打开"/etc/ssh/sshd_config"。
   将"sshd_config"中的"PasswordAuthentication"的值修改为"yes"。
   ![](https://support.huaweicloud.com/usermanual-ims/public_sys-resources/note_3.0-zh-cn.png)
   如果是SUSE和openSUSE操作系统，需要同时配置"sshd_config"文件中的以下两个参数为"yes"。
   - PasswordAuthentication
   
   - ChallengeResponseAuthentication
     
6. 修改cloud.cfg配置文件里面的cloud_init_modules配置。
   - 将ssh从最后提前到第一位处理，提高弹性云服务器ssh登录速度。
   
   - 开启机器名更新机制，请勿注释或删除" - update_hostname"语句。
     ```
     cloud_init_modules:
      - ssh
      - migrator
      - bootcmd
      - write-files
      - growpart
      - resizefs
      - set_hostname
      - update_hostname
      - update_etc_hosts
      - rsyslog
      - users-groups
     ```
     
    
7. 修改以下配置使得镜像创建的弹性云服务器主机名不带".novalocal"后缀且主机名称中可以带点号。
   1. 执行如下命令，修改"__init__.py"文件。
      ```
      vi /usr/lib/python*.*/site-packages/cloudinit/sources/__init__.py
      ```
      不同OS安装的**python**版本有差异，请选择对应的路径。
      按"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!**保存并退出。
      
   
   2. 执行如下命令进入"cloudinit/sources"文件夹。
      ```
      cd /usr/lib/python*.*/site-packages/cloudinit/sources/
      ```
      不同OS安装的**python**版本有差异，请选择对应的路径。
      
   
   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*
      ```
      删除/etc/cloud/cloud.cfg.d/目录下除了log相关配置文件外的所有文件。
      
    
8. 执行以下命令编辑Cloud-Init日志输出路径配置文件，设置日志处理方式handlers，建议配置为cloudLogHandler。
   ```
   vim /etc/cloud/cloud.cfg.d/05_logging.cfg
   ```
   ```
   [logger_cloudinit]
   level=DEBUG
   qualname=cloudinit
   handlers=cloudLogHandler
   propagate=1
   ```
   
9. 确保删除镜像模板中已经存在的linux账户和"/home/linux"目录。
   ```
   userdel linux
   rm -fr /home/linux
   ```
   
10. 确保Cloud-Init启用。 若存在/etc/cloud/cloud-init.disabled文件，则执行**cloud-init clean --machine-id**，否则跳过。
    
 
#### 检查Cloud-Init工具相关配置是否成功
执行以下命令，无错误发生，说明Cloud-Init配置成功。
```
cloud-init init --local
```
正确安装的Cloud-Init会显示Cloud-Init的版本详细信息，并且无任何错误信息。例如，正确安装的情况下，不含有缺少文件的提示信息。
![](https://support.huaweicloud.com/usermanual-ims/public_sys-resources/note_3.0-zh-cn.png)
执行如下命令，可将系统用户密码有效期设置为最大。此操作可选。
```
chage -M 99999 $user_name
```
其中，user_name为系统用户，例如root账户。
密码有效期建议设置为99999。
