第 2 章 红帽对 cloud-init 的支持

本章论述了红帽对 cloud-init 的支持。它包括了使用 cloud-init、红帽支持的 cloud-init 模块以及默认目录和文件的产品的信息。

2.1. cloud-init 重要目录和文件

下表包含重要的目录和文件。查看这些目录和文件 ; 这些目录和文件允许您执行类似如下的任务:

  • 配置 cloud-init
  • cloud-init 运行后查找您的配置信息
  • 检查日志文件
  • 查找模板

根据您的场景和数据源,可能还会有其他对您配置很重要的文件和目录。

表 2.1. cloud-init 目录和文件

目录或文件描述

/etc/cloud/cloud.cfg

cloud.cfg 文件包含基本 cloud-init 配置,并可让您了解每个模块运行的阶段。

/etc/cloud/cloud.cfg.d

cloud.cfg.d 目录中可以添加附加指令 cloud-init

/var/lib/cloud

cloud-init 运行时,它会在 /var/lib/cloud 下创建一个目录布局。布局包括特定于您的实例配置的目录和文件。

/usr/share/doc/cloud-init/examples

examples 目录包含多个示例。您可以使用它们来帮助建模您自己的指令。

/etc/cloud/templates

这个目录包括您可以在特定情况下,在 cloud-init 中启用的模板。模板为启用提供了指示。

/var/log/cloud-init.log

cloud-init.log 文件提供有助于调试的日志信息。

/run/cloud-init

/run/cloud-init 目录包含关于数据源和 ds-identify 脚本的日志信息。

2.2. 使用 cloud-init 的红帽产品

您可以与以下红帽产品搭配使用 cloud-init

  • Red Hat Virtualization。在虚拟机上安装 cloud-init 后,您可以为从该模板创建的所有虚拟机创建一个模板并利用 cloud-init 功能。有关虚拟机搭配使用cloud-init的信息,请参阅使用 Cloud-Init 自动配置虚拟机
  • Red Hat OpenStack Platform。您可以使用 cloud-init 帮助为 OpenStack 配置镜像。如需更多信息,请参阅实例和镜像指南
  • Red Hat CloudForms。您可以使用它 cloud-init 来为 Red Hat CloudForms 置备虚拟机。如需更多信息,请参阅虚拟机和实例置备的自定义模板
  • Red Hat Satellite。您可以在 Red Hat Satellite 中使用 cloud-init如需更多信息,参阅 Red Hat Virtualization 中准备 Cloud-init 镜像
  • Red Hat OpenShift。为 OpenShift 创建虚拟机时可以使用 cloud-init如需更多信息,参阅 创建虚拟机

2.3. 红帽支持这些 cloud-init 模块

红帽支持大多数 cloud-init 模块。单个模块可以包含多个配置选项。下表列出了红帽目前支持的所有 cloud-init 模块,提供简要描述以及默认的模块频率。有关这些模块的完整描述和选项,参考 cloud-init 文档部分中的模块部分

表 2.2. 支持的 cloud-init 模块

cloud-init 模块描述默认模块频率

bootcmd

在引导过程早期运行命令

per always

ca_certs

添加 CA 证书

per instance

debug

启用或禁用内部信息输出来帮助调试

per instance

disable_ec2_metadata

启用或禁用 AWS EC2 元数据

per always

disk_setup

配置简单的分区表和文件系统

per instance

final_message

指定 cloud-init 完成后输出的息

per always

foo

用于显示模块结构的示例(模块什么都不做)

per instance

growpart

重新定义分区大小以占据可用磁盘空间

per always

keys_to_console

允许控制可写入控制台的指纹和密钥

per instance

landscape

安装并配置 landscape 客户端

per instance

locale

配置系统区域设置并应用系统范围

per instance

mcollective

安装、配置和启动 mcollective

per instance

migrator

把旧版本 cloud-init 移到新版本

per always

mounts

配置挂载点和交换文件

per instance

phone_home

引导完成后将数据发送到远程主机

per instance

power_state_change

在所有配置模块运行后完成关闭并重启

per instance

puppet

安装并配置 puppet

per instance

resizefs

重新定义文件系统大小为使用分区上的所有可用空间

per always

resolve_conf

配置 resolv.conf

per instance

rh_subscription

注册 Red Hat Enterprise Linux 系统

per instance

rightscale_userdata

cloud-init 添加了对 rightScale 配置 hook 的支持

per instance

rsyslog

使用 rsyslog 配置远程系统日志

per instance

runcmd

运行任意命令

per instance

salt_minion

安装、配置和启动 salt minion

per instance

scripts_per_boot

每个引导脚本运行

per always

scripts_per_instance

每个实例脚本运行

per instance

scripts_per_once

运行脚本一次

per once

scripts_user

