阿里云镜像构建器

原文


类型:alicloud-ecs Artifact BuilderId:alibaba.alicloud

Packer 的 alicloud-ecs 构建器插件提供了基于现有基础镜像构建自定义镜像的能力。

配置参数

以下配置选项可用于构建阿里云镜像。除了此处列出的选项之外,还可以为此构建器配置通信器

必须

  • access_key (string) - 除非设置了 profile,否则必须设置阿里云访问密钥,但也可以通过 ALICLOUD_ACCESS_KEY 环境变量来配置。
  • secret_key (string) - 除非设置了 profile,否则必须设置阿里云机密密钥,但也可以通过 ALICLOUD_SECRET_KEY 环境变量来配置。
  • region (string) - 除非设置了 profile,否则必须设置阿里云区域,但也可以通过 ALICLOUD_REGION 环境变量来配置。
  • ram_role_name (string) - 除非设置了 profile,否则必须为 EcsRamRole 模式设置阿里云 RamRole。
  • ram_role_arn (string) - 除非设置了 profile,否则必须为 RamRoleArn 模式设置阿里云 RamRoleArn。
  • ram_session_name (string) - 除非设置了 profile,否则必须为 RamRoleArn 模式设置阿里云 RamSessionName。
  • instance_type (string) - 实例的类型。有关可选值,请参阅实例类型表。您也可以调用查询实例类型表接口获取最新的实例类型表。
  • source_image (string) - 这是您要创建自定义镜像的基础镜像 ID。
  • image_family (string) - 镜像系列的名称。客户可以设置该参数,从指定的镜像家族中选择最新可用的自定义镜像来创建实例。
  • image_name (string) - 用户自定义图片的名称,[2, 128]个英文或中文字符。必须以大小写字母或汉字开头,可以包含数字、_-。名称不能以 http://https:// 开头。

可选

  • skip_region_validation (bool) - 如果设置为 true,则可以跳过区域验证,默认值为 false
  • skip_image_validation (bool) - 如果设置为 true,则可以跳过镜像验证,默认值为 false
  • profile (string) - 除非设置了 access_key,否则必须设置阿里云配置文件;也可以通过 ALICLOUD_PROFILE 环境变量来设置。
  • shared_credentials_file (string) - 阿里云共享凭证文件路径。如果该文件存在,将从该文件中读取访问密钥和机密密钥。
  • security_token (string) - STS 访问令牌,可以通过模板设置或配置环境变量来配置,例如 export SECURITY_TOKEN=value
  • custom_endpoint_ecs (string) - 如果您使用的 API 与 aliyun ECS 公有云版本兼容,则此选项可以用来指定自定义 API 端点。
  • system_disk_mapping (AlicloudDiskDevice) - 系统盘的配置。有关选项的更多信息,请参阅磁盘设备配置部分。使用示例:
