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

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:
- 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
escp
para instalar e configurar o software nas instâncias de servidor virtual; - Espelhos da IBM para atualizar os sistemas operacionais ou para instalar pacotes suportados;
- Repositórios de software da Internet ou intranet.

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.
- 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
. - 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.
-
Clone o tutorial repositório de código de origem:
git clone https://github.com/IBM-Cloud/vpc-tutorials.git
-
Defina uma variável denominada
CHECKOUT_DIR
apontando para o diretório de código-fonte:cd vpc-tutorials export CHECKOUT_DIR=$PWD
-
Mude para o diretório do tutorial:
cd $CHECKOUT_DIR/vpc-app-deploy
-
Copie o arquivo de configuração:
cp export.template export
-
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, usessh-add ~/.ssh/id_rsa
para incluir a chave SSH no agente de autenticação..
-
-
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 prefixoTF_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.
-
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
-
Para prover uma instância de servidor virtual, execute o comando CLI
ibmcloud is instance-create
. Inshared/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
-
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 scriptuploaded.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.
-
Mude para a pasta de script do terraform para este exemplo:
cd $CHECKOUT_DIR/vpc-app-deploy/tfinstance
-
Inicialize o Terraform:
terraform init
-
Aplique o plano do Terraform:
terraform apply
O script cria um VPC, uma VSI e ativa o acesso SSH.
-
Visualize a saída gerada pelo plano:
terraform output
-
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.
-
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:
- Mude para a pasta de script do terraform:
cd $CHECKOUT_DIR/vpc-app-deploy/tf
- Inicialize o Terraform:
terraform init
- Aplique o plano do Terraform:
terraform apply
- 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.
- Valide se a instância do servidor virtual de frontend é acessível e tem acesso de saída para a Internet:
A saída de comando deve ser:../test_provision.bash $(terraform output -raw FRONT_IP_ADDRESS) INTERNET hi
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
- Valide se o back-end pode ser acessado por meio do host bastion e não tem acesso à Internet:
A saída de comando deve ser:../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)"
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
- 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.
- Siga as instruções para instalar o Terraform e o plug-in do Provedor IBM Cloud para Terraform em sua estação de trabalho.
- 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.
- Mude para a pasta de script do Ansible para este exemplo:
cd $CHECKOUT_DIR/vpc-app-deploy/ansible/tf
- Inicialize o Terraform:
terraform init
- Aplique o plano do Terraform:
terraform apply
- Visualize a saída gerada pelo plano:
terraform output
- Gere o inventário do Ansible:
cd .. && ./inventory.bash > inventory
- 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
- 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.
- Valide se a instância do servidor virtual de frontend é acessível e tem acesso de saída para a Internet:
A saída de comando deve ser:../test_provision.bash $(cd tf && terraform output -raw FRONT_IP_ADDRESS) INTERNET hi
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
- Valide se o back-end pode ser acessado por meio do host bastion e não tem acesso à Internet:
A saída de comando deve ser:../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)"
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
-
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.