Usar um script de inicialização em VMs do Linux

Neste documento, explicamos como usar scripts de inicialização para iniciar uma instância de máquina virtual (VM) e os programas associados a ela no Google Distributed Cloud (GDC) com isolamento físico.

Um script de inicialização é uma ferramenta de automação que executa tarefas durante o processo de inicialização da VM. Use scripts de inicialização para automatizar tarefas de configuração e implantação de VMs em instâncias novas ou atuais, economizando tempo e reduzindo o esforço de configuração manual.

Este documento é destinado a desenvolvedores em grupos de administradores de plataforma ou operadores de aplicativos que querem usar scripts de inicialização para VMs em um ambiente do Distributed Cloud. Para mais informações, consulte Públicos-alvo da documentação do GDC com isolamento físico.

Antes de começar

Para usar os comandos da interface de linha de comando (CLI) gdcloud, faça o download, instale e configure a CLI gdcloud. Todos os comandos do Distributed Cloud usam a CLI gdcloud ou kubectl e exigem um ambiente de sistema operacional (SO).

Acessar o caminho do arquivo kubeconfig

Para executar comandos no servidor de API Management, verifique se você tem os seguintes recursos:

  1. Faça login e gere o arquivo kubeconfig para o servidor da API Management, se você não tiver um.

  2. Use o caminho para o arquivo kubeconfig do servidor de API Management para substituir MANAGEMENT_API_SERVER nestas instruções.

Solicitar papéis do IAM

Para usar scripts de inicialização em uma VM, entre em contato com o administrador do projeto do IAM para solicitar os seguintes papéis no projeto:

  • Administrador do projeto de máquina virtual (project-vm-admin): criar, modificar, listar e excluir VMs no namespace do projeto.

  • Administrador de secrets (secret-admin): acessar, listar, criar, atualizar, excluir, corrigir e monitorar secrets do Kubernetes no namespace do projeto. Use esse papel para especificar secrets de script de inicialização. Não é necessário ter esse papel para especificar scripts de inicialização de texto simples.

Todos os papéis de VM precisam ser vinculados ao namespace do projeto em que a VM reside. Siga as etapas para verificar seu acesso.

Transmitir um script de inicialização

É possível usar scripts bash ou não bash como scripts de inicialização. Para isso, inclua #!/bin/… no início do script para indicar o interpretador de scripts. Por exemplo, para usar um script de inicialização do Python 3, adicione #! /usr/bin/python3 ao início do script.

O Google Distributed Cloud (GDC) com isolamento físico executa scripts de inicialização na ordem em que aparecem na matriz startupScripts.

A tabela a seguir mostra o formato de script a ser usado com base no tamanho do script:

Tamanho do script Formato do script
Scripts de até 2.048 bytes Limpar texto
Scripts com mais de 2.048 bytes Secret do Kubernetes

Definir um script de inicialização

Para usar um script de inicialização, adicione o campo startupScripts ao campo spec da VM. Nesse campo, é possível especificar vários scripts de inicialização como texto simples ou como um secret do Kubernetes.

O exemplo a seguir especifica os scripts de inicialização como texto não criptografado e um secret do Kubernetes:

apiVersion: virtualmachine.gdc.goog/v1
kind: VirtualMachine
metadata:
  name: "my-vm"
spec:
  # …
  startupScripts:
  - name: hello-world
    script: |
      #!/bin/bash
      echo hello
  - name: add-user
    scriptSecretRef:
      name: add-user
---

apiVersion: v1
kind: Secret
type: Opaque
metadata:
  name: add-user
data:
  script:
    IyEvYmluL2Jhc2gKYWRkdXNlciB1c2VyCg==

Analise as seguintes considerações:

  • O script de inicialização é executado em cada inicialização.
  • O script de inicialização tem privilégios raiz padrão.
  • No secret do Kubernetes, o nome do scriptSecretRef na VM spec precisa corresponder ao campo metadata.name.
  • No secret do Kubernetes, especifique o conteúdo do script de inicialização adicionando uma chave script ao campo data.

Criar uma VM com um script de inicialização