"builders": [{
  "type":"alicloud-ecs",
  "system_disk_mapping": {
    "disk_size": 50,
    "disk_name": "mydisk"
  },
  ...
}
  • image_disk_mappings ([]AlicloudDiskDevice) - 添加一个或多个数据磁盘到镜像中。有关选项的更多信息,请参阅磁盘设备配置部分。使用示例:
 "builders": [{
   "type":"alicloud-ecs",
   "image_disk_mappings": [
     {
       "disk_snapshot_id": "someid",
       "disk_device": "dev/xvdb"
     }
   ],
   ...
 }
  • associate_public_ip_address (bool) - 是否关联公网 IP 地址
  • zone_id(string)- 磁盘所属区域的 ID。
  • io_optimized (boolean) - ECS 实例是否开启 I/O 优化。如果未设置此选项,则该值将由产品 API 根据使用的 instance_type 确定。
  • description(string)- 描述
  • force_stop_instance (bool) - 是否在设备重启时使用强制关机。默认值为 false。 如果设置为 false,系统正常关闭;如果设置为 true,系统将在重启时被强制关闭。
  • disable_stop_instance (bool) - 如果此选项设置为 true,Packer 将不会为您停止实例,您需要确保实例将被最后的配置命令停止。否则,Packer 将在等待实例停止时超时。该选项是为一些您希望自行停止实例的特定场景提供的。例如,Sysprep 可能会在一个窗口期中中关闭实例。默认值为 false
  • ram_role_name (string) - 启动实例时应用的 Ram 角色。
  • run_tags (map[string]string) - 为创建镜像而启动的实例上设置的标签。
  • security_group_id (string) - 新创建的实例所属的安全组的 ID。同一个安全组内的实例之间允许互访。如果不指定,新创建的实例将被添加到默认的安全组中。如果默认组不存在,或者其中的实例数量达到最大限制,将自动创建一个新的安全组。
  • security_group_name(string)- 安全组名称。默认值为空白。 [2, 128] 英文或汉字,必须以大小写字母或汉字开头。可以包含数字、._-。名称不能以 http://https:// 开头。
  • security_enhancement_strategy(string)- 指定是否启用安全强化。有效值: Active:启用安全强化。此值仅适用于公共镜像。 Deactive:不启用安全加固。此值适用于所有镜像类型。
  • user_data (string) - 启动实例时要应用的 User Data。请注意,由于模板是 JSON,因此您需要注意转义字符。相反,使用 user_data_file 通常更方便。 Packer 不会在关闭实例之前自动等待用户脚本完成,这必须在配置器中处理。
  • user_data_file (string) - 启动实例时将用于存储 User Data 数据的文件路径。
  • vpc_id (string) - 系统分配的 VPC ID。
  • vpc_name(string)- VPC 名称。默认值为空白。 [2, 128] 英文或汉字,必须以大小写字母或汉字开头。可以包含数字、_-。名称将出现在控制台上。不能以 http://https:// 开头。
  • vpc_cidr_block(string)- 可选项:192.168.0.0/16172.16.0.0/16。未指定时,默认值为 172.16.0.0/16
  • vswitch_id (string) - 要使用的 VSwitch 的 ID。
  • vswitch_name (string) - 要使用的 VSwitch 的名称。
  • instance_name (string) - 实例显示名称,为 [2, 128] 个中英文字符的字符串。它必须以大写/小写字母或汉字开头,可以包含数字、._-。实例名称显示在阿里云控制台上。如果不指定该参数,则默认为实例的InstanceId。它不能以 http://https:// 开头。
  • internet_charge_type (string) - 公网收费类型,可以是 PayByTrafficPayByBandwidth。如果不指定该参数,默认值为 PayByBandwidth。对于中国以外的地区,目前只支持 PayByTraffic,需要手动设置。
  • internet_max_bandwidth_out (int) - 公网的最大传出带宽,以 Mbps(每秒兆位)为单位。取值范围:
    • PayByBandwidth:[0, 100]。如果未指定此参数,API 会自动将其设置为 0 Mbps。
    • PayByTraffic:[1, 100]。如果未指定此参数,则返回错误。
  • wait_snapshot_ready_timeout (int) - 创建快照超时。如果此选项未设置或设置为 0,则默认超时为 3600 秒。对于那些包含大量数据的磁盘,可能需要更高的超时值。
  • wait_copying_image_ready_timeout (int) - 复制镜像超时。如果此选项未设置或设置为 0,则默认超时为 3600 秒。
  • ssh_private_ip (bool) - 如果该值为 true,Packer 将通过私有 ip 连接到创建的 ECS,而不是分配公有 ip 或 EIP。默认值为 false
  • skip_create_image (bool) - 如果为 true,Packer 将不会创建镜像。默认为 false
  • image_version (string) - 镜像的版本号,长度限制为 1 到 40 个英文字符。
  • image_description (string) - 镜像的描述,长度限制为 0 到 256 个字符。将其留空表示为默认值 null。它不能以 http://https:// 开头。
  • resource_group_id(string)- 要将自定义镜像分配到的资源组的 ID。如果不指定此参数,则将镜像分配给默认资源组。
  • image_share_account ([]string) - 待创建的镜像将要共享的阿里云账号ID。账户数为 1 到 10。如果账户数大于 10,则忽略该参数。
  • image_unshare_account([]string) - (译者表示懵逼,盲猜是不共享的账号)
  • image_copy_regions ([]string) - 复制到目标 region 的 Id 列表。
  • image_copy_names ([]string) - 目标镜像的名称,[2, 128]个英文或中文字符。必须以大小写字母或汉字开头,可以包含数字、_-。它不能以 http://https:// 开头。
  • image_encrypted (boolean) - 是否加密目标镜像,包括那些通过设置 image_copy_regions 时复制的镜像。如果此选项设置为 true,则将从主要区域中的配置实例创建临时镜像,并在同一区域中生成加密副本。默认情况下,Packer 会继承源镜像中的加密设置。
  • image_force_delete (bool) - 如果设置为 true,当目标镜像名称(包括复制的镜像)与现有镜像重复时,它将删除现有镜像,然后创建目标镜像,否则,创建将失败。默认值为 false。检查目标镜像名称使用的是 image_nameimage_copy_names 选项。如果在构建命令中提供了 -force 选项,则该选项可以省略并取为 true
  • image_force_delete_snapshots (bool) - 如果设置为 true,当删除重复的现有镜像时,这些镜像的源快照也将被删除。如果在构建命令中提供了 -force 选项,则该选项可以省略并取为 true
  • image_force_delete_instances (bool) - 阿里云镜像强制删除实例
  • image_ignore_data_disks (bool) - 如果设置为 true,则创建的镜像将不包含任何数据磁盘快照。此选项适用于那些不关心加载到实例上的默认数据磁盘的情况。默认值为 false
  • skip_region_validation (bool) - 如果设置为 true,则可以跳过区域验证,默认值为 false
  • tags (map[string]string) - 应用于目标镜像和相关快照的标签。
  • tag ([]{key string, value string}) - 与 tags 相同,但定义为包含键和值字段的单个可重复块。在 HCL2 模式下,dynamic 将允许您以编程方式创建这些内容。
  • temporary_key_pair_type(string)- dsa | ECDS | ed25519 | rsa(默认)指定要创建的密钥类型。
  • temporary_key_pair_bits (int) - 指定要创建的密钥的位数。对于 RSA 密钥,最小为 1024 位,默认为 4096 位。通常,3072 位被认为是足够的。 DSA 密钥必须恰好是 FIPS 186-2 指定的 1024 位。对于 ECDSA 密钥,通过从三种椭圆曲线大小中选择一种来确定密钥长度:256、384 或 521 位。尝试使用这三个值以外的 ECDSA 密钥长度将触发失败。 Ed25519 密钥具有固定长度,位将被忽略。
  • ssh_keypair_name(string)- 如果设置,将是用于机器 SSH 的密钥。该密钥必须与加载到远程服务器中的密钥对名称相匹配。默认情况下不设置,除非使用 ssh_password,否则 Packer 将生成一个临时密钥对。使用 ssh_keypair_name 时必须指定 ssh_private_key_filessh_agent_auth
  • ssh_private_key_file(string)- 用于通过 SSH 进行身份验证的 PEM 编码私钥文件的路径。 可以在路径中使用 ~,将展开为当前用户的 HOME 目录。
  • ssh_agent_auth (bool) - 如果为 true,本地 SSH Agent 将用于验证与源实例的连接。不会创建临时密钥对,ssh_passwordssh_private_key_file 的值将被忽略。必须设置环境变量 SSH_AUTH_SOCK 才能使此选项正常工作。

阿里云 RAM 权限

最后插件需要获得一组阿里云RAM权限才能调用阿里云API。

以下策略文档提供了阿里云插件运行所需的最小设置权限:

{
  "Version": "1",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "ecs:AttachKeyPair",
        "ecs:CreateKeyPair",
        "ecs:DeleteKeyPairs",
        "ecs:DetachKeyPair",
        "ecs:DescribeKeyPairs",
        "ecs:DescribeDisks",
        "ecs:ImportKeyPair",
        "ecs:CreateSecurityGroup",
        "ecs:AuthorizeSecurityGroup",
        "ecs:AuthorizeSecurityGroupEgress",
        "ecs:DescribeSecurityGroups",
        "ecs:DeleteSecurityGroup",
        "ecs:CopyImage",
        "ecs:CancelCopyImage",
        "ecs:CreateImage",
        "ecs:DescribeImages",
        "ecs:DescribeImageFromFamily",
        "ecs:DeleteImage",
        "ecs:ModifyImageAttribute",
        "ecs:DescribeImageSharePermission",
        "ecs:ModifyImageSharePermission",
        "ecs:DescribeInstances",
        "ecs:StartInstance",
        "ecs:StopInstance",
        "ecs:CreateInstance",
        "ecs:DeleteInstance",
        "ecs:RunInstances",
        "ecs:RebootInstance",
        "ecs:RenewInstance",
        "ecs:CreateSnapshot",
        "ecs:DeleteSnapshot",
        "ecs:DescribeSnapshots",
        "ecs:TagResources",
        "ecs:UntagResources",
        "ecs:AllocatePublicIpAddress",
        "ecs:AddTags",
        "vpc:DescribeVpcs",
        "vpc:CreateVpc",
        "vpc:DeleteVpc",
        "vpc:DescribeVSwitches",
        "vpc:CreateVSwitch",
        "vpc:DeleteVSwitch",
        "vpc:AllocateEipAddress",
        "vpc:AssociateEipAddress",
        "vpc:UnassociateEipAddress",
        "vpc:ReleaseEipAddress",
        "vpc:DescribeEipAddresses"
      ],
      "Resource": [
        "*"
      ]
    }
  ]
}

