IBM Cloud Docs
Instalar o software em instâncias de servidor virtual no VPC

Instalar o software em instâncias de servidor virtual no VPC

Este tutorial pode incorrer em custos. Use o Estimador de custos para gerar uma estimativa do custo baseada em seu uso projetado.

Este tutorial conduz você pelo fornecimento da infraestrutura do IBM Cloud® Virtual Private Cloud (VPC) e pela instalação do software em instâncias de servidor virtual (VSI) usando as ferramentas de Infrastructure as Code (IaC) como Terraform e Ansible.

Após uma introdução à arquitetura do tutorial, você preparará seu ambiente para o tutorial e revisará os conceitos básicos de instalação de software no IBM Cloud. Nesse ponto, você pode decidir avaliar todas as tecnologias ou ir para uma das seções autônomas específicas, como Terraform ou Ansible.

Objetivos

  • Entender o software do sistema operacional fornecido pelo IBM.
  • Utilizar as etapas manuais para atualizar o software do sistema operacional e instalar o novo software.
  • Entender como usar a CLI do IBM Cloud, o Terraform e o Ansible para automatizar o fornecimento de recursos e a instalação de software.

Neste tutorial, você implementará a configuração introduzida em outro tutorial, Frontend público e back-end privado em uma Virtual Private Cloud. Você provisionará um servidor de front-end acessível por meio da Internet pública conversando com um servidor de back-end sem conectividade com a Internet.

Arquitetura de front-end público e back-end privado em uma nuvem privada virtual*Diagrama de
do

A configuração também inclui um host bastion agindo como um servidor de salto, permitindo a conexão segura com instâncias provisionadas sem um endereço IP público:

Arquitetura do Host Bastion
Arquitetura do Host Bastion

Ao provisionar os recursos, você também implementará aplicativos nas instâncias de servidor virtual. Ao implementar aplicativos na nuvem, o software pode se originar de diferentes origens:

  1. O sistema de arquivos de uma estação de trabalho local - usando ferramentas como o Terraform para criar a infraestrutura necessária ou Ansible, ssh e scp para instalar e configurar o software nas instâncias de servidor virtual;
  2. Espelhos da IBM para atualizar os sistemas operacionais ou para instalar pacotes suportados;
  3. Repositórios de software da Internet ou intranet.

Diagrama de arquitetura mostrando as diferentes origens para instalar o software de
Diagrama de arquitetura mostrando as diferentes origens para instalar o software de

Você explorará como consumir essas diferentes origens.

Antes de Iniciar

Criar uma chave ssh da VPC

Ao provisionar instâncias de servidor virtual, uma chave SSH será injetada nas instâncias para que seja possível se conectar posteriormente aos servidores.

  1. Se você não tiver uma chave SSH em sua máquina local, consulte estas instruções para a criação de uma chave para a VPC. Por padrão, a chave privada está localizada em $HOME/.ssh/id_rsa.
  2. Inclua a chave SSH no Console do VPC sob Chaves de cálculo/SSH. Assegure-se de criar a chave no mesmo grupo de recursos em que você vai criar os outros recursos neste tutorial.

Configurar variáveis de ambiente

Este tutorial é fornecido com código de amostra para ilustrar as diferentes opções para provisionar recursos e instalar ou atualizar o software em um ambiente da VPC.

Ele conduzirá você pelas etapas de exemplo em um terminal usando o shell, terraform e ansible. Você instalará essas ferramentas em etapas posteriores. Para que os scripts funcionem, é necessário definir um conjunto de variáveis de ambiente.

  1. Clone o tutorial repositório de código de origem:

    git clone https://github.com/IBM-Cloud/vpc-tutorials.git
    
  2. Defina uma variável denominada CHECKOUT_DIR apontando para o diretório de código-fonte:

    cd vpc-tutorials
    export CHECKOUT_DIR=$PWD
    
  3. Mude para o diretório do tutorial:

    cd $CHECKOUT_DIR/vpc-app-deploy
    
  4. Copie o arquivo de configuração:

    cp export.template export
    
  5. Edite o arquivo export e configure os valores da variável de ambiente:

    • TF_VAR_ibmcloud_api_key é uma chave de API do IBM Cloud. É possível criar uma por meio do console.

    • TF_VAR_ssh_key_name é o nome da chave pública SSH da VPC identificada na seção anterior. Essa é a chave pública que será carregada para as instâncias de serviço virtual para fornecer acesso ssh seguro por meio da chave privada em sua estação de trabalho. Use a CLI para verificar se ela existe:

      ibmcloud is keys
      
    • TF_VAR_resource_group_name é um grupo de recursos no qual os recursos serão criados. Consulte Criando e gerenciando grupos de recursos.

    • TF_VAR_region é uma região em que os recursos serão criados. Este comando exibirá as regiões:

      ibmcloud is regions
      
    • TF_VAR_zone é uma zona em que os recursos serão criados. Este comando exibirá as zonas:

      ibmcloud is zones
      
    • TF_VAR_ssh_agent indica que uma chave SSH protegida por passphrase é usada Ative a variável descomentando-a. Em seguida, use ssh-add ~/.ssh/id_rsa para incluir a chave SSH no agente de autenticação..

  6. Carregue as variáveis no ambiente:

    source export
    

    Certifique-se de sempre usar a mesma janela do terminal nas próximas seções ou configurar as variáveis de ambiente se você usar uma nova janela. As variáveis de ambiente em export estão no formato Terraform (observe o prefixo TF_VAR_ ) por conveniência. Elas são usadas em seções subsequentes.

