IBM Cloud Docs
Instalación de software en instancias de servidor virtual en VPC

Instalación de software en instancias de servidor virtual en VPC

Esta guía de aprendizaje puede incurrir en costes. Utilice Estimador de costes para generar una estimación del coste basada en el uso previsto.

Esta guía de aprendizaje le guiará a través del proceso de suministro de la infraestructura de IBM Cloud® Virtual Private Cloud (VPC) y la instalación de software en instancias de servidor virtual (VSI) utilizando herramientas de infraestructura como código (IaC) como Terraform y Ansible.

Después de una introducción a la arquitectura de la guía de aprendizaje, preparará el entorno para la guía de aprendizaje y revisará los aspectos básicos de la instalación de software en IBM Cloud. En ese momento, puede decidir evaluar todas las tecnologías o saltar a una de las secciones independientes específicas, como Terraform o Ansible.

Objetivos

  • Entender el software de sistema operativo proporcionado por IBM.
  • Utilizar pasos manuales para actualizar el software de sistema operativo e instalar nuevo software.
  • Entender cómo utilizar la CLI de IBM Cloud, Terraform y Ansible para automatizar el suministro de recursos y la instalación de software.

En esta guía de aprendizaje, desplegará la configuración introducida en otra guía de aprendizaje, Servidor frontal público y servidor de fondo privado en una nube privada virtual. Suministrará un servidor frontal accesible desde Internet público que se comunica con un servidor de fondo sin conectividad con Internet.

Arquitectura de frontend público y backend privado en una
Privada Virtual*Diagrama de arquitectura del

La configuración incluye también un host bastión que actúa como un servidor de gestión que permite la conexión segura con las instancias proporcionadas sin una dirección IP pública:

Arquitectura de host de Bastion
Arquitectura de host de Bastion

Mientras se suministran los recursos, también desplegará aplicaciones en las instancias de servidor virtual. Al desplegar aplicaciones en la nube, el software puede proceder de distintos orígenes:

  1. El sistema de archivos de una estación de trabajo local, utilizando herramientas como Terraform para crear la infraestructura necesaria, o Ansible, ssh y scp para instalar y configurar software en las instancias de servidor virtual;
  2. Duplicados de IBM para actualizar los sistemas operativos o para instalar los paquetes soportados;
  3. Repositorios de software de Internet o de la intranet.

Diagrama de arquitectura que muestra los distintos orígenes para instalar software desde
Diagrama de arquitectura que muestra los distintos orígenes para instalar software desde

Se explorará cómo consumir estos orígenes diversos.

Antes de empezar

Crear una clave ssh de VPC

Al suministrar instancias de servidor virtual, deberá inyectarse una clave SSH en las instancias para que se puedan conectar a los servidores más adelante.

  1. Si no tiene una clave SSH en la máquina local, consulte estas instrucciones para crear una clave para VPC. De forma predeterminada, la clave privada se halla en $HOME/.ssh/id_rsa.
  2. Añada la clave SSH en la Consola de VPC en Cálculo / Claves SSH. Asegúrese de crear la clave en el mismo grupo de recursos en el que va a crear los otros recursos de esta guía de aprendizaje.

Establecer variables de entorno

En esta guía de aprendizaje se incluye código de ejemplo para ilustrar las distintas opciones para proporcionar recursos e instalar o actualizar software en un entorno de VPC.