磁盘设备配置

  • disk_name (string) - 磁盘名称的值默认为空白。 [2, 128] 英文或汉字,必须以大小写字母或汉字开头。可以包含数字、._-。磁盘名称将出现在控制台上。它不能以 http://https:// 开头。
  • disk_category (string) - 系统磁盘的类别。可选值是:
-   cloud - general cloud disk
-   cloud_efficiency - efficiency cloud disk
-   cloud_ssd - cloud SSD
-   cloud_essd - cloud ESSD
  • disk_size (int) - 系统磁盘的大小,以 GiB 为单位。取值范围:[20, 500]。指定的值必须等于或大于 max{20, ImageSize}。默认值:最大值{40, ImageSize}。
  • disk_snapshot_id (string) - 用于创建数据盘的快照 ID。指定此参数后,disk_size 将被忽略。创建的磁盘实际大小为指定快照的大小。该字段仅用于 ECSImagesDiskMappings 选项,不用于 ECSSystemDiskMapping 选项。
  • disk_description (string) - 磁盘的描述,默认为空白。 [2, 256] 个字符。磁盘描述将出现在控制台上。它不能以 http://https:// 开头。
  • disk_delete_with_instance (bool) - 磁盘是否随实例一起释放:
  • disk_device (string) - 相关实例的设备信息:例如 /dev/xvdb。除非状态为 In_use,否则为 null
  • disk_encrypted (boolean) - 是否加密数据盘。如果该选项设置为 true,数据盘将被加密,目标镜像中对应的快照也会被加密。默认情况下,如果这是一个额外的数据盘,Packer 不会加密数据盘。否则,Packer 会将继承源映像中的加密设置。详情请参考 ECS 磁盘加密介绍。