Conceitos básicos de instalação de software

Provisionar instâncias de servidor virtual por meio de imagens base

Ao provisionar uma instância de servidor virtual, selecione a imagem base por meio de um conjunto predefinido de imagens do sistema operacional fornecidas pelo IBM. Use ibmcloud is images para localizar a lista de imagens disponíveis.

O IBM tem espelhos internos para suportar as imagens do IBM. Os espelhos conterão novas versões para o software nas imagens fornecidas pelo IBM, assim como os pacotes opcionais associados à distribuição. Os espelhos fazem parte dos terminais em serviço disponíveis para IBM Cloud VPC. Não há nenhum custo de ingresso para a leitura dos espelhos.

Considere atualizar as listas de versões disponíveis para as instâncias provisionadas e fazer upgrade do software instalado por meio desses espelhos.

Inicializar e customizar instâncias da nuvem com cloud-init

Ao provisionar uma instância de servidor virtual, você pode especificar um script de inicialização na nuvem a ser executado durante a inicialização do servidor. Cloud-init é um pacote de multidistribuição que manipula a inicialização antecipada de uma instância da nuvem. Ele define uma coleção de formatos de arquivo para codificar a inicialização de instâncias da nuvem.

No IBM Cloud, o conteúdo do arquivo cloud-init é fornecido no parâmetro user-data no momento em que o servidor é provisionado. Consulte Formatos de dados do usuário para obter informações sobre o conteúdo aceitável de dados do usuário. Se você precisar depurar a execução de script, o cloud-init registrará a saída do script de inicialização em /var/log/cloud-init-output.log em instâncias de servidor virtual.

Este tutorial usa um script de shell chamado install.sh como script de inicialização:

#!/bin/bash
set -x
apt-get update
apt-get install -y nginx
indexhtml=/var/www/html/index.html

# Demonstrate the availability of internet repositories.  If www.python.org is availble then other software internet software like
# npm, pip, docker, ...  if isolated only the software from the ibm mirrors can be accessed
if curl -o /tmp/x -m 3 https://www.python.org/downloads/release/python-373/; then
    echo INTERNET > $indexhtml
else
    echo ISOLATED > $indexhtml
fi

Nesse script, fazer upgrade do software instalado e instalar o nginx e outros pacotes usando as ferramentas de instalação de software fornecidas pelo sistema operacional demonstra que mesmo as instâncias isoladas têm acesso aos espelhos fornecidos pela IBM. Para Ubuntu, os comandos apt-get acessarão espelhos.

O comando curl acessando www.python.org demonstra a tentativa de acessar e, potencialmente, instalar o software por meio da Internet.

Com base em se o host tem conectividade com a Internet, o script modifica a página index.html entregue por nginx.

Fazer upload do sistema de arquivos e executar na instância

Pode haver dados e software que estão disponíveis no sistema de arquivos de seu sistema no local ou pipeline CI/CD que precisam ser transferidos por upload para a instância de servidor virtual e, em seguida, executados.

Nesses casos, é possível usar a conexão SSH com o servidor para fazer upload de arquivos com scp e, em seguida, executar scripts no servidor com ssh. Os scripts também podem recuperar os instaladores de software da Internet ou de seus sistemas no local, supondo que você tenha estabelecido uma conexão como uma VPN entre os seus sistemas no local e a nuvem.

O código do tutorial contém um script chamado uploaded.sh que será carregado de sua estação de trabalho para as instâncias do servidor virtual (manualmente ou por meio de automação como Terraform e Ansible ).