Le guiará a través de los pasos de ejemplo en un terminal utilizando el shell, terraform y ansible. Instalará estas herramientas en pasos posteriores. Para que los scripts funcionen, deberá definir un conjunto de variables de entorno.

  1. Clone el repositorio de código fuentede la guía de aprendizaje:

    git clone https://github.com/IBM-Cloud/vpc-tutorials.git
    
  2. Defina una variable denominada CHECKOUT_DIR que haga referencia al directorio del código fuente:

    cd vpc-tutorials
    export CHECKOUT_DIR=$PWD
    
  3. Acceda al directorio de la guía de aprendizaje:

    cd $CHECKOUT_DIR/vpc-app-deploy
    
  4. Copie el archivo de configuración:

    cp export.template export
    
  5. Edite el archivo export y establezca los valores de variable de entorno:

    • TF_VAR_ibmcloud_api_key es una clave de API de IBM Cloud. Puede crear una desde la consola.

    • TF_VAR_ssh_key_name es el nombre de la clave pública SSH de VPC identificada en la sección anterior. Esta es la clave pública que se cargará en las instancias de servicio virtual para proporcionar acceso SSH seguro a través de la clave privada en su estación de trabajo. Utilice la CLI para verificar que existe:

      ibmcloud is keys
      
    • TF_VAR_resource_group_name es un grupo de recursos donde se crearán los recursos. Consulte Creación y gestión de grupos de recursos.

    • TF_VAR_region es una región en la que se crearán recursos. Este mandato mostrará las regiones:

      ibmcloud is regions
      
    • TF_VAR_zone es una zona en la que se crearán recursos. Este mandato mostrará las zonas:

      ibmcloud is zones
      
    • TF_VAR_ssh_agent indica que se utiliza una clave SSH protegida con frase de contraseña. Habilite la variable descomentándola. A continuación, utilice ssh-add ~/.ssh/id_rsa para añadir la clave SSH al agente de autenticación.

  6. Cargue las variables en el entorno:

    source export
    

    Asegúrese de utilizar siempre la misma ventana de terminal en las siguientes secciones o de establecer las variables de entorno si utiliza una ventana nueva. Las variables de entorno en export están en formato Terraform (observe el prefijo TF_VAR_ ) para mayor comodidad. Se utilizan en las secciones posteriores.

Aspectos básicos de la instalación de software

Suministrar instancias de servidor virtual desde imágenes base

Al suministrar una instancia de servidor virtual, debe seleccionar la imagen base a partir de un conjunto predefinido de imágenes de sistema operativo proporcionado por IBM. Utilice ibmcloud is images para encontrar la lista de imágenes disponibles.

IBM tiene réplicas internas para dar soporte a las imágenes de IBM. Las réplicas incluirán nuevas versiones del software en las imágenes proporcionadas por IBM, así como los paquetes opcionales asociados con la distribución. Las réplicas forman parte de los puntos finales de servicio disponibles para IBM Cloud VPC. No hay ningún coste de entrada de lectura de las réplicas.

Plantéese tanto actualizar las listas de versiones disponibles para las instancias proporcionadas como actualizar el software instalado desde estas réplicas.

Inicializar y personalizar instancias en la nube con cloud-init

Al aprovisionar una instancia de servidor virtual, puede especificar un script cloud-init que se ejecutará durante la inicialización del servidor. Cloud-init es un paquete multidistribución que maneja la inicialización temprana de una instancia en la nube. Define una recopilación de formatos de archivo para codificar la inicialización de instancias en la nube.

En IBM Cloud, el contenido del archivo cloud-init se proporciona en el parámetro user-data en el momento en que se suministra el servidor. Consulte Formatos de datos de usuario para conocer el contenido aceptable de los datos de usuario. Si necesita depurar la ejecución del script, cloud-init registra la salida del script de inicialización en /var/log/cloud-init-output.log en las instancias de servidor virtual.

Este tutorial utiliza un script de shell llamado install.sh como script de inicialización:

#!/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

En este script, la actualización del software instalado y la instalación de nginx y de otros paquetes utilizando las herramientas de instalación de software del sistema operativo muestra que incluso las instancias aisladas tienen acceso a las réplicas proporcionadas por IBM. Para Ubuntu, los mandatos apt-get accederán a las réplicas.

El mandato curl que accede a www.python.org muestra el intento de acceder y potencialmente instalar software desde Internet.

En función de si el host tiene conectividad a Internet, el script modifica la página index.html servida por nginx.

Cargar desde el sistema de archivos y ejecutar en la instancia

Es posible que algunos datos y software estén disponibles en el sistema de archivos del sistema local o en el conducto CI/CD, y que deben cargarse en la instancia de servidor virtual y ejecutarse a continuación.

En estos casos, puede utilizar la conexión SSH con el servidor para cargar archivos con scp y ejecutar luego scripts en el servidor con ssh. Los scripts también pueden recuperar instaladores de software de Internet, o de los sistemas locales, suponiendo que haya establecido una conexión como una VPN entre los sistemas locales y la nube.

El código del tutorial contiene un script llamado uploaded.sh que se cargará desde su estación de trabajo a las instancias del servidor virtual (manualmente o mediante automatización como Terraform y Ansible ).

En secciones posteriores, utilizará el script test_provision.bash para confirmar que los servidores se han aprovisionado correctamente, que pueden (o no) acceder a Internet y que el script uploaded.sh se ha ejecutado correctamente.

