第 4 章 配置 cloud-init

本章包含 cloud-init 最常见的配置任务示例。

您的 cloud-init 配置可能需要在 cloud.cfg 文件和 cloud.cfg.d 目录中添加指令。或者,您的具体数据源可能需要您在文件中添加指令,如用户数据文件和元数据文件。数据源可能需要将您的指令上传到 HTTP 服务器。检查您的数据源要求并相应地添加指令。

4.1. 为 NoCloud 数据源创建包含 cloud-init 的虚拟机

要创建包含 cloud-init 的新虚拟机(VM),请遵循以下流程。在此流程中,您可以创建一个 meta-data 文件和一个 user-data 文件。

  • meta-data 文件包含实例详情。
  • user-data 文件包含创建用户和授予访问权限的信息。

将这些文件包含在一个新 ISO 镜像中,并将 ISO 文件附加到从 KVM 客户机镜像创建的新虚拟机上。在这种情况下,数据源是 NoCloud。

步骤

  1. 创建一个名为 cloudinitiso 的目录,并将其设置为您的工作目录:

    $ mkdir cloudinitiso
    $ cd cloudinitiso
  2. 创建 meta-data 文件并添加以下信息:

    instance-id: citest
    local-hostname: citest-1
  3. 创建 user-data 文件并添加以下信息:

    #cloud-config
    password: cilogon
    chpasswd: {expire: False}
    ssh_pwauth: True
    ssh_authorized_keys:
      - ssh-rsa AAA...fhHQ== sample@redhat.com
    注意

    user-data 文件的最后一行引用一个 SSH 公钥。在 ~/.ssh/id_rsa.pub 中查找您的 SSH 公钥。在尝试这个示例步骤时,请将该行修改为包含您的一个公钥。

  4. 使用 genisoimage 命令创建一个包含 user-datameta-data 的 ISO 镜像:

    # genisoimage -output ciiso.iso -volid cidata -joliet -rock user-data meta-data
    
    I: -input-charset not specified, using utf-8 (detected in locale settings)
    Total translation table size: 0
    Total rockridge attributes bytes: 331
    Total directory bytes: 0
    Path table size(bytes): 10
    Max brk space used 0
    183 extents written (0 MB)
  5. 从红帽客户门户下载 KVM 客户机镜像到 /var/lib/libvirt/images 目录。
  6. 使用 virt-install 工具从 KVM 客户机镜像创建一个新虚拟机,并将下载的镜像附加到现有镜像:

    # virt-install \
        --memory 4096 \
        --vcpus 4 \
        --name mytestcivm \
        --disk /var/lib/libvirt/images/rhel-8.1-x86_64-kvm.qcow2,device=disk,bus=virtio,format=qcow2 \
        --disk /home/sample/cloudinitiso/ciiso.iso,device=cdrom \
        --os-type Linux \
        --os-variant rhel9.0 \
        --virt-type kvm \
        --graphics none \
        --import
  7. 使用用户名 cloud-user 和密码 cilogon 登录到您的镜像:

    citest-1 login: cloud-user
    Password:
    [cloud-user@citest-1 ~]$

验证

  • 检查 cloud-init 状态,以确认工具是否已完成了其定义的任务:

    [cloud-user@citest-1 instance]$ cloud-init status
    status: done
  • cloud-init 工具在其运行时在 /var/lib/cloud 下创建 cloud-init 目录布局,并根据您指定的指令更新或更改某些目录内容。

    例如,您可以通过检查数据源文件来确认数据源为 NoCloud

    $ cd /var/lib/cloud/instance
    $ cat datasource
    DataSourceNoCloud: DataSourceNoCloud [seed=/dev/sr0][dsmode=net]
  • cloud-init 将 user-data 复制到 /var/lib/cloud/instance/user-data.txt 中:

    $ cat user-data.txt
    #cloud-config
    password: cilogon
    chpasswd: {expire: False}
    ssh_pwauth: True
    ssh_authorized_keys:
      - ssh-rsa AAA...fhHQ== sample@redhat.com
注意

对于 OpenStack,创建和管理实例 包含有关使用 cloud-init 配置实例的信息。有关特定流程,请参阅创建自定义实例