Em seções posteriores, você usará o script test_provision.bash para confirmar se os servidores foram provisionados com êxito, se podem (ou não) acessar a Internet e se o script uploaded.sh foi executado corretamente.

Usando a CLI do IBM Cloud e os shell scripts

A CLI do IBM Cloud fornece comandos para interagir com todos os recursos que podem ser criados no IBM Cloud. Esta seção explica como usar esses comandos, mas você não criará recursos. Recomenda-se utilizar o Terraform para implantar soluções completas.

Antes de Iniciar

Instale as ferramentas da linha de comandos (CLI) seguindo estas etapas

Provisionar instâncias de servidor virtuais e instalar software

O CLI possui um plugin para todas as funcionalidades relacionadas ao VPC, incluindo recursos de computação e rede.

  1. Antes de trabalhar com recursos de VPC, configure o grupo de recursos atual e região:

    ibmcloud target -g $TF_VAR_resource_group_name -r $TF_VAR_region
    
  2. Para prover uma instância de servidor virtual, execute o comando CLI ibmcloud is instance-create. In shared/install.sh é o arquivo cloud-init usado para inicializar o frontend e os servidores de backend. Você pode passar o script com o parâmetro --user-data como este:

    ibmcloud is instance-create ... --user-data @shared/install.sh
    
  3. Com o frontend e o backend VSIs implantados e em modo de manutenção, você poderia enviar um script para, por exemplo, o servidor frontend, então executar o script para instalar software da Internet. Envie um script para o servidor de front-end:

    scp -F ../scripts/ssh.notstrict.config -o ProxyJump=root@$BASTION_IP_ADDRESS shared/uploaded.sh root@$FRONT_NIC_IP:/uploaded.sh
    

    Em seguida, execute este script:

    ssh -F ../scripts/ssh.notstrict.config -o ProxyJump=root@$BASTION_IP_ADDRESS root@$FRONT_NIC_IP sh /uploaded.sh
    

    Pode levar alguns minutos para que o serviço ssh no servidor seja inicializado, e levará mais alguns minutos para que o script cloud-init seja concluído. O script uploaded.sh aguardará até que a inicialização seja concluída antes de sair.

Infraestrutura de fornecimento com Terraform

O Terraform permite que você crie, altere e aprimore a infraestrutura de forma segura e previsível. Ele é uma ferramenta de software livre que codifica as APIs em arquivos de configuração declarativos que podem ser compartilhados entre membros da equipe, tratados como código, editados, revisados e com versão.

Antes de Iniciar

Siga as instruções para instalar o Terraform e o plug-in do Provedor IBM Cloud para Terraform em sua estação de trabalho.

Provisionar uma única instância de servidor virtual

Antes de implementar uma arquitetura mais complexa e para validar a instalação do provedor Terraform, vamos implementar uma única instância de servidor virtual com um IP flutuante e, em seguida, acesse esse servidor por meio do SSH.

Verifique o arquivo main.tf para obter um script de terraformação. Ele utiliza as variáveis de ambiente definidas anteriormente.

  1. Mude para a pasta de script do terraform para este exemplo:

    cd $CHECKOUT_DIR/vpc-app-deploy/tfinstance
    
  2. Inicialize o Terraform:

    terraform init
    
  3. Aplique o plano do Terraform:

    terraform apply
    

    O script cria um VPC, uma VSI e ativa o acesso SSH.

  4. Visualize a saída gerada pelo plano:

    terraform output
    
  5. Você poderia copiar e colar a saída do comando anterior ou usar terraform output conforme a seguir para SSH para a VSI

    $(terraform output -raw sshcommand)
    

    O uso de saídas em Terraform pode se tornar muito útil quando você deseja reutilizar propriedades do recurso em outros scripts após ter aplicado um plano do Terraform.

  6. Remova os recursos criados pelo Terraform:

    terraform destroy
    

Provisione sub-redes e instâncias de servidor virtual

O conjunto de arquivos Terraform na pasta vpc-app-deploy/tf do repositório vpc-tutorials implementa a arquitetura do tutorial Front-end público e back-end privado em uma Nuvem privada virtual.

