安装Cloud-Init工具
操作场景
为了保证使用私有镜像创建的新云服务器可以通过“用户数据注入”功能注入初始化自定义信息(例如为云服务器设置登录密码),请在创建私有镜像前安装Cloud-Init工具。
- 安装Cloud-Init工具时需要从官网下载并安装,因此,需要提前为云服务器绑定弹性公网IP。
- 不安装Cloud-Init工具,将无法对云服务器进行自定义配置,只能使用镜像原有密码登录云服务器。
- 使用公共镜像创建的云服务器,默认已经安装Cloud-Init,不需要执行安装及配置操作。
- 用户导入镜像创建的云服务器,请按照指导安装及配置Cloud-Init。配置Cloud-Init操作请参考配置Cloud-Init工具章节。
Cloud-Init为开源软件,如果安装版本有安全漏洞,建议更新至最新版本。
前提条件
- 已为云服务器绑定弹性公网IP。
- 已登录云服务器。
- 云服务器的网卡属性为DHCP方式。
安装步骤说明
- 请先检查是否已安装Cloud-Init工具。
具体操作请参考检查是否已经安装Cloud-Init工具。
- 安装Cloud-Init工具。
Cloud-Init安装方式分为:采用官方提供的包源安装Cloud-Init工具(优先推荐)、采用官方提供的Cloud-Init源码包通过pip方式安装Cloud-Init工具和采用官方源码编译安装方法。
检查是否已经安装Cloud-Init工具
请先执行如下步骤检查是否已安装Cloud-Init工具。在不同的操作系统下,查看是否已经安装Cloud-Init工具的方法不同。
- 若依赖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)
- 回显类似如下,表示已经安装Cloud-Init工具,无需重复安装。
- 若依赖python2 环境时,以CentOS 6系列为例,执行以下命令查看是否安装Cloud-Init工具。
which cloud-init
- 回显类似如下,表示已经安装Cloud-Init工具,无需重复安装。
cloud-init-0.7.5-10.el6.centos.2.x86_64
- 无回显信息表示未安装Cloud-Init工具。
由于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
- root用户对应目录下的文件(如“/$path/$to/$root/.ssh/authorized_keys”),执行以下命令:
- 执行以下命令,清除Cloud-Init工具产生的缓存,确保使用该私有镜像创建的云服务器可以使用证书方式登录。
sudo rm -rf /var/lib/cloud/*
设置完成后请勿重启云服务器,否则,需重新设置。
采用官方提供的包源安装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/
http://download.opensuse.org/repositories/Cloud:/Tools/
在上述提供的网络安装地址下选择相应操作系统版本的repo安装包进行安装。
以SUSE Enterprise Linux Server 12为例,Cloud-Init工具的安装步骤如下。
- 登录到创建Linux私有镜像所使用的云服务器。
- 执行以下命令,安装SUSE 12的网络安装源。
zypper ar https://ftp5.gwdg.de/pub/opensuse/repositories/Cloud:/Tools/SLE_12_SP3/Cloud:Tools.repo
- 执行以下命令,更新网络安装源。
- 执行以下命令,安装Cloud-Init。
- 执行以下命令,设置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
- SUSE 11:
- CentOS操作系统
CentOS操作系统的Cloud-Init网络安装地址如表1所示。请在提供的网络安装地址下选择相应的epel-release安装包进行安装。
表1 Cloud-Init网络安装地址 操作系统类型
版本
网络安装地址
CentOS
6系列32位
6系列64位
https://archives.fedoraproject.org/pub/archive/epel/6/x86_64/
7系列64位
https://archives.fedoraproject.org/pub/archive/epel/7/x86_64/Packages/e/
- 执行以下命令安装Cloud-Init:
yum install 网络安装地址/epel-release-x-y.noarch.rpm
yum install cloud-init
“网络安装地址”表示Cloud-Init对应的epel-release安装包的地址,“x-y”表示当前操作系统对应的Cloud-Init epel-release版本号,执行命令时需参考表1以及实际使用的安装包版本进行替换。
- 执行以下命令,设置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:
- Fedora操作系统
安装Cloud-Init前,请确认操作系统已经配置好对应的网络安装源地址,请查看“/etc/yum.repo.d/fedora.repo”文件中是否已配置相关软件包安装源地址,如果没有配置相关地址源,请参考相关Fedora官网信息配置软件包安装源。
- Debian和Ubuntu操作系统
安装Cloud-Init前,请确认操作系统已经配置好对应的网络安装源地址,请查看“/etc/apt/sources.list”文件中是否已配置相关软件包安装源地址,如果没有配置相关地址源,请参考Debian或者Ubuntu官网信息配置软件包安装源。
- 执行以下命令,安装Cloud-Init。
apt-get install cloud-init
- 执行以下命令,设置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
- 执行以下命令,安装Cloud-Init。
- Centos 7/Fedora (Fedora-Server-36)操作系统
依赖python3 环境,确认已经安装python3。
- 查询当前系统环境是否已安装cloud-init, 执行有结果表示已经安装。
cloud-init -v
- 删除cloud-init缓存目录。
rm -rf /var/lib/cloud/*
- 安装cloud-init依赖包
yum install python3-pip -y yum install python3-devel
- 执行如下命令,下载cloud-init压缩包。
wget https://launchpad.net/cloud-init/trunk/23.2.2/+download/cloud-init-23.2.2.tar.gz
- 执行如下命令,解压cloud-init压缩包。
tar -zxvf cloud-init-23.2.2.tar.gz
- 执行如下命令进入cloud-init-23.2.2目录文件夹,并安装所有依赖库。
cd cloud-init-23.2.2 pip3 install -r requirements.txt
- 执行如下命令安装cloud-init。
python3 setup.py build python3 setup.py install --init-system systemd
- 在配置文件/etc/cloud/cloud.cfg禁用cloud-init接管网络(可选)。
vi /etc/cloud/cloud.cfg
添加如下内容:
network: config: disabled
- 重启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
- 设置cloud-init相关服务为开机自启动。
systemctl enable cloud-init-local.service cloud-init.service cloud-config.service cloud-final.service
- 执行如下命令检查cloud-init版本以及是否正常运行。
cloud-init -v cloud-init init --local
- 查询当前系统环境是否已安装cloud-init, 执行有结果表示已经安装。
- Ubuntu22.0.4/debian11操作系统
依赖python3 环境,确认已经安装python3。
- 检查并清理系统自带的cloud-init可能存在冗余的配置文件。
rm -rf /var/lib/cloud/* rm -f /var/log/cloud-init*
删除/etc/cloud/cloud.cfg.d/目录下除了log相关的配置文件外的所有文件。
- 执行如下命令更新apt,检查是否有wget,没有则安装。
sudo apt update sudo apt install wget
- 执行如下命令,安装依赖包。
apt-get install cloud-guest-utils -y apt-get install python3-pip -y apt-get install python3-devel
- 执行以下命令,下载cloud-init压缩包。
wget https://launchpad.net/cloud-init/trunk/23.2.2/+download/cloud-init-23.2.2.tar.gz
- 执行如下命令,解压cloud-init压缩包。
tar -zxvf cloud-init-23.2.2.tar.gz
- 进入cloud-init目录。
cd cloud-init-23.2.2
- 执行如下命令安装所有依赖库。
pip3 install -r requirements.txt
- 执行如下命令安装cloud-init。
python3 setup.py install
- 在vi /etc/cloud/cloud.cfg配置禁止cloud-init接管网络(可选)。
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
- 重启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
- 设置cloud-init相关服务为开机自启动。
systemctl enable cloud-init-local.service cloud-init.service cloud-config.service cloud-final.service
- 执行如下命令检查cloud-init版本以及是否正常运行。
cloud-init -v cloud-init init --local
- 检查并清理系统自带的cloud-init可能存在冗余的配置文件。
- SUSE Enterprise Linux Server 15操作系统
依赖python3 环境,确认已经安装python3。
- 执行如下命令查看历史已配置好的安装源。
zypper lr
- 执行如下命令删除历史配置的suse的cloud-init的源。
zypper rr 步骤1中执行结果显示的序号
- 执行如下命令配置suse源。
zypper ar https://ftp5.gwdg.de/pub/opensuse/repositories/Cloud:/Tools/SLE_15_SP4/Cloud:Tools.repo
- 执行如下命令刷新suse源。
zypper refresh
- 执行如下命令安装cloud-init。
zypper install cloud-init
- 安装cloud-init成功后,执行cloud-init -v,若出现类似下图报错提示,需执行如下命令安装依赖包。
pip install requests pyyaml oauthlib jsonschema jsonpatch jinja2 configobj
- 检查cloud-init是否安装成功,若出现下图报错提示,则需要在/etc/cloud/cloud.cfg配置datasource_list。
- 修改配置文件后,重启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
- 设置cloud-init相关服务为开机自启动。
systemctl enable cloud-init-local.service cloud-init.service cloud-config.service cloud-final.service
- 执行如下命令检查cloud-init版本以及是否正常运行。
cloud-init -v cloud-init init --local
- 执行如下命令查看历史已配置好的安装源。
采用官方提供的Cloud-Init源码包通过pip方式安装Cloud-Init工具
以cloud-init-0.7.9版本为例,Cloud-Init工具的安装步骤如下。
- 下载cloud-init-0.7.9.tar.gz源码包(推荐优先选用0.7.9版本),上传到云服务器指定目录“/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
- 在“~/.pip/”目录下新建pip.conf文件,编辑内容如下。
“~/.pip/”若不存在,可使用命令mkdir ~/.pip命令新建。
[global] index-url = https://<$mirror>/simple/ trusted-host = <$mirror>
编辑内容中<$mirror>部分可以选择公网PyPI源或教育网PyPI源进行替换。
- 公网PyPI源:https://pypi.python.org/
- 执行以下命令,安装本地下载的Cloud-Init源码包,安装过程中根据需要选择--upgrade参数。
pip install [--upgrade] /home/cloud-init-0.7.9.tar.gz
安装Cloud-Init源码包的更多信息,请参见cloud-init官方文档。
- 执行命令cloud-init -v,如回显如下类似信息表示安装Cloud-Init成功。
cloud-init 0.7.9
- 设置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
- 若操作系统是sysvinit自启动管理服务,则执行以下命令进行设置。
采用官方提供的Cloud-Init源码包通过pip方式进行安装时要注意以下两点。
- Cloud-Init安装时需要添加syslog用户到adm组。存在syslog用户时直接添加syslog用户到adm组。不存在syslog用户时(如CentOS和SUSE),执行下列命令创建syslog用户,添加到adm组:
groupadd adm
usermod -g adm syslog
- 在“/etc/cloud/cloud.cfg”中system_info部分的distro要根据具体操作系统发行版本做相应修改(如根据具体操作系统发行版相应修改为:distro: ubuntu,distro: sles,distro: debian,distro: fedora)。
采用官方源码编译安装方法
官方源码编译安装方法的Cloud-Init工具Github开源地址:https://github.com/canonical/cloud-init/
- 执行以下命令,下载Cloud-Init压缩包,并将其复制至新建的“/tmp/CLOUD-INIT”文件夹。
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
- 执行如下命令,解压Cloud-Init压缩包。
- 执行如下命令进入cloud-init-0.7.6文件夹。
- 若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
确认执行结果如下图,表示语句添加成功。
- 按照操作系统类型,执行相应的命令安装Cloud-Init安装包。
- CentOS6.x/SUSE11.x:
python setup.py install --init-system sysvinit
- CentOS7.x/SUSE12.x:
python setup.py install --init-system systemd
Cloud-Init安装时需要添加syslog用户到adm组。存在syslog用户时直接添加syslog用户到adm组。不存在syslog用户时(如CentOS和SUSE),执行下列命令创建syslog用户,添加到adm组:
useradd syslog
groupadd adm
usermod -g adm syslog
- CentOS6.x/SUSE11.x:
- 设置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
- 若操作系统是sysvinit自启动管理服务,则执行以下命令进行设置。
- 执行如下命令检查Cloud-Init是否安装成功。
cloud-init init --local
回显如下类似信息所示表示安装Cloud-Init成功。
cloud-init 0.7.6