Criação de uma imagem privada usando o Packer
Packer é uma ferramenta de código aberto para criar imagens personalizadas. O comportamento do Packer é determinado por um modelo que é uma Linguagem de configuração do HashiCorp (HCL2) ou arquivo JSON e contém principalmente três tipos de componentes: construtor, provisionador e pós-processador. Esses componentes podem ser combinados de forma flexível no modelo para criar automaticamente arquivos de imagem para várias plataformas de nuvem em paralelo. O Packer simplifica a criação de imagens privadas usando código gerenciável. Desta forma, os usuários podem personalizar imagens de forma flexível e usar facilmente imagens idênticas entre diferentes plataformas de nuvem.
Esta seção descreve como usar o Packer para criar uma imagem privada de Ubuntu 22.04 Server 64-bit em um ECS do CentOS 8.2 64-bit.
Restrições
As imagens do ECS completo não podem ser usadas como uma fonte de imagem quando você usa o Packer para criar imagens privadas.
Procedimento
Instalar o Packer
- Faça logon no console de gerenciamento, crie um ECS (por exemplo, um ECS executando o CentOS 8.2 64-bit) e vincule um EIP ao ECS.
- Faça logon no ECS.
- Visite https://www.packer.io/downloads e baixe a versão mais recente do Packer que corresponde ao sistema operacional e à arquitetura do ECS.
- Execute o seguinte comando para instalar o Packer (packer_1.9.1_linux_amd64.zip como exemplo):
wget --no-check-certificate https://releases.hashicorp.com/packer/1.9.1/packer_1.9.1_linux_amd64.zip
- Certifique-se de que você vinculou um EIP ao ECS para que o ECS possa acessar a Internet.
- Se a mensagem "command not found" for exibida, a ferramenta wget não está instalada. Execute o comando yum install wget para instalá-lo.
- Execute o seguinte comando para descompactar o pacote de instalação do Packer:
- Execute o seguinte comando para mover o pacote de instalação do Packer para o diretório /usr/local/bin:
mv packer /usr/local/bin
O diretório /usr/local/bin foi adicionado às variáveis de ambiente. Você também pode mover o pacote de instalação do Packer para outro diretório que tenha sido adicionado às variáveis de ambiente.
- Execute o seguinte comando para verificar se o Packer foi instalado com sucesso:
- Se a saída do comando contiver o número da versão do Packer, o Packer foi instalado com sucesso.
- Se "command not found" for exibido, a instalação do Packer falhou. Verifique se o diretório em que o Packer reside foi adicionado às variáveis de ambiente.
Execute o comando env | grep PATH para verificar se a variável de ambiente PATH contém o diretório de instalação do Packer.
Se PATH não contiver o diretório de instalação do Packer, execute as seguintes operações para adicioná-lo ao PATH:
- Execute o seguinte comando para abrir o arquivo profile:
vim /etc/profile
- Pressione i para entrar no modo de edição e adicione export PATH=$PATH:/usr/local/bin ao final do arquivo.
Se o seu Packer reside em um diretório diferente de /usr/local/bin, substitua /usr/local/bin no comando pelo diretório real.
- Pressione Esc para sair do modo de edição. Digite :wq e pressione Enter para salvar as alterações e sair.
- Execute o seguinte comando para que a alteração tenha efeito:
- Execute o seguinte comando para abrir o arquivo profile:
Criar um modelo do Packer
Para criar uma imagem usando o Packer, você precisa de um modelo no formato .pkr.hcl. No modelo, você precisa configurar construtores, provisionadores e pós-processadores. Em um provisionador, você pode modificar a imagem de origem conforme necessário. Por exemplo, você pode modificar as configurações e especificar o software a ser pré-instalado. Neste exemplo, um pós-processador é usado para redirecionar o caminho de saída do manifesto. Se o modelo do Packer tiver vários construtores, você poderá localizar o ID da imagem criada de cada construtor com base na saída do manifesto. Para obter mais informações sobre construtores, provisionadores e pós-processadores, consulte a documentação oficial do Packer.
Esta seção usa um provisionador Shell como exemplo.
- Execute o seguinte comando para criar um arquivo hwcloud.pkr.hcl:
touch hwcloud.pkr.hcl
- Execute o seguinte comando para abrir o arquivo hwcloud.pkr.hcl:
vim hwcloud.pkr.hcl
- Pressione i para entrar no modo de edição e editar o modelo com base nos requisitos do site. Para obter detalhes do parâmetro, consulte Tabela 1. O conteúdo a seguir é apenas para referência.
packer { required_plugins { huaweicloud = { version = ">= 1.0.0" source = "github.com/huaweicloud/huaweicloud" } } } source "huaweicloud-ecs" "artifact" { region = "xxx" availability_zone = "xxx" flavor = "c6.large.2" source_image_name = "Ubuntu 22.04 server 64bit" image_name = "Ubuntu-2204-image-powered-by-Packer" image_tags = { builder = "packer" os = "Ubuntu-22.04-server" } ssh_username = "root" eip_type = "5_bgp" eip_bandwidth_size = 5 } build { sources = ["source.huaweicloud-ecs.artifact"] provisioner "shell" { inline = ["apt-get update -y"] } post-processor "manifest" { strip_path = true output = "packer-result.json" } }
Em Tabela 1, region, availability_zone, flavor e source_image_name são os atributos do ECS temporário que serão usados para criar a imagem privada.
Tabela 1 Parâmetros do modelo de Packer Parâmetro
Descrição
Obrigatório
region
Nome da região. Obtenha o nome da região em Regiões e pontos de extremidade.
Sim
flavor
Flavor do ECS temporário.
Sim
image_name
Nome da imagem privada a ser criada.
Sim
image_tags
Tags da imagem privada a ser criada.
Não
availability_zone
AZ. Obtenha o nome da região em Regiões e pontos de extremidade.
Não
source_image_name
Nome da imagem de origem. Esta é a imagem sobre a qual você pretende construir o sistema operacional base. Você pode obter o nome da imagem de origem na lista de imagens públicas no console do IMS.
NOTA:Para especificar uma imagem de origem, você também pode usar source_image para especificar um ID de imagem ou usar source_image_filter para filtrar uma imagem de origem.
Não
ssh_username
Nome de usuário de logon SSH da imagem privada a ser criada.
Este parâmetro é obrigatório para logon SSH.
Não
eip_type
Tipo de linha do EIP.
Não
eip_bandwidth_size
Largura de banda do EIP (Mbit/s). Este parâmetro é obrigatório se o acesso à Internet for necessário.
NOTA:eip_type e eip_bandwidth_size são configurados para criar um novo EIP. Para usar um EIP existente, configure reuse_ips e floating_ip.
Não
provisioner
Tipo de provisionador. Para obter detalhes, consulte Provisionadores de Packer.
Sim
post-processor
Tipo de pós-processador.
Não
Para obter mais parâmetros, consulte https://github.com/huaweicloud/packer-plugin-huaweicloud/wiki.
Criar uma imagem privada usando o Packer
- Depois que o modelo do Packer for criado, execute o seguinte comando para importar AK/SK:
export HW_ACCESS_KEY=<AccessKey ID>
export HW_SECRET_KEY=<AccessKey Secret>
- Execute o seguinte comando para criar uma imagem:
huaweicloud-ecs.artifact: output will be in this color. ==> huaweicloud-ecs.artifact: Loading availability zones... huaweicloud-ecs.artifact: the specified availability_zone ap-southeast-1a is available ==> huaweicloud-ecs.artifact: Loading flavor: c6.large.2 ==> huaweicloud-ecs.artifact: Creating temporary keypair: packer_64abc4fd-xxxx-xxxx-xxxx-2139eee76819... ==> huaweicloud-ecs.artifact: Created temporary keypair: packer_64abc4fd-xxxx-xxxx-xxxx-2139eee76819 huaweicloud-ecs.artifact: Found Image ID: 19d9079e-xxxx-xxxx-xxxx-642116ad6557 ==> huaweicloud-ecs.artifact: Creating temporary VPC... huaweicloud-ecs.artifact: temporary VPC ID: 6e309adc-xxxx-xxxx-xxxx-4c3356b972c7 ==> huaweicloud-ecs.artifact: Creating temporary subnet... huaweicloud-ecs.artifact: temporary subnet ID: 66ab3bc3-xxxx-xxxx-xxxx-d8ca2d9378cc huaweicloud-ecs.artifact: the [default] security groups will be used ... ==> huaweicloud-ecs.artifact: Creating EIP ... huaweicloud-ecs.artifact: Created EIP: '0cd696e3-xxxx-xxxx-xxxx-220b8d277604' (159.xxx.xxx.180) ==> huaweicloud-ecs.artifact: Launching server in AZ ap-southeast-1a... huaweicloud-ecs.artifact: Waiting for server to become ready... huaweicloud-ecs.artifact: Server ID: 13f78f88-xxxx-xxxx-xxxx-7e8c27a9ad1f ==> huaweicloud-ecs.artifact: Using SSH communicator to connect: 159.138.141.180 ==> huaweicloud-ecs.artifact: Waiting for SSH to become available... ==> huaweicloud-ecs.artifact: Connected to SSH! ==> huaweicloud-ecs.artifact: Provisioning with shell script: /tmp/packer-shell2456008753 huaweicloud-ecs.artifact: Hit:1 http://repo.huaweicloud.com/ubuntu jammy InRelease ...... huaweicloud-ecs.artifact: Fetched 5,536 kB in 3s (2,006 kB/s) huaweicloud-ecs.artifact: Reading package lists... ==> huaweicloud-ecs.artifact: Stopping server: 13f78f88-xxxx-xxxx-xxxx-7e8c27a9ad1f ... huaweicloud-ecs.artifact: Waiting for server to stop: 13f78f88-xxxx-xxxx-xxxx-7e8c27a9ad1f ... ==> huaweicloud-ecs.artifact: Creating the system image: Ubuntu-2204-image-powered-by-Packer ... huaweicloud-ecs.artifact: Image: 62dc6e37-xxxx-xxxx-xxxx-a2a00a677f5b ==> huaweicloud-ecs.artifact: Terminating the source server: 13f78f88-xxxx-xxxx-xxxx-7e8c27a9ad1f... ==> huaweicloud-ecs.artifact: Deleted temporary public IP '0cd696e3-xxx-xxxx-xxxx-220b8d277604' (159.xxx.xxx.180) ==> huaweicloud-ecs.artifact: Deleting temporary subnet: 66ab3bc3-xxxx-xxxx-xxxx-d8ca2d9378cc... ==> huaweicloud-ecs.artifact: Deleting temporary VPC: 6e309adc-xxxx-xxxx-xxxx-4c3356b972c7... ==> huaweicloud-ecs.artifact: Deleting temporary keypair: packer_64abc4fd-xxxx-xxxx-xxxx-2139eee76819 ... ==> huaweicloud-ecs.artifact: Running post-processor: (type manifest) Build 'huaweicloud-ecs.artifact' finished after 5 minutes 48 seconds. ==> Wait completed after 5 minutes 48 seconds ==> Builds finished. The artifacts of successful builds are: --> huaweicloud-ecs.artifact: An image was created: 62dc6e37-xxxx-xxxx-xxxx-a2a00a677f5b
- Faça logon no console de gerenciamento e clique em Image Management Service em Compute.
- Clique na guia Private Images e visualize a imagem criada usando o Packer. Figura 1 mostra a imagem criada.
Links úteis
Guia oficial do Packer: https://www.packer.io/intro/getting-started/install.html