O script vpc-app-deploy/tf/main.tf contém a definição dos recursos. Importa um módulo do Terraform compartilhado com este outro tutorial:

   module vpc_pub_priv {
     source = "../../vpc-public-app-private-backend/tfmodule"
     basename = "${local.BASENAME}"
     ssh_key_name = "${var.ssh_key_name}"
     zone = "${var.zone}"
     backend_pgw = false
     profile = "${var.profile}"
     image_name = "${var.image_name}"
     resource_group_name = "${var.resource_group_name}"
     maintenance = "${var.maintenance}"
     frontend_user_data = "${file("../shared/install.sh")}"
     backend_user_data = "${file("../shared/install.sh")}"
   }

Nesta definição:

  • backend_pgw controla se o servidor de back-end tem acesso à Internet pública. Um gateway público pode ser conectado à sub-rede de back-end. O front-end tem um IP flutuante designado que fornece um IP público e um gateway para a Internet. Isso permitirá acesso à Internet aberta para instalação de software. O back-end não terá acesso à Internet.
  • frontend_user_data e backend_user_data apontam para os scripts de inicialização cloud-init.

Com o Terraform, todos os recursos podem ter provisionadores associados. O provisionador null_resource não provisiona um recurso em nuvem, mas pode ser usado para copiar arquivos para instâncias do servidor. Essa construção é usada no script para copiar o arquivo uploaded.sh e depois executá-lo, conforme mostrado abaixo. Para se conectar aos servidores, o Terraform suporta o uso do bastion host, conforme provisionado no tutorial:

   resource "null_resource" "copy_from_on_prem" {
     connection {
       type        = "ssh"
       user        = "root"
       host        = "${module.vpc_pub_priv.frontend_network_interface_address}"
       private_key = "${file("~/.ssh/id_rsa")}"
       bastion_user        = "root"
       bastion_host        = "${local.bastion_ip}"
       bastion_private_key = "${file("~/.ssh/id_rsa")}"
     }
     provisioner "file" {
       source      = "../shared/${local.uploaded}"
       destination = "/${local.uploaded}"
      }
     provisioner "remote-exec" {
       inline      = [
         "bash -x /${local.uploaded}",
        ]
     }
   }

Para provisionar os recursos:

  1. Mude para a pasta de script do terraform:
    cd $CHECKOUT_DIR/vpc-app-deploy/tf
    
  2. Inicialize o Terraform:
    terraform init
    
  3. Aplique o plano do Terraform:
    terraform apply
    
  4. Visualize a saída gerada pelo plano:
    terraform output
    

Teste a configuração dos servidores virtuais

Agora que o Terraform tem recursos implementados, é possível validar se eles foram provisionados corretamente.

  1. Valide se a instância do servidor virtual de frontend é acessível e tem acesso de saída para a Internet:
    ../test_provision.bash $(terraform output -raw FRONT_IP_ADDRESS) INTERNET hi
    
    A saída de comando deve ser:
    success: httpd default file was correctly replaced with the following contents:
    INTERNET
    success: provision of file from on premises worked and was replaced with the following contents:
    hi
    
  2. Valide se o back-end pode ser acessado por meio do host bastion e não tem acesso à Internet:
    ../test_provision.bash $(terraform output -raw BACK_NIC_IP) ISOLATED hi "ssh -F ../../scripts/ssh.notstrict.config root@$(terraform output -raw FRONT_NIC_IP) -o ProxyJump=root@$(terraform output -raw BASTION_IP_ADDRESS)"
    
    A saída de comando deve ser:
    success: httpd default file was correctly replaced with the following contents:
    ISOLATED
    success: provision of file from on premises worked and was replaced with the following contents:
    hi
    

Remover recursos

  1. Remova os recursos criados pelo Terraform:
    terraform destroy
    

Instalando o software com o Ansible

Ansible é uma ferramenta de gerenciamento de configuração e provisionamento, semelhante ao Chef e ao Puppet, e foi projetado para automatizar implementações e provisionamento de aplicativos em várias camadas na nuvem. Escrito em Python, o Ansible usa a sintaxe YAML para descrever as tarefas de automação, o que torna o Ansible mais fácil de aprender e usar.

Embora o Ansible possa ser usado para provisionar os recursos da VPC e instalar o software, esta seção usa o Terraform para provisionar os recursos da VPC e o Ansible para implementar o software.

Antes de Iniciar

Esta seção usa o Terraform e o Ansible.

  1. Siga as instruções para instalar o Terraform e o plug-in do Provedor IBM Cloud para Terraform em sua estação de trabalho.
  2. Siga estas instruções para instalar Ansible.

Playbook do Ansible

Um playbook do Ansible fornece as tarefas a serem executadas. O exemplo abaixo tem um conjunto de tarefas necessárias para instalar o nginx e fazer upload de um script. Você observará as semelhanças com o script cloud-init discutido anteriormente. O script uploaded.sh é idêntico.