运行用户脚本

per instance

scripts_vendor

运行厂商脚本

per instance

seed_random

提供随机 seed 数据

per instance

set_hostname

设置主机名和完全限定域名(FQDN)

per always

set_passwords

设置用户密码并启用或禁用 SSH 密码验证

per instance

ssh_authkey_fingerprints

用户 SSH 密钥的日志指纹

per instance

ssh_import_id

导入 SSH 密钥

per instance

ssh

配置 SSH,主机及授权 SSH 密钥

per instance

timezone

设置系统时区

per instance

update_etc_hosts

更新 /etc/hosts

per always

update_hostname

更新主机名和 FQDN

per always

users_groups

配置用户和组

per instance

write_files

写入任意文件

per instance

yum_add_repo

在系统中添加 yum 软件仓库配置

per always

下表列出了红帽目前不支持的模块。

表 2.3. 不支持的模块

模块

apt_configure

apt_pipeline

byobu

chef

emit_upstart

grub_dpkg

ubuntu_init_switch

2.4. 默认的 cloud.cfg 文件

/etc/cloud/cloud.cfg 文件列出了组成 cloud-init 基本配置的模块。

这个文件中的模块是 cloud-init 的默认模块。您可以为环境配置模块或删除您不需要的模块。在 cloud.cfg 中包括的模块不一定因为在文件中列出就进行任何操作。如果您希望在其中一个 cloud-init 阶段中执行操作,则需要单独配置它们。

cloud.cfg 文件提供运行独立模块的时序方法。只要红帽支持您要添加的模块,您可以把额外的模块添加到 cloud.cfg

以下是 Red Hat Enterprise Linux(RHEL)文件的默认内容。

注意
  • 模块按 cloud.cfg 中给定的顺序运行。您通常不会更改这个顺序。
  • 用户数据可覆盖 cloud.cfg 指令。
  • cloud-init 手动运行时,您可以使用 cloud.cfg 命令行选项覆盖。
  • 每个模块都有其自身的配置选项,您可以在其中添加特定信息。
users: 1
 - default

disable_root: 1 2
ssh_pwauth:   0 3

mount_default_fields: [~, ~, 'auto', 'defaults,nofail,x-systemd.requires=cloud-init.service', '0', '2'] 4
ssh_deletekeys:   1 5
ssh_genkeytypes:  ~ 6
syslog_fix_perms: ~ 7
disable_vmware_customization: false 8

cloud_init_modules: 9
 - disk_setup
 - migrator
 - bootcmd
 - write-files
 - growpart
 - resizefs
 - set_hostname
 - update_hostname
 - update_etc_hosts
 - rsyslog
 - users-groups
 - ssh

cloud_config_modules: 10
 - mounts
 - locale
 - set-passwords
 - rh_subscription
 - yum-add-repo
 - package-update-upgrade-install
 - timezone
 - puppet
 - chef
 - salt-minion
 - mcollective
 - disable-ec2-metadata
 - runcmd

cloud_final_modules: 11
 - rightscale_userdata
 - scripts-per-once
 - scripts-per-boot
 - scripts-per-instance
 - scripts-user
 - ssh-authkey-fingerprints
 - keys-to-console
 - phone-home
 - final-message
 - power-state-change

system_info:
  default_user: 12
    name: cloud-user
    lock_passwd: true
    gecos: Cloud User
    groups: [adm, systemd-journal]
    sudo: ["ALL=(ALL) NOPASSWD:ALL"]
    shell: /bin/bash
  distro: rhel 13
  paths:
    cloud_dir: /var/lib/cloud 14
    templates_dir: /etc/cloud/templates 15
  ssh_svcname: sshd 16

# vim:syntax=yaml
1
指定系统的默认用户。详情请参考 用户和组群
2
启用或禁用 root 登录。如需更多信息,请参阅认证密钥
3
指定是否可以把 ssh 配置为接受密码验证。详情请参考设定密码
4
配置挂载点 ; 必须是一个包含六个值的列表。详情请参考挂载
5
指定是否删除默认主机 SSH 密钥。详情请参考主机密钥
6
指定要生成的密钥类型。详情请参考主机密钥
7
cloud-init 在引导过程的多个阶段运行。设置这个选项以便 cloud-init 可将所有阶段记录到其日志文件中。如需更多信息,请参阅 usr/share/doc/cloud-init/examples 目录中的 cloud-config.txt 文件。
8
启用或禁用 VMware vSphere 自定义
9
本节中的模块是 cloud-init 服务启动时在引导过程早期运行的服务。
10
这些模块在 cloud-init 配置期间运行,在初始引导后运行。
11
这些模块在 cloud-init 的最终阶段允许,在配置完成后运行。
12
指定默认用户的详情。详情请参考用户和组群
13
指定发布
14
指定包含特定于 cloud-init 的子目录的主目录。详情请参考 目录布局
15
指定模板所处的位置
16
SSH 服务的名称

