(Optional) Installing and Configuring Cloud-Init
Scenarios
To ensure that you can use the user data injection function to inject initial custom information into ECSs created from a private image (such as setting the ECS login password), install Cloud-Init on the ECS used to create the image.
- By default, ECSs created from a public image have Cloud-Init installed. You do not need to install or configure Cloud-Init on such ECSs.
- For ECSs created using an external image file, install and configure Cloud-Init by performing the operations in this section.
- You need to download Cloud-Init from its official website. Therefore, you must bind an EIP to the ECS.
- If Cloud-Init is not installed, you cannot configure an ECS. As a result, you can only use the password in the image file to log in to the created ECSs.

Cloud-Init is open-source software. If the installed version has security vulnerabilities, you are advised to upgrade it to the latest version.
Prerequisites
- An EIP has been bound to the ECS.
- You have logged in to the ECS.
- The ECS uses DHCP to obtain IP addresses.
Procedure
- Check whether Cloud-Init has been installed.
For details, see Check Whether Cloud-Init Has Been Installed.
- Install Cloud-Init.
You can install Cloud-Init in any of the following ways: (Recommended) Install Cloud-Init Using the Official Installation Package, Install Cloud-Init Using the Official Source Code Package and pip, and Install Cloud-Init Using the Official GitHub Source Code.
Check Whether Cloud-Init Has Been Installed
Perform the operations provided here to check whether Cloud-Init has been installed. The methods of checking whether Cloud-Init is installed vary depending on the OSs.
- If you are in a Python 3 environment, run the following command to check whether Cloud-Init is installed (Ubuntu 22.0.4 is used as an example):
- If information similar to the following is displayed, Cloud-Init has been installed:
/usr/bin/cloud-init
- If information similar to the following is displayed, Cloud-Init is not installed:
/usr/bin/which: no cloud-init in (/usr/local/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin)
- If information similar to the following is displayed, Cloud-Init has been installed:
- If you are in a Python 2 environment, run the following command to check whether Cloud-Init is installed (CentOS 6 is used as an example):
- If information similar to the following is displayed, Cloud-Init has been installed:
cloud-init-0.7.5-10.el6.centos.2.x86_64
- If no information is returned, Cloud-Init is not installed.
To confirm Cloud-Init is really not installed, you are advised to run rpm -qa |grep cloud-init to check again. If either of which cloud-init and rpm -qa |grep cloud-init shows that Cloud-Init has been installed, Cloud-Init is installed.
- If information similar to the following is displayed, Cloud-Init has been installed:
- Determine whether to continue to use the SSH certificate in the OS of this ECS. If no, delete it.
- If the certificate is stored in a directory of user root, for example, /$path/$to/$root/.ssh/authorized_keys, run the following commands:
cd /root/.ssh
rm authorized_keys
- If the certificate is not stored in a directory of user root, for example, /$path/$to/$none-root/.ssh/authorized_keys, run the following commands:
cd /home/centos/.ssh
rm authorized_keys
- If the certificate is stored in a directory of user root, for example, /$path/$to/$root/.ssh/authorized_keys, run the following commands:
- Delete the cache data generated by Cloud-Init to ensure that ECSs created from the private image can be logged in by using an SSH certificate:
sudo rm -rf /var/lib/cloud/*

After the operations are complete, do not restart the ECS. Otherwise, you need to perform these operations again.
(Recommended) Install Cloud-Init Using the Official Installation Package
The method of installing Cloud-Init on an ECS varies depending on the OS. Perform the installation operations as user root.
The following describes how to install Cloud-Init on an ECS running SUSE Linux, CentOS, Fedora, Debian, and Ubuntu. For other OS types, install the required type of Cloud-Init. For example, you need to install coreos-cloudinit on ECSs running CoreOS.
- SUSE Linux
Paths for obtaining the Cloud-Init installation package for SUSE Linux
https://ftp5.gwdg.de/pub/opensuse/repositories/Cloud:/Tools/
http://download.opensuse.org/repositories/Cloud:/Tools/
Select the required repo installation package in the provided paths.
Take SUSE Enterprise Linux Server 12 as an example. Perform the following steps to install Cloud-Init:
- Log in to the ECS used to create a Linux private image.
- Run the following command to install the online installation source for SUSE Enterprise Linux Server 12:
zypper ar https://ftp5.gwdg.de/pub/opensuse/repositories/Cloud:/Tools/SLE_12_SP3/Cloud:Tools.repo
- Run the following command to update the online installation source:
- Run the following command to install Cloud-Init:
- Run the following commands to enable Cloud-Init to automatically start upon system boot:
- 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 and 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
For SUSE and openSUSE, perform the following steps to prevent DHCP from changing the hostname:
- Run the following command to open the dhcp file using the vi editor:
vi etc/sysconfig/network/dhcp
- Change the value of DHCLIENT_SET_HOSTNAME in the dhcp file to no.
- SUSE 11
- CentOS
Table 1 lists the Cloud-Init installation paths for CentOS. Select an epel-release installation package matching your OS.
Table 1 Cloud-Init installation package addresses OS Type
Version
How to Obtain
CentOS
6 32-bit
6 64-bit
https://archives.fedoraproject.org/pub/archive/epel/6/x86_64/
7 64-bit
https://archives.fedoraproject.org/pub/archive/epel/7/x86_64/Packages/e/
- Run the following commands to install Cloud-Init:
yum install Cloud-Init installation package address/epel-release-x-y.noarch.rpm
yum install cloud-init
Cloud-Init installation package address indicates the address of the Cloud-Init epel-release installation package, and x-y indicates the version of the Cloud-Init epel-release required by the current OS. Replace them with the actual values according to Table 1.
- Take CentOS 6 64-bit as an example. If the version is 6.8, the command is as follows:
yum install https://archives.fedoraproject.org/pub/archive/epel/6/x86_64/epel-release-6-8.noarch.rpm
- Take CentOS 7 64-bit as an example. If the version is 7.14, the command is as follows:
yum install https://archives.fedoraproject.org/pub/archive/epel/7/x86_64/Packages/e/epel-release-7-14.noarch.rpm
- Take CentOS 6 64-bit as an example. If the version is 6.8, the command is as follows:
- Run the following commands to enable Cloud-Init to automatically start upon system boot:
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
- Run the following commands to install Cloud-Init:
- Fedora
Before installing Cloud-Init, ensure that the online installation source has been configured for the OS by checking whether the /etc/yum.repo.d/fedora.repo file contains the installation source address of the software package. If the file does not contain the address, configure the address by following the instructions on the Fedora official website.
- Run the following command to install Cloud-Init:
- Run the following commands to enable Cloud-Init to automatically start upon system boot:
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 and Ubuntu
Before installing Cloud-Init, ensure that the online installation source has been configured for the OS by checking whether the /etc/apt/sources.list file contains the installation source address of the software package. If the file does not contain the address, configure the address by following the instructions on the Debian or Ubuntu official website.
- Run the following commands to install Cloud-Init:
apt-get install cloud-init
- Run the following commands to enable Cloud-Init to automatically start upon system boot:
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 is used as an example to describe how to install Cloud-Init on CentOS, Fedora, Ubuntu, Debian, and SUSE.
Download the cloud-init-23.2.2.tar.gz source code package from https://launchpad.net/cloud-init/trunk/23.2.2/+download/cloud-init-23.2.2.tar.gz.
- Run the following commands to install Cloud-Init:
- Centos 7/Fedora Server 36
Ensure that Python 3 has been installed.
- Check whether Cloud-Init has been installed. If any command output is displayed, Cloud-Init has been installed.
cloud-init -v
- Delete the cache directory of Cloud-Init.
rm -rf /var/lib/cloud/*
- Install dependency packages of Cloud-Init.
yum install python3-pip -y yum install python3-devel
- Download the Cloud-Init package.
wget https://launchpad.net/cloud-init/trunk/23.2.2/+download/cloud-init-23.2.2.tar.gz
- Decompress the Cloud-Init package.
tar -zxvf cloud-init-23.2.2.tar.gz
- Go to the cloud-init-23.2.2 directory and install dependent libraries:
cd cloud-init-23.2.2 pip3 install -r requirements.txt
- Install Cloud-Init.
python3 setup.py build python3 setup.py install --init-system systemd
- (Optional) Disable Cloud-Init's network configuration capability by modifying the /etc/cloud/cloud.cfg file.
vi /etc/cloud/cloud.cfg
Add the following content to the file:
network: config: disabled
- Restart Cloud-Init and check its status.
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
- Enable Cloud-Init related services to automatically start upon system boot.
systemctl enable cloud-init-local.service cloud-init.service cloud-config.service cloud-final.service
- Check whether Cloud-Init is running properly.
cloud-init -v cloud-init init --local
- Check whether Cloud-Init has been installed. If any command output is displayed, Cloud-Init has been installed.
- Ubuntu 22.0.4/Debian 11
Ensure that Python 3 has been installed.
- Check and delete redundant Cloud-Init configuration files.
rm -rf /var/lib/cloud/* rm -f /var/log/cloud-init*
Delete all files except log-related configuration files from the /etc/cloud/cloud.cfg.d/ directory.
- Update your package list and check whether Wget is installed. If it is not, install it.
sudo apt update sudo apt install wget
- Install dependency packages.
apt-get install cloud-guest-utils -y apt-get install python3-pip -y apt-get install python3-devel
- Download the Cloud-Init package.
wget https://launchpad.net/cloud-init/trunk/23.2.2/+download/cloud-init-23.2.2.tar.gz
- Decompress the Cloud-Init package.
tar -zxvf cloud-init-23.2.2.tar.gz
- Go to the cloud-init directory.
cd cloud-init-23.2.2
- Install dependent libraries.
pip3 install -r requirements.txt
- Install Cloud-Init.
python3 setup.py install
-
(Optional) Disable Cloud-Init's network configuration capability.
You need to do so when the Cloud-Init version is 0.7.9 or later and you want to configure the network.
1. Open the /etc/cloud/cloud.cfg file.
vi /etc/cloud/cloud.cfg
2. Enter i and configure network. (If there is no such a configuration item, add it.)
network: config: disabled
- Restart Cloud-Init and check its status.
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
- Enable Cloud-Init related services to automatically start upon system boot.
systemctl enable cloud-init-local.service cloud-init.service cloud-config.service cloud-final.service
- Check whether Cloud-Init is running properly.
cloud-init -v cloud-init init --local
- Check and delete redundant Cloud-Init configuration files.
- SUSE Enterprise Linux Server 15
Ensure that Python 3 has been installed.
- View existing SUSE repositories.
zypper lr
- Delete the SUSE repositories.
zypper rr No. of repositories listed in 1
- Configure a SUSE repository.
zypper ar https://ftp5.gwdg.de/pub/opensuse/repositories/Cloud:/Tools/SLE_15_SP4/Cloud:Tools.repo
- Refresh the SUSE repository.
zypper refresh
- Install Cloud-Init.
zypper install cloud-init
- Run cloud-init -v. If error messages similar to the following are displayed, install the dependency packages.
pip install requests pyyaml oauthlib jsonschema jsonpatch jinja2 configobj
- Check whether Cloud-Init is successfully installed. If the following error message is displayed, configure datasource_list in /etc/cloud/cloud.cfg.
datasource_list: [ OpenStack ] datasource: OpenStack: metadata_urls: ['http://169.254.169.254'] max_wait: 120 timeout: 5 apply_network_config: false
- Modify the configuration file, restart Cloud-Init, and check the Cloud-Init status.
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
- Enable Cloud-Init related services to automatically start upon system boot.
systemctl enable cloud-init-local.service cloud-init.service cloud-config.service cloud-final.service
- Check whether Cloud-Init is running properly.
cloud-init -v cloud-init init --local
- View existing SUSE repositories.
Install Cloud-Init Using the Official Source Code Package and pip
The following operations use Cloud-Init 0.7.9 as an example to describe how to install Cloud-Init.
- Download the cloud-init-0.7.9.tar.gz source code package and upload it to the /home/ directory of the ECS.
Download cloud-init-0.7.9.tar.gz from the following path:
https://launchpad.net/cloud-init/trunk/0.7.9/+download/cloud-init-0.7.9.tar.gz
- Create a pip.conf file in the ~/.pip/ directory and edit the following content:
If the ~/.pip/ directory does not exist, run the mkdir ~/.pip command to create it.
[global] index-url = https://<$mirror>/simple/ trusted-host = <$mirror>
Replace <$mirror> with a public network PyPI source.
Public network PyPI source: https://pypi.python.org/
- Run the following command to install the downloaded Cloud-Init source code package (select --upgrade as needed during installation):
pip install [--upgrade] /home/cloud-init-0.7.9.tar.gz
- Run the cloud-init -v command. Cloud-Init is installed successfully if the following information is displayed:
cloud-init 0.7.9
- Enable Cloud-Init to automatically start upon system boot.
- If the OS uses SysVinit to manage automatic start of services, run the following commands:
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
- If the OS uses Systemd to manage automatic start of services, run the following commands:
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
- If the OS uses SysVinit to manage automatic start of services, run the following commands:

If you install Cloud-Init using the official source code package and pip, pay attention to the following:
- Add user syslog to the adm group during the installation. If user syslog exists, add it to the adm group. For some OSs (such as CentOS and SUSE), user syslog may not exist. Run the following commands to create user syslog and add it to the adm group:
useradd syslog
groupadd adm
usermod -g adm syslog
- Change the value of distro in system_info in the /etc/cloud/cloud.cfg file based on the OS release version, such as distro: ubuntu, distro: sles, distro: debian, and distro: fedora.
Install Cloud-Init Using the Official GitHub Source Code
You can obtain the Cloud-Init source code from GitHub at https://github.com/canonical/cloud-init/
- Run the following commands to download the source code package and copy it to the /tmp/CLOUD-INIT folder:
Cloud-Init 0.7.6: https://github.com/canonical/cloud-init/archive/refs/tags/0.7.6.zip
Cloud-Init 0.7.9: https://github.com/canonical/cloud-init/archive/refs/tags/0.7.9.zip
All versions: 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
- Run the following command to decompress the package:
- Run the following command to enter the cloud-init-0.7.6 folder:
cd cloud-init-0.7.6
- (Optional) If the Cloud-Init version is 18.3 to 22.3, run the following commands:
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
If the following information is displayed, the execution is successful.
- Install Cloud-Init. The commands vary depending on the OS type.
- For CentOS 6.x or SUSE 11.x, run the following commands:
python setup.py install --init-system sysvinit
- For CentOS 7.x or SUSE 12.x, run the following commands:
python setup.py install --init-system systemd
Add user syslog to the adm group during the installation. If user syslog exists, add it to the adm group. For some OSs (such as CentOS and SUSE), user syslog may not exist. Run the following commands to create user syslog and add it to the adm group:
useradd syslog
groupadd adm
usermod -g adm syslog
- For CentOS 6.x or SUSE 11.x, run the following commands:
- Enable Cloud-Init to automatically start upon system boot.
- If the OS uses SysVinit to manage automatic start of services, run the following commands:
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
- If the OS uses Systemd to manage automatic start of services, run the following commands:
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
- If the OS uses SysVinit to manage automatic start of services, run the following commands:
- Run the following commands to check whether Cloud-Init has been installed:
cloud-init init --local
Cloud-Init is successfully installed if the following information is displayed:
cloud-init 0.7.6
Configure Cloud-Init
- Enable SSH authentication and remote password login for user root.
Take CentOS 6.7 as an example. If the value of disable_root in the /etc/cloud/cloud.cfg file is 0, the permissions are enabled. (In some OSs, value true indicates that the permissions are disabled, and false indicates that the permissions are enabled). Set ssh_pwauth to 1, and lock_passwd to False (indicating that user passwords are not locked).
users: - name: root lock_passwd: False disable_root: 0 ssh_pwauth: 1
- If you inject a password, use it for remote login through SSH or noVNC.
- If you inject a key, use it for remote login through SSH.
- Modify the /etc/cloud/cloud.cfg file to disable Cloud-Init's network configuration capability.
If the Cloud-Init version is 0.7.9 or later, add the following content to /etc/cloud/cloud.cfg:
Figure 1 Disabling Cloud-Init's network configuration capabilityThe added content must be in the YAML format.
- Enable the agent to access the IaaS OpenStack data source.
Add the following information to the last line of /etc/cloud/cloud.cfg:
datasource_list: [ OpenStack ] datasource: OpenStack: metadata_urls: ['http://169.254.169.254'] max_wait: 120 timeout: 5 apply_network_config: false
- You can decide whether to set max_wait and timeout. The values of max_wait and timeout in the preceding command output are only for reference.
- If the OS version is earlier than Debian 8 or CentOS 5, you cannot enable the agent to access the IaaS OpenStack data source.
- The default zeroconf route must be disabled for CentOS and EulerOS ECSs for accurate access to the IaaS OpenStack data source.
echo "NOZEROCONF=yes" >> /etc/sysconfig/network
- apply_network_config: false is only requited by users who use Cloud-Init 18.3 or later.
- Add the following content to /etc/cloud/cloud.cfg:
manage_etc_hosts: localhost
This prevents the system from staying in the Waiting for cloudResetPwdAgent state for a long time during ECS startup.
Figure 2 Adding manage_etc_hosts: localhost - Run the vi /etc/ssh/sshd_config command to open the /etc/ssh/sshd_config file using the vi editor.
Change the value of PasswordAuthentication in the sshd_config file to yes.
For SUSE and openSUSE, change the values of the following parameters in the sshd_config file to yes:
- PasswordAuthentication
- ChallengeResponseAuthentication
- Modify cloud_init_modules in the cloud.cfg configuration file.
- Move ssh from the bottom to the top to speed up the SSH login.
- Enable the hostname update. Do not comment out or delete the -update_hostname statement.
cloud_init_modules: - ssh - migrator - bootcmd - write-files - growpart - resizefs - set_hostname - update_hostname - update_etc_hosts - rsyslog - users-groups
- Modify the configuration so that the hostname of the ECS created from the image does not contain the .novalocal suffix and can contain a dot (.).
- Run the following command to modify the __init__.py file:
vi /usr/lib/python*.*/site-packages/cloudinit/sources/__init__.py
The Python version varies depending on the OS.
Press i to enter editing mode. Modify the file content as follows based on the keyword toks:
if toks: toks = str(toks).split('.') else: #toks = ["ip-%s" % lhost.replace(".", "-")] # Comment out this line. toks = lhost.split(".novalocal") # Add this line. if len(toks) > 1: hostname = toks[0] #domain = '.'.join(toks[1:]) # Comment out this line. else: hostname = toks[0] if fqdn and domain != defdomain: return hostname #return "%s.%s" % (hostname, domain) # Comment out this line. else: return hostname
After the modification is complete, press Esc to exit the editing mode and enter :wq! to save the settings and exit.
- Run the following command to switch to the cloudinit/sources folder:
cd /usr/lib/python*.*/site-packages/cloudinit/sources/
The Python version varies depending on the OS.
- Run the following commands to delete the __init__.pyc file and the optimized __init__.pyo file:
rm -rf __init__.pyc
rm -rf __init__.pyo
- Run the following commands to clear the logs:
rm -rf /var/log/cloud-init*
Delete all files except log-related configuration files from the /etc/cloud/cloud.cfg.d/ directory.
- Run the following command to modify the __init__.py file:
- Run the following command to edit the /etc/cloud/cloud.cfg.d/05_logging.cfg file to use cloudLogHandler to process logs:
vim /etc/cloud/cloud.cfg.d/05_logging.cfg
[logger_cloudinit] level=DEBUG qualname=cloudinit handlers=cloudLogHandler propagate=1
- Delete user linux and the /home/linux directory from the image template.
userdel linux
rm -fr /home/linux
- Ensure that Cloud-Init is enabled.
If the /etc/cloud/cloud-init.disabled file exists, run cloud-init clean --machine-id. If there is no such a file, skip this step.
Check the Cloud-Init Configuration
Run the following command to check whether Cloud-Init has been properly configured:
cloud-init init --local

(Optional) Run the following command to set the password validity period to the maximum:
chage -M 99999 $user_name
user_name is a system user, such as user root.
You are advised to set the password validity period to 99999.
Feedback
Was this page helpful?
Provide feedbackThank you very much for your feedback. We will continue working to improve the documentation.See the reply and handling status in My Cloud VOC.
For any further questions, feel free to contact us through the chatbot.
Chatbot