Utilización de scripts de shell y de la CLI de IBM Cloud

La CLI de IBM Cloud proporciona mandatos para interactuar con todos los recursos que puede crear en IBM Cloud. Esta sección explica cómo utilizar estos mandatos, pero no va a crear ningún recurso. Se recomienda utilizar Terraform para desplegar soluciones completas.

Antes de empezar

Instale las herramientas de línea de mandatos (CLI) siguiendo estos pasos

Suministrar instancias de servidor virtual e instalar software

La CLI tiene un plugin para todas las funciones relacionadas con VPC, incluidos los recursos de cálculo y de red.

  1. Antes de trabajar con recursos de VPC, establezca el grupo de recursos y la región actuales:

    ibmcloud target -g $TF_VAR_resource_group_name -r $TF_VAR_region
    
  2. Para suministrar una instancia de servidor virtual, ejecute el mandato de CLI ibmcloud is instance-create. En shared/install.sh se encuentra el archivo cloud-init utilizado para inicializar los servidores frontend y backend. Puede pasar el script con el parámetro --user-data de este modo:

    ibmcloud is instance-create ... --user-data @shared/install.sh
    
  3. Con las VSI frontend y backend desplegadas y en modo de mantenimiento, puede enviar un script a, por ejemplo, el servidor frontend y, a continuación, ejecutar el script para instalar software desde Internet. Envíe un script al servidor frontal:

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

    A continuación, ejecute este script:

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

    El servicio ssh del servidor puede tardar unos minutos en inicializarse, y el script cloud-init tardará unos minutos más en completarse. El script uploaded.sh esperará a que finalice la inicialización antes de salir.

Suministro de la infraestructura con Terraform

Terraform le permite crear, cambiar y mejorar la infraestructura de forma segura y predecible. Es una herramienta de código abierto que codifica las API en archivos de configuración declarativos que se pueden compartir entre miembros del equipo, tratar como código, editar, revisar y se pueden crear versiones de los mismos.

Antes de empezar

Siga las instrucciones de instalar Terraform y el plug-in de proveedor de IBM Cloud para Terraform en la estación de trabajo.

Suministrar una única instancia de servidor virtual

Para poder desplegar una arquitectura más compleja y para validar la instalación del proveedor de Terraform, vamos a desplegar una única instancia de servidor virtual con una IP flotante y, a continuación, accederemos a este servidor mediante SSH.

Busca en el main.tf archivo para ver si hay un script terraform. Utiliza las variables de entorno definidas anteriormente.

  1. Acceda a la carpeta de scripts terraform para este ejemplo:

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

    terraform init
    
  3. Aplique el plan de Terraform:

    terraform apply
    

    El script crea una VPC y una VSI, y habilita el acceso SSH.

  4. Vea la salida generada por el plan:

    terraform output
    
  5. Puede copiar y pegar la salida del mandato anterior o puede utilizar terraform output de la siguiente manera para usar SSH en la VSI

    $(terraform output -raw sshcommand)
    

    La utilización de salidas en Terraform puede resultar bastante útil cuando desea reutilizar propiedades de recursos en otros scripts tras haber aplicado un plan de Terraform.

  6. Elimine los recursos creados por Terraform:

    terraform destroy
    

Suministrar subredes e instancias de servidor virtual

El conjunto de archivos Terraform bajo la carpeta vpc-app-deploy/tf del repositorio de vpc-tutorials implementa la arquitectura de la guía de aprendizaje Servidor frontal púbico y servidor frontal privado en una nube privada virtual.

El script vpc-app-deploy/tf/main.tf contiene la definición de los recursos. Importa un módulo Terraform compartido con esta otra guía de aprendizaje:

   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")}"
   }

En esta definición:

  • backend_pgw controla si el servidor de fondo tiene acceso a Internet público. Se puede conectar una pasarela pública a la subred de fondo. El frontend tiene una IP flotante asignada que proporciona tanto una IP pública como una pasarela a Internet. Esto va a permitir un acceso abierto a Internet para la instalación de software. El servidor de fondo no tendrá acceso a Internet.
  • frontend_user_data, backend_user_data hacen referencia a los scripts de inicialización cloud-init.

