Instale o Packer em uma instância ECS, defina um modelo HCL ou JSON e crie uma imagem personalizada para implantação em lote.
Pré-requisitos
Obtenha um par de AccessKey (AccessKey ID e AccessKey secret). Consulte Obter um par de AccessKey.
Os AccessKeys concedem permissões amplas. Por motivos de segurança, recomendamos criar um usuário RAM e utilizar o par de AccessKey desse usuário. Para mais informações, consulte Criar um usuário RAM.
O AccessKey secret de um usuário RAM é exibido apenas no momento da criação e não pode ser recuperado posteriormente. Armazene-o com segurança.
Contexto
O Packer utiliza Builders, Provisioners e Post-Processors para transformar modelos HCL ou JSON em imagens personalizadas, substituindo a criação manual de imagens pela configuração como código. Consulte a documentação do Packer para obter detalhes.
Procedimento
Etapa 1: Instalar o Packer
-
Conecte-se a uma instância Linux.
-
Acesse
/usr/local/bin:cd /usr/local/binNotaO diretório
/usr/local/binestá noPATHdo sistema. Também é possível instalar o Packer em qualquer outro diretório que já esteja noPATH. -
Baixe o pacote de instalação do Packer.
Também é possível visitar a página Install Packer para baixar o pacote correspondente ao seu sistema operacional e arquitetura. Este exemplo utiliza packer_1.8.5_linux_amd64.zip.
wget https://releases.hashicorp.com/packer/1.8.5/packer_1.8.5_linux_amd64.zip -
Descompacte o pacote:
unzip packer_1.8.5_linux_amd64.zip -
Verifique a instalação.
packer -vSe um número de versão for retornado, o Packer está instalado.
Caso receba a mensagem
command not found, a instalação do Packer não foi concluída corretamente. Certifique-se de que o diretório do Packer esteja noPATHdo sistema.
Etapa 2: Definir um modelo do Packer
Crie um modelo HCL ou JSON que especifique os Builders e Provisioners. Este exemplo utiliza o provisioner Shell.
-
Exporte seu AccessKey ID.
export ALICLOUD_ACCESS_KEY=<AccessKey ID>Substitua
<AccessKey ID>pelo seu AccessKey ID real. Consulte Visualizar as informações sobre pares de AccessKey de um usuário RAM. -
Exporte seu AccessKey secret.
export ALICLOUD_SECRET_KEY=<AccessKey Secret>Substitua
<AccessKey Secret>pelo seu AccessKey secret real. O AccessKey secret é exibido apenas no momento da criação e não pode ser recuperado posteriormente. Consulte Obter um par de AccessKey. -
Crie um arquivo chamado
alicloud.NotaÉ possível usar qualquer um dos formatos para criar o arquivo
alicloud. Se optar por criar um arquivo HCL, utilize os exemplos e comandos HCL nas etapas subsequentes.Arquivo HCL
vi alicloud.pkr.hclArquivo JSON
vi alicloud.json -
Pressione
Ipara entrar no modo de inserção. Copie um dos modelos abaixo para o arquivoalicloude modifique os parâmetros conforme necessário.Arquivo HCL
variable "access_key" { type = string default = "${env("ALICLOUD_ACCESS_KEY")}" } variable "secret_key" { type = string default = "${env("ALICLOUD_SECRET_KEY")}" } source "alicloud-ecs" "autogenerated_1" { associate_public_ip_address = true image_name = "packer_basic" instance_type = "ecs.g6.large" internet_charge_type = "PayByTraffic" io_optimized = true region = "cn-qingdao" skip_image_validation = true source_image = "aliyun_3_x64_20G_alibase_20220907.vhd" ssh_username = "root" } build { sources = ["source.alicloud-ecs.autogenerated_1"] provisioner "shell" { inline = ["sleep 30", "yum install redis.x86_64 -y"] } }Arquivo JSON
{ "variables": { "access_key": "{{env `ALICLOUD_ACCESS_KEY`}}", "secret_key": "{{env `ALICLOUD_SECRET_KEY`}}" }, "builders": [{ "type":"alicloud-ecs", "region":"cn-qingdao", "image_name":"packer_basic", "source_image":"aliyun_3_x64_20G_alibase_20220907.vhd", "associate_public_ip_address":true, "ssh_username":"root", "instance_type":"ecs.g6.large", "internet_charge_type":"PayByTraffic", "io_optimized":true, "skip_image_validation":true }], "provisioners": [{ "type": "shell", "inline": [ "sleep 30", "yum install redis.x86_64 -y" ] }] }A tabela a seguir descreve os parâmetros suportados. Consulte a documentação do Packer para obter a referência completa de parâmetros.
Parâmetro
Tipo
Obrigatório
Descrição
regionstring
Sim
Região da instância ECS temporária usada para criar a imagem personalizada. Exemplo:
cn-qingdao.image_namestring
Sim
Nome da imagem personalizada. Exemplo:
packer_basic.instance_typestring
Sim
Tipo da instância ECS temporária. Exemplo:
ecs.g6.large. A instância temporária é liberada automaticamente após a criação da imagem.NotaO Packer chama a operação CreateInstance para criar uma instância ECS temporária no modelo pagamento conforme o uso, com o sistema operacional e software necessários. Essa instância gera custos.
ssh_usernamestring
Sim
Nome de usuário SSH para conexão à instância ECS temporária.
internet_charge_typestring
Não
Método de faturamento de rede da instância ECS temporária. Valores válidos:
-
PayByBandwidth: pagamento por largura de banda.
-
PayByTraffic: pagamento por tráfego.
source_imagestring
É necessário especificar um destes parâmetros.
ID da imagem base para a instância ECS temporária. Obtenha o ID na lista de imagens públicas do console ECS ou chamando a operação DescribeImages.
ImportanteO tipo de imagem selecionado deve ser compatível com o tipo de instância especificado. Por exemplo, uma imagem Arm (cujo ID contém
_arm64_) deve ser usada com um tipo de instância baseada em Arm. Caso contrário, a compilação falhará.image_familystring
Nome da família de imagens. O Packer utiliza a imagem disponível mais recente dessa família para criar a instância.
NotaO nome deve ter entre 2 e 128 caracteres. Não pode começar com dígito, caractere especial, http:// ou https://. Pode conter letras, dígitos, pontos (.), sublinhados (_), hifens (-) e dois-pontos (:).
target_image_familystring
Não
Família da imagem personalizada a ser criada.
NotaO nome deve ter entre 2 e 128 caracteres. Não pode começar com dígito, caractere especial, http:// ou https://. Pode conter letras, dígitos, pontos (.), sublinhados (_), hifens (-) e dois-pontos (:).
ssh_private_ipboolean
É necessário especificar um destes parâmetros.
Define se deve ser usada uma conexão SSH privada. Valor padrão: false. Valores válidos:
-
false: Um endereço IP público é atribuído para conexão via internet.
-
true: Nenhum EIP ou endereço IP público é atribuído. A conexão à instância ocorre pelo endereço IP privado.
NotaPara conexões privadas, o host do Packer e a instância criada devem estar no mesmo vSwitch.
associate_public_ip_addressboolean
Define se um endereço IP público será atribuído à instância ECS temporária.
eip_idstring
ID do EIP associado à instância ECS temporária.
skip_image_validationboolean
Não
Define se a validação da imagem deve ser ignorada. Valor padrão: false.
system_disk_mappingobject
Não
Configuração do disco do sistema. Exemplo:
"system_disk_mapping": { "disk_name": "sysdisk", "disk_category": "cloud_essd", "disk_size": 40 }Consulte a seção Configurações de disco em nuvem.
image_disk_mappingslist
Não
Configuração do disco de dados na imagem personalizada. Exemplo:
"image_disk_mappings": { "disk_name": "datadisk", "disk_snapshot_id": "s-bp1xxxxxx", "disk_device": "dev/xvdb" }Consulte a seção Configurações de disco em nuvem.
image_ignore_data_disksboolean
Não
Define se a imagem criada inclui snapshots de discos de dados. Valor padrão: false. Valores válidos:
-
false: A imagem criada inclui discos de dados.
-
true: A imagem criada inclui apenas o disco do sistema.
profilestring
Não
Arquivo de configuração do Packer. Se especificado, as configurações serão carregadas preferencialmente deste arquivo.
ram_role_namestring
Não
Nome da função RAM. Usado para obter um AccessKey temporário para a função RAM local executar o modelo do Packer.
NotaAplica-se apenas quando o Packer é executado em uma instância ECS com uma função RAM anexada.
ram_role_arnstring
Não
Alibaba Cloud Resource Name (ARN) da função RAM. Usado com
ram_session_namepara permitir que a Conta A assuma a função da Conta B na criação da imagem.ram_session_namestring
Não
Nome da sessão da função RAM. Usado com
ram_role_arnpara criação de imagens entre contas.ecs_ram_role_namestring
Não
Função RAM da instância anexada à instância ECS temporária. Chame a operação ListRoles para consultar as funções disponíveis.
ssh_keypair_namestring
Não
Nome do par de chaves SSH para conexão à instância ECS temporária.
ssh_private_key_filestring
Não
Caminho do arquivo de chave privada do par de chaves SSH para conexão à instância ECS temporária.
custom_endpoint_ecsstring
Não
Endpoint personalizado do ECS.
security_group_idstring
Não
ID do grupo de segurança da instância ECS temporária.
security_group_namestring
Não
Nome do grupo de segurança. Se nenhum ID de grupo de segurança for especificado, o Packer criará um com este nome.
vpc_idstring
Não
ID da VPC da instância ECS temporária.
vpc_namestring
Não
Nome da VPC. Se
vpc_idnão for especificado, o Packer criará uma VPC com este nome.vswitch_idstring
Não
ID do vSwitch da instância ECS temporária.
vswitch_namestring
Não
Nome do vSwitch. Se
vswitch_idnão for especificado, o Packer criará um vSwitch com este nome.user_datastring
Não
Dados de usuário da instância. Devem estar codificados em Base64, com dados brutos não excedendo 32 KB. Consulte Personalizar configurações de inicialização para uma instância para limites, formato e frequência de execução.
NotaCriptografe dados sensíveis (senhas, chaves privadas) antes da codificação Base64 e descriptografe-os dentro da instância.
user_data_filestring
Não
Caminho do arquivo de dados de usuário da instância ECS temporária.
boot_modestring
Não
Modo de inicialização da imagem personalizada. Valores válidos: BIOS, UEFI e UEFI-Preferred.
wait_snapshot_ready_timeoutInteger
Não
Tempo limite do snapshot. Valor padrão: 3600. Unidade: segundos.
instance_namestring
Não
Nome da instância ECS temporária. O padrão é o
InstanceId.NotaO nome deve ter entre 2 e 128 caracteres e pode conter letras, dígitos, dois-pontos (:), sublinhados (_), pontos (.) e hifens (-).
image_force_deleteboolean
Não
Define se uma imagem existente com o mesmo nome deve ser excluída antes da criação da nova. Valor padrão: false. Valores válidos:
-
true: Exclui a imagem existente com o mesmo nome e cria a nova imagem.
-
false: Não exclui a imagem existente com o mesmo nome. A criação da imagem falha.
image_force_delete_snapshotsboolean
Não
Define se os snapshots de uma imagem existente com o mesmo nome devem ser excluídos. Valor padrão: false. Valores válidos:
-
true: Exclui a imagem existente com o mesmo nome e seus snapshots, depois cria a nova imagem.
-
false: Não exclui a imagem existente com o mesmo nome nem seus snapshots. A criação da imagem falha.
image_versionstring
Não
Versão da imagem personalizada.
resource_group_idstring
Não
ID do grupo de recursos da imagem personalizada.
force_stop_instanceboolean
Não
Define se a instância ECS temporária deve ser parada forçadamente. Valor padrão: false.
disable_stop_instanceboolean
Não
Define se a parada da instância após a execução do provisioner deve ser ignorada. Defina como true quando a instância precisar permanecer em execução, como ao executar o Sysprep no Windows. Valor padrão: false.
run_tagsobject
Não
Tags da imagem personalizada. Exemplo:
{"key":"value"}.image_descriptionstring
Não
Descrição da imagem personalizada.
image_share_account[]string
Não
Contas com as quais a imagem personalizada será compartilhada. Exemplo:
["123456"].image_copy_regions[]string
Não
Regiões para onde a imagem personalizada será copiada. Exemplo:
["cn-beijing"].provisionersstring
Não
Tipo de provisioner. Valores válidos:
-
File
-
PowerShell
-
Shell
-
Local Shell
-
Windows Shell
Consulte Provisioners.
Configurações de disco em nuvem
Parâmetro
Tipo
Obrigatório
Descrição
disk_namestring
Não
Nome do disco em nuvem.
NotaO nome deve ter entre 2 e 128 caracteres e pode conter letras, dígitos, dois-pontos (:), sublinhados (_), pontos (.) e hifens (-).
disk_categorystring
Não
Categoria do disco em nuvem. Valores válidos:
-
cloud_efficiency: ultra disk
-
cloud_ssd: standard SSD
-
cloud_essd: Enterprise SSD (ESSD)
-
cloud: basic disk
disk_sizeint
Não
Tamanho do disco em nuvem. Unidade: GiB. Deve ser no mínimo 20 e não inferior ao tamanho da imagem. Valor padrão: 40 ou o tamanho da imagem, o que for maior.
disk_descriptionstring
Não
Descrição do disco em nuvem. Vazia por padrão.
NotaA descrição deve ter entre 2 e 256 caracteres e não pode começar com
http://ouhttps://.disk_snapshot_idstring
Não
ID do snapshot a ser usado para criar o disco de dados.
disk_delete_with_instanceboolean
Não
Define se o disco de dados deve ser liberado quando a instância for liberada. Valores válidos:
-
true
-
false
Valor padrão: true.
disk_devicestring
Não
Ponto de montagem do disco de dados.
disk_encryptedboolean
Não
Define se o disco de dados deve ser criptografado. Valores válidos:
-
true
-
false
Valor padrão: false.
-
Pressione
Esc, digite:wqe pressioneEnterpara salvar e sair.
Etapa 3: Usar o Packer para criar uma imagem personalizada
Compile uma imagem personalizada a partir do modelo do Packer.
-
Crie a imagem personalizada.
Arquivo HCL
packer build alicloud.pkr.hclA saída a seguir mostra que a imagem
m-m5e3f0gu2dxs4z0s****foi criada na região China (Qingdao).alicloud-ecs.autogenerated_1: output will be in this color. ==> alicloud-ecs.autogenerated_1: Prevalidating source region and copied regions... ==> alicloud-ecs.autogenerated_1: Prevalidating image name... alicloud-ecs.autogenerated_1: Found image ID: aliyun_3_x64_20G_alibase_20220907.vhd ==> alicloud-ecs.autogenerated_1: Creating temporary keypair: packer_64bf3d40-2fe7-8251-276d-df59a0bb**** --------------------------- ==> alicloud-ecs.autogenerated_1: Provisioning with shell script: /tmp/packer-shell3356722207 alicloud-ecs.autogenerated_1: Last metadata expiration check: 0:00:11 ago on Tue 25 Jul 2023 11:12:18 AM CST. --------------------------- alicloud-ecs.autogenerated_1: Complete! ==> alicloud-ecs.autogenerated_1: Stopping instance: i-m5e87pt498pr8zv0**** ==> alicloud-ecs.autogenerated_1: Waiting instance stopped: i-m5e87pt498pr8zv0**** ==> alicloud-ecs.autogenerated_1: Creating image: packer_basic alicloud-ecs.autogenerated_1: Detach keypair packer_64bf3d40-2fe7-8251-276d-df59a0bb**** from instance: i-m5e87pt498pr8zv0**** ==> alicloud-ecs.autogenerated_1: Cleaning up 'EIP' ==> alicloud-ecs.autogenerated_1: Cleaning up 'instance' ==> alicloud-ecs.autogenerated_1: Cleaning up 'security group' ==> alicloud-ecs.autogenerated_1: Cleaning up 'vSwitch' ==> alicloud-ecs.autogenerated_1: Cleaning up 'VPC' ==> alicloud-ecs.autogenerated_1: Deleting temporary keypair... Build 'alicloud-ecs.autogenerated_1' finished after 4 minutes 32 seconds. ==> Wait completed after 4 minutes 32 seconds ==> Builds finished. The artifacts of successful builds are: --> alicloud-ecs.autogenerated_1: Alicloud images were created: cn-qingdao: m-m5e3f0gu2dxs4z0s****Arquivo JSON
packer build alicloud.jsonA saída a seguir mostra que a imagem
m-m5e3f0gu2dxs4z0s****foi criada na região China (Qingdao).alicloud-ecs output will be in this color. ==> alicloud-ecs: Prevalidating image name... alicloud-ecs: Found image ID: aliyun_3_x64_20G_alibase_20220907.vhd ==> alicloud-ecs: Creating temporary keypair: packer_6345090e-ec1f-8ea0-348c-f85ba047**** ==> alicloud-ecs: Creating vpc --------------------------- ==> alicloud-ecs: Provisioning with shell script: /tmp/packer-shell090019677 alicloud-ecs: Last metadata expiration check: 0:00:15 ago on Tue 11 Oct 2022 02:12:51 PM CST. --------------------------- alicloud-ecs: Complete! ==> alicloud-ecs: Deleting image snapshots. ==> alicloud-ecs: Creating image: packer_basic alicloud-ecs: Detach keypair packer_6345090e-ec1f-8ea0-348c-f85ba047**** from instance: i-m5e7it5p4dpwetfr**** ==> alicloud-ecs: Cleaning up 'EIP' ==> alicloud-ecs: Cleaning up 'instance' ==> alicloud-ecs: Cleaning up 'security group' ==> alicloud-ecs: Cleaning up 'vSwitch' ==> alicloud-ecs: Cleaning up 'VPC' ==> alicloud-ecs: Deleting temporary keypair... Build 'alicloud-ecs' finished. ==> Builds finished. The artifacts of successful builds are: --> alicloud-ecs: Alicloud images were created: cn-qingdao: m-m5e3f0gu2dxs4z0s**** -
Verifique a imagem personalizada.
Faça login no console ECS.
No painel de navegação à esquerda, selecione .
Na barra de navegação superior, selecione a região especificada no seu modelo, como China (Qingdao).
Na aba Custom Images, localize a imagem chamada packer_basic.