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

Um script de inicialização realiza tarefas durante o processo de inicialização de uma máquina virtual (VM). Nesta página, você encontra as etapas para usar scripts de inicialização em instâncias de VM.

Antes de começar

Para usar os comandos da interface de linha de comando (CLI) gdcloud, verifique se você baixou, instalou e configurou a CLI gdcloud. Todos os comandos do Distributed Cloud usam a CLI gdcloud ou kubectl e exigem um ambiente de sistema operacional (SO).

Extrair o caminho do arquivo kubeconfig

Para executar comandos no servidor da 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 da API Management para substituir MANAGEMENT_API_SERVER nestas instruções.

Solicitar permissões e acesso

Para executar as tarefas listadas nesta página, você precisa ter o papel de administrador de máquina virtual do projeto. Siga as etapas para verificar seu acesso ou peça ao administrador do IAM do projeto para atribuir a você o papel de administrador de máquinas virtuais do projeto (project-vm-admin) no namespace do projeto em que a VM está localizada.

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 Google Distributed Cloud (GDC) isolado por ar 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 dele:

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==

Confira as seguintes considerações:

  • O script de inicialização é executado em todas as inicializações.
  • 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 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 ou os scripts 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 da API Management.
    PROJECT O projeto 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.

    Confira a seguir um exemplo de como criar uma VM com scripts de inicialização que adiciona 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 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 a ser usada para o disco de inicialização da nova 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 atual com um script de inicialização

Também é possível atualizar uma VM atual com um script de inicialização. A VM precisa ser desligada antes da 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.

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> ...