Installing 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.
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.
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. For how to configure Cloud-Init, see Configuring Cloud-Init.
Note
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 using either of the following methods: (Recommended) Install Cloud-Init Using the Official Installation Package and Install Cloud-Init Using the Official Source Code Package and pip.
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):
which cloud-init
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 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):
which cloud-init
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.
Note
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 Cloud-Init has been installed, perform the following operations:
Check whether to use the SSH certificate in the ECS OS. If the certificate is no longer used, 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
Run the following command to delete the cache generated by Cloud-Init and ensure that the ECS created from the private image can be logged in by using the certificate:
sudo rm -rf /var/lib/cloud/*
Note
Do not restart the ECS after performing the configuration. Otherwise, you need to configure it 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/
Note
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 network 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 network installation source:
zypper refresh
Run the following command to install Cloud-Init:
zypper 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
Caution
For SUSE and openSUSE, perform the following steps to disable dynamic change of the ECS name:
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.
CentOS
Table 1 lists the Cloud-Init installation paths for CentOS. Select the required installation package from the following 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
Note
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
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
Fedora
Before installing Cloud-Init, ensure that the network installation source address 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:
yum 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 network installation source address 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 update
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
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 (version 0.7.9 is recommended) 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:
Note
If the ~/.pip/ directory does not exist, run the mkdir ~/.pip command to create it.
[global] index-url = https://<$mirror>/simple/ trusted-host = <$mirror>
Note
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
Note
For details about how to install a Cloud-Init source code package, see Cloud-Init Documentation
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
Caution
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.