2.5. cloud.cfg.d 目录

您提供并配置的 cloud-init 执行的指令。通常,这些指令包含在 cloud.cfg.d 目录中。

注意

虽然您可以通过在 cloud.cfg 文件中添加用户数据指令来配置模块,但最好考虑不要修改 cloud.cfg。在 /etc/cloud/cloud.cfg.d 目录中添加您的指令。在这个目录中添加指令可方便将来的修改和升级。

可以通过多种方法添加指令。您可以在一个名称的文件中包括指令 *.cfg,其中包括标题 #cloud-config。通常,该目录会包含多个 *cfg 文件。添加指令的其它选项,例如:您可以添加用户数据脚本。详情请参考 User-Data Formats

2.6. 默认 05_logging.cfg 文件

05_logging.cfg 文件会为 cloud-init 设置日志信息。/etc/cloud/cloud.cfg.d 目录包括了这个文件,以及其他您添加的 cloud-init 指令。

cloud-init 默认使用日志配置 05_logging.cfg。以下是 Red Hat Enterprise Linux(RHEL)文件的默认内容。

## This yaml formatted config file handles setting
## logger information.  The values that are necessary to be set
## are seen at the bottom.  The top '_log' are only used to remove
## redundancy in a syslog and fallback-to-file case.
##
## The 'log_cfgs' entry defines a list of logger configs
## Each entry in the list is tried, and the first one that
## works is used.  If a log_cfg list entry is an array, it will
## be joined with '\n'.
_log:
 - &log_base |
   [loggers]
   keys=root,cloudinit

   [handlers]
   keys=consoleHandler,cloudLogHandler

   [formatters]
   keys=simpleFormatter,arg0Formatter

   [logger_root]
   level=DEBUG
   handlers=consoleHandler,cloudLogHandler

   [logger_cloudinit]
   level=DEBUG
   qualname=cloudinit
   handlers=
   propagate=1

   [handler_consoleHandler]
   class=StreamHandler
   level=WARNING
   formatter=arg0Formatter
   args=(sys.stderr,)

   [formatter_arg0Formatter]
   format=%(asctime)s - %(filename)s[%(levelname)s]: %(message)s

   [formatter_simpleFormatter]
   format=[CLOUDINIT] %(filename)s[%(levelname)s]: %(message)s
 - &log_file |
   [handler_cloudLogHandler]
   class=FileHandler
   level=DEBUG
   formatter=arg0Formatter
   args=('/var/log/cloud-init.log',)
 - &log_syslog |
   [handler_cloudLogHandler]
   class=handlers.SysLogHandler
   level=DEBUG
   formatter=simpleFormatter
   args=("/dev/log", handlers.SysLogHandler.LOG_USER)

log_cfgs:
# Array entries in this list will be joined into a string
# that defines the configuration.
#
# If you want logs to go to syslog, uncomment the following line.
# - [ *log_base, *log_syslog ]
#
# The default behavior is to just log to a file.
# This mechanism that does not depend on a system service to operate.
 - [ *log_base, *log_file ]
# A file path can also be used.
# - /etc/log.conf

# This tells cloud-init to redirect its stdout and stderr to
# 'tee -a /var/log/cloud-init-output.log' so the user can see output
# there without needing to look on the console.
output: {all: '| tee -a /var/log/cloud-init-output.log'}

其它资源

2.7. cloud-init /var/lib/cloud 目录布局

cloud-init 第一次运行时,它会创建一个目录布局,其中包含有关您的实例和 cloud-init 配置的信息。

以下是 cloud-init 的目录布局示例。

目录可以包含可选目录,如 /scripts/vendor

/var/lib/cloud/
    - data/
       - instance-id
       - previous-instance-id
       - previous-datasource
       - previous-hostname
       - result.json
       - set-hostname
       - status.json
    - handlers/
    - instance
       - boot-finished
       - cloud-config.txt
       - datasource
       - handlers/
       - obj.pkl
       - scripts/
       - sem/
       - user-data.txt
       - user-data.txt.i
       - vendor-data.txt
       - vendor-data.txt.i
    - instances/
        f111ee00-0a4a-4eea-9c17-3fa164739c55/
          - boot-finished
          - cloud-config.txt
          - datasource
          - handlers/
          - obj.pkl
          - scripts/
          - sem/
          - user-data.txt
          - user-data.txt.i
          - vendor-data.txt
          - vendor-data.txt.i
    - scripts/
       - per-boot/
       - per-instance/
       - per-once/
       - vendor/
    - seed/
    - sem/
       - config_scripts_per_once.once

其它资源