- hosts: FRONT_NIC_IP BACK_NIC_IP
  remote_user: root
  tasks:
  - name: update apt cache manual
    # this should not be required but without it the error: Failed to lock apt for exclusive operation is generated
    shell: apt update
    args:
      executable: /bin/bash
  - name: update apt cache
    apt:
      update_cache: yes
  - name: ensure nginx is at the latest version
    apt:
      name: nginx
      state: latest
    notify:
    - restart nginx
  - name: execute init.bash
    script: ./init.bash
  - name: upload execute uploaded.sh
    script: ../shared/uploaded.sh
  handlers:
    - name: restart nginx
      service:
        name: nginx
        state: restarted

Inventário do Ansible

Ansible funciona com relação a múltiplos sistemas em sua infraestrutura ao mesmo tempo. O inventário do Ansible contém a lista desses sistemas. O tutorial fornece um script inventory.bash para gerar o inventário Ansible a partir da saída do Terraform.

#!/bin/bash
TF=tf
printf 'all:
  children:
    FRONT_NIC_IP:
      hosts:
        %s
    BACK_NIC_IP:
      hosts:
        %s
' $(cd $TF; terraform output -raw FRONT_NIC_IP) $(cd $TF; terraform output -raw BACK_NIC_IP)

Provisione sub-redes e instâncias de servidor virtual

O diretório vpc-app-deploy/ansible/tf contém uma configuração do Terraform semelhante à descrita na seção anterior, exceto que a instalação do software foi removida. O script do Ansible instalará o software por meio dos espelhos e, em seguida, fará upload do software de sua estação de trabalho.

  1. Mude para a pasta de script do Ansible para este exemplo:
    cd $CHECKOUT_DIR/vpc-app-deploy/ansible/tf
    
  2. Inicialize o Terraform:
    terraform init
    
  3. Aplique o plano do Terraform:
    terraform apply
    
  4. Visualize a saída gerada pelo plano:
    terraform output
    
  5. Gere o inventário do Ansible:
    cd .. && ./inventory.bash > inventory
    
  6. Provisione o software no servidor de front-end:
    ansible-playbook -T 40 -l FRONT_NIC_IP -u root \
      --ssh-common-args "-F ../../scripts/ssh.notstrict.config -o ProxyJump=root@$(cd tf; terraform output -raw BASTION_IP_ADDRESS)" \
      -i inventory lamp.yaml
    
  7. Provisione o software no servidor de back-end:
    ansible-playbook -T 40 -l BACK_NIC_IP -u root \
      --ssh-common-args "-F ../../scripts/ssh.notstrict.config -o ProxyJump=root@$(cd tf; terraform output -raw BASTION_IP_ADDRESS)" \
      -i inventory lamp.yaml
    

Teste a configuração dos servidores virtuais

Agora que o Terraform implementou os recursos e o Ansible instalou o software, é possível validar se eles foram provisionados corretamente.

  1. Valide se a instância do servidor virtual de frontend é acessível e tem acesso de saída para a Internet:
    ../test_provision.bash $(cd tf && terraform output -raw FRONT_IP_ADDRESS) INTERNET hi
    
    A saída de comando deve ser:
    success: httpd default file was correctly replaced with the following contents:
    INTERNET
    success: provision of file from on premises worked and was replaced with the following contents:
    hi
    
  2. Valide se o back-end pode ser acessado por meio do host bastion e não tem acesso à Internet:
    ../test_provision.bash $(cd tf && terraform output -raw BACK_NIC_IP) ISOLATED hi "ssh -F ../../scripts/ssh.notstrict.config root@$(cd tf && terraform output -raw FRONT_NIC_IP) -o ProxyJump=root@$(cd tf && terraform output -raw BASTION_IP_ADDRESS)"
    
    A saída de comando deve ser:
    success: httpd default file was correctly replaced with the following contents:
    ISOLATED
    success: provision of file from on premises worked and was replaced with the following contents:
    hi
    

Remover recursos

  1. Remova os recursos criados pelo Terraform:

    cd $CHECKOUT_DIR/vpc-app-deploy/ansible/tf
    

    e

    terraform destroy
    

Dependendo do recurso, ele não é excluído imediatamente, mas retido (por padrão por 7 dias). É possível recuperar o recurso excluindo-o permanentemente ou restaurando-o dentro do período de retenção. Consulte este documento sobre como usar a recuperação de recurso.