Usar um script de inicialização com uma instância de VM em VMs do Linux

Um script de inicialização executa tarefas durante o processo de inicialização de uma máquina virtual (VM). Esta página mostra as etapas a serem seguidas para usar scripts de inicialização em instâncias de VM.

Antes de começar

Para usar comandos da interface de linha de comando (CLI) gdcloud, faça o download, a instalação, e a configuração da gdcloud CLI. Todos os comandos do dispositivo GDC com isolamento físico usam a CLI gdcloud ou kubectl e exigem um ambiente de sistema operacional (SO).

Receber o caminho do arquivo kubeconfig

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

  1. Localize o nome do servidor da API Management ou pergunte ao administrador da plataforma (PA) qual é o nome do servidor.

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

  3. Use o caminho para substituir MANAGEMENT_API_SERVER{"</var>"}} nestas instruções.

Solicitar papéis do IAM

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

  • Administrador de máquinas virtuais do projeto (project-vm-admin): cria, modifica, lista e exclui VMs no namespace do projeto.

  • Administrador de secrets (secret-admin): recebe, lista, cria, atualiza, exclui, corrige e monitora 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 fazer 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 dispositivo isolado do Google Distributed Cloud (GDC) executa scripts de inicialização em ordem alfabética, com base no nome de cada script de inicialização.

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 Texto não criptografado
Scripts maiores que 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 não criptografado 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==

Considere o seguinte:

  • O script de inicialização é executado em todas as inicializações.
  • O script de inicialização tem privilégios de raiz padrão.
  • No secret do Kubernetes, o nome de scriptSecretRef na spec da VM 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

Essas instruções se aplicam independentemente do que você usa como imagem para criar a 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 create secret -n PROJECT 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 1, adicione o script de inicialização ou scripts 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 da API Management.
    PROJECT O projeto do dispositivo GDC com isolamento físico 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 não criptografado.
    CLEAR_TEXT_SCRIPT O script de texto não criptografado 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.

    Confira 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 \
        apply -n PROJECT -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 da API Management.
    PROJECT O projeto do dispositivo GDC com isolamento físico 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 a 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 Either true or false, indicating whether the boot disk is excluído automaticamente quando a instância da 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 com um script de inicialização. A VM precisa ser desligada antes de você realizar a atualização.

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

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

  1. Siga as etapas para se conectar a uma VM.
  2. Execute o seguinte comando na 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> ...