Con Terraform, todos los recursos pueden tener suministradores asociados. El suministrador null_resource no suministra un recurso de nube, sino que se puede utilizar para copiar archivos en instancias de servidor. Esta construcción se utiliza en el script para copiar el uploaded.sh archivo y luego ejecutarlo como se muestra a continuación. Para conectarse a los servidores, Terraform admite el uso del host bastión tal como se proporciona en el 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 suministrar los recursos:

  1. Acceda a la carpeta de scripts terraform:
    cd $CHECKOUT_DIR/vpc-app-deploy/tf
    
  2. Inicialice Terraform:
    terraform init
    
  3. Aplique el plan de Terraform:
    terraform apply
    
  4. Vea la salida generada por el plan:
    terraform output
    

Probar la configuración de los servidores virtuales

Ahora que Terraform ha desplegado recursos, puede validar que se hayan suministrado correctamente.

  1. Valide que la instancia de servidor virtual frontal sea accesible y que tenga acceso de salida a Internet:
    ../test_provision.bash $(terraform output -raw FRONT_IP_ADDRESS) INTERNET hi
    
    La salida del mandato debería 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 que se puede acceder al servidor de fondo a través del host bastión y que no tiene acceso a 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)"
    
    La salida del mandato debería 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
    

Eliminación de recursos

  1. Elimine los recursos creados por Terraform:
    terraform destroy
    

Instalación de software con Ansible

Ansible es una herramienta de aprovisionamiento y gestión de la configuración, similar a Chef y Puppet, y está diseñada para automatizar el aprovisionamiento y las implementaciones de aplicaciones de varios niveles en la nube. Escrita en Python, Ansible utiliza la sintaxis YAML para describir tareas de automatización, que facilitan el aprendizaje y el uso de Ansible.

Aunque Ansible se puede utilizar para suministrar los recursos de VPC e instalar software, en esta sección se utiliza Terraform para suministrar los recursos de VPC y Ansible para desplegar el software.

Antes de empezar

En esta sección se utiliza tanto Terraform como Ansible.

  1. Siga las instrucciones de instalar Terraform y el plug-in de proveedor de IBM Cloud para Terraform en la estación de trabajo.
  2. Siga estas instrucciones para instalar Ansible.

Playbook de Ansible

Un playbook de Ansible proporciona las tareas que se van a ejecutar. El ejemplo siguiente tiene un conjunto de tareas necesarias para instalar nginx y cargar un script. Notará las similitudes con el script cloud-init descrito anteriormente. El script uploaded.sh es 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

Inventario de Ansible

Ansible funciona con varios sistemas de su infraestructura al mismo tiempo. El inventario de Ansible contiene la lista de estos sistemas. El tutorial proporciona un script inventory.bash para generar el inventario de Ansible a partir de la salida de 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)

Suministrar subredes e instancias de servidor virtual

El directorio vpc-app-deploy/ansible/tf contiene una configuración de Terraform similar a la descrita en la sección anterior, excepto que se ha eliminado la instalación del software. El script Ansible instalará software desde las réplicas y luego cargará software desde la estación de trabajo.

  1. Acceda a la carpeta de scripts Ansible para este ejemplo:
    cd $CHECKOUT_DIR/vpc-app-deploy/ansible/tf
    
  2. Inicialice Terraform:
    terraform init
    
  3. Aplique el plan de Terraform:
    terraform apply
    
  4. Vea la salida generada por el plan:
    terraform output
    
  5. Genere el inventario de Ansible:
    cd .. && ./inventory.bash > inventory
    
  6. Suministre software en el servidor frontal:
    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. Suministre software en el servidor de fondo:
    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
    

Probar la configuración de los servidores virtuales

Ahora que Terraform ha desplegado recursos y que Ansible ha instalado el software, puede validar que se hayan suministrado correctamente.

  1. Valide que la instancia de servidor virtual frontal sea accesible y que tenga acceso de salida a Internet:
    ../test_provision.bash $(cd tf && terraform output -raw FRONT_IP_ADDRESS) INTERNET hi
    
    La salida del mandato debería 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 que se puede acceder al servidor de fondo a través del host bastión y que no tiene acceso a 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)"
    
    La salida del mandato debería 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
    

Eliminación de recursos

  1. Elimine los recursos creados por Terraform:

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

    y

    terraform destroy
    

En función del recurso, es posible que no se suprima de inmediato sino que se retenga (durante 7 días de forma predeterminada). Puede reclamar el recurso suprimiéndolo de forma permanente o lo puede restaurar dentro del periodo de retención. Consulte este documento sobre cómo utilizar una reclamación de recurso.