阿里云镜像构建器
类型: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/16
和172.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) - 公网收费类型,可以是PayByTraffic
或PayByBandwidth
。如果不指定该参数,默认值为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_name
和image_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_file
或ssh_agent_auth
。ssh_private_key_file
(string)- 用于通过 SSH 进行身份验证的 PEM 编码私钥文件的路径。 可以在路径中使用~
,将展开为当前用户的HOME
目录。ssh_agent_auth
(bool) - 如果为true
,本地 SSH Agent 将用于验证与源实例的连接。不会创建临时密钥对,ssh_password
和ssh_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.json 和 winrm_enable_userdata.ps1 了解详情。
更多示例,请参见 Packer 项目中的 examples/alicloud
文件夹。