Estas instruções se aplicam independentemente do que você usa como imagem para criar sua VM. Preencha os campos:

  1. Para criar um script de inicialização como um secret do Kubernetes, execute:

    cat <<EOF >>FILE_NAME
    STARTUP_SCRIPT_CONTENT
    EOF
    
    kubectl --kubeconfig MANAGEMENT_API_SERVER \
      -n PROJECT \
      create secret generic SECRET_NAME \
      --from-file=script=FILE_NAME
    
    rm FILE_NAME
    
  2. Consulte as etapas para criar uma VM, conforme descrito na página Criar uma VM. Na etapa um, adicione os script de inicialização ao campo spec antes de executar o comando para criar uma VM.

    Este exemplo define um script de inicialização com texto não criptografado e um secret do Kubernetes:

    apiVersion: virtualmachine.gdc.goog/v1
    kind: VirtualMachine
    metadata:
      name: VM_NAME
      namespace: PROJECT
    spec:
      # …
      startupScripts:
      - name: CLEAR_TEXT_SCRIPT_NAME
        script: |
          #!/bin/bash
          CLEAR_TEXT_SCRIPT
      - name: SECRET_SCRIPT_NAME
        scriptSecretRef:
          name: SECRET_NAME
    

    Essas variáveis são definidas da seguinte maneira:

    VariávelDefinição
    MANAGEMENT_API_SERVER O arquivo kubeconfig do servidor de API Management.
    PROJECT O projeto na nuvem do Distributed Cloud em que você quer criar a VM.
    VM_NAME O nome da VM.
    FILE_NAME O nome do arquivo para armazenar o script de inicialização.
    STARTUP_SCRIPT_CONTENT Os comandos a serem executados como parte do script de inicialização
    CLEAR_TEXT_SCRIPT_NAME O nome do script de inicialização de texto simples.
    CLEAR_TEXT_SCRIPT O script de texto simples que você define.
    SECRET_NAME O nome do secret do Kubernetes.
    SECRET_SCRIPT_NAME O nome do script de inicialização como um secret do Kubernetes.
  3. Siga as etapas abaixo para criar uma VM.

    Veja a seguir um exemplo de como criar uma VM com scripts de inicialização que adicionam um novo usuário usando um secret do Kubernetes e texto não criptografado.

    kubectl --kubeconfig MANAGEMENT_API_SERVER \
      -n PROJECT \
      apply -f - <<EOF
    apiVersion: virtualmachine.gdc.goog/v1
    kind: VirtualMachineDisk
    metadata:
      name: VM_BOOT_DISK_NAME
    spec:
      source:
        image:
          name: BOOT_DISK_IMAGE_NAME
          namespace: vm-system
      size: BOOT_DISK_SIZE
    ---
    apiVersion: v1
    kind: Secret
    type: Opaque
    metadata:
      name: add-user
    data:
      script:
        IyEvYmluL2Jhc2gKYWRkdXNlciB1c2VyCg==
    ---
    apiVersion: virtualmachine.gdc.goog/v1
    kind: VirtualMachine
    metadata:
      name: VM_NAME
    spec:
      compute:
        virtualMachineType: MACHINE_TYPE
      disks:
      - virtualMachineDiskRef:
          name: VM_BOOT_DISK_NAME
        boot: true
        autoDelete: BOOT_DISK_AUTO_DELETE
      startupScripts:
      - name: add-user
        scriptSecretRef:
          name: add-user
      - name: add-to-sudoers
        script: |
          #!/bin/bash
          usermod -aG sudo user
    EOF
    

    No exemplo, as variáveis são definidas da seguinte maneira.

    VariávelDefinição
    MANAGEMENT_API_SERVER O arquivo kubeconfig do servidor de API Management.
    PROJECT O projeto na nuvem do Distributed Cloud em que você quer criar a VM.
    VM_NAME O nome da nova VM.
    VM_BOOT_DISK_NAME O nome do novo disco de inicialização da VM.
    BOOT_DISK_IMAGE_NAME O nome da imagem que será usada para o novo disco de inicialização da VM.
    BOOT_DISK_SIZE O tamanho do disco de inicialização, como 20G.
    Esse valor precisa ser sempre maior ou igual ao minimumDiskSize da imagem do disco de inicialização.
    BOOT_DISK_AUTO_DELETE true ou false, indicando se o disco de inicialização é excluído automaticamente quando a instância de VM é excluída.
    MACHINE_TYPE O tipo de máquina predefinido para a nova VM. Para selecionar um tipo de máquina disponível, execute este comando:
    kubectl --kubeconfig MANAGEMENT_API_SERVER get virtualmachinetype.virtualmachine.gdc.goog --namespace vm-system

Atualizar uma VM com um script de inicialização

Também é possível atualizar uma VM atual com um script de inicialização. A VM precisa ser encerrada antes de você realizar a atualização.

Siga as etapas para atualizar as propriedades da VM e atualize o campo spec com o script de inicialização que você quer executar.

Ver a saída de um script de inicialização

  1. Siga as etapas para se conectar a uma VM.
  2. Execute o seguinte comando dentro da VM convidada para receber os registros do script de inicialização que você executou:

    sudo journalctl -u cloud-final
    

    Os registros do script de inicialização começam com o seguinte:

    Started to run the command: /var/lib/google/startup-scripts/<script-name> ...