基础用法

variable "access_key" {
  type = string
}

variable "secret_key" {
  type = string
}

source "alicloud-ecs" "basic-example" {
      access_key = var.access_key
      secret_key = var.secret_key
      region = "cn-beijing"
      image_name = "packer_test2"
      source_image = "centos_7_04_64_20G_alibase_201701015.vhd"
      ssh_username = "root"
      instance_type = "ecs.n1.tiny"
      io_optimized = true
      internet_charge_type = "PayByTraffic"
      image_force_delete = true
      run_tags  = {
        "Built by"   = "Packer"
        "Managed by" = "Packer"
      }
}

build {
  sources = ["sources.alicloud-ecs.basic-example"]

  provisioner "shell" {
    inline = [
      "sleep 30", "yum install redis.x86_64 -y",
    ]
  }
}

请注意:镜像可能会在一段时间后被弃用;运行 aliyun ecs DescribeImages 查找一个存在的镜像。

请注意:由于 WinRM 在系统映像中默认关闭。如果您计划使用 Windows 作为基础镜像,则需要通过 userdata 启用它才能连接到实例,查看 alicloud_windows.jsonwinrm_enable_userdata.ps1 了解详情。

更多示例,请参见 Packer 项目中的 examples/alicloud 文件夹。

results matching ""

    No results matching ""