IBM Cloud Docs
Installation de logiciels sur des instances de serveur virtuel dans VPC

Installation de logiciels sur des instances de serveur virtuel dans VPC

Ce tutoriel peut entraîner des coûts. Utilisez l'Estimateur de coûts pour générer une estimation du coût en fonction de votre utilisation projetée.

Ce tutoriel vous guide dans les opérations de mise à disposition de l'infrastructure IBM Cloud® Virtual Private Cloud (VPC) et l'installation de logiciels sur des instances de serveur virtuel (VSI) à l'aide d'outils d'infrastructure en tant que code (IaC), tels que Terraform et Ansible.

Après une introduction sur l'architecture du tutoriel, vous allez préparer votre environnement pour ce tutoriel et passer en revue les principes de base liés à l'installation de logiciels dans IBM Cloud. À ce stade, vous pouvez décider d'évaluer toutes les technologies ou de passer directement à l'une des sections spécifiques telles que Terraform ou Ansible.

Objectifs

  • Comprendre les logiciels de système d'exploitation fournis par IBM.
  • Utiliser des étapes manuelles pour mettre à jour le logiciel de système d'exploitation et installer de nouveaux logiciels.
  • Comprendre comment utiliser l'interface de ligne de commande IBM Cloud, Terraform et Ansible pour automatiser la mise à disposition des ressources et l'installation des logiciels.

Dans ce tutoriel, vous allez déployer la configuration présentée dans un autre tutoriel, Sous-réseaux publics (front-end) et privés (back-end) dans un cloud privé virtuel. Vous allez mettre à disposition un serveur de front-end accessible depuis l'Internet public en communication avec un serveur de back-end sans connectivité Internet.

Architecture d'un frontend public et d'un backend privé dans un
privé virtuel*Architecture du

La configuration comprend également un hôte bastion faisant office de serveur intermédiaire (jump server) permettant la connexion sécurisée aux instances mises à disposition sans adresse IP publique :

Architecture de l'hôte Bastion
Architecture de l'hôte Bastion

Tout en mettant à disposition des ressources, vous allez également déployer des applications sur les instances de serveur virtuel. Lors du déploiement des applications sur le cloud, les logiciels peuvent provenir de sources différentes :

  1. Système de fichiers d'un poste de travail en local - en utilisant des outils tels que Terraform pour créer l'infrastructure nécessaire ou Ansible, ssh et scp pour installer et configurer des logiciels sur les instances de serveur virtuel ;
  2. Miroirs IBM pour mettre à jour les systèmes d'exploitation ou installer des packages pris en charge ;
  3. Référentiels de logiciels sur Internet ou intranet.

Diagramme d'architecture illustrant les différentes sources d'installation de logiciels à partir de
Diagramme d'architecture illustrant les différentes sources d'installation de logiciels à partir de

Vous allez explorer comment utiliser ces différentes sources.

Avant de commencer

Créez une clé SSH VPC

Lors de la mise à disposition d'instances de serveur virtuel, une clé SSH est injectée dans ces instances pour que vous puissiez vous connecter aux serveurs par la suite.

  1. Si vous ne possédez pas de clé SSH sur votre machine locale, reportez-vous aux instructions de création d'une clé pour VPC. Par défaut, la clé privée se trouve dans $HOME/.ssh/id_rsa.
  2. Ajoutez la clé SSH dans la console VPC sous Calcul / clés SSH. Assurez-vous de créer la clé dans le même groupe de ressources où vous allez créer les autres ressources de ce tutoriel.

Définissez les variables d'environnement

Ce tutoriel est livré avec un exemple de code pour illustrer les différentes options permettant de mettre à disposition des ressources et d'installer ou mettre à jour des logiciels dans un environnement VPC.

Il vous guidera par le biais d'exemples d'étapes à effectuer sur un terminal en utilisant le shell, terraform et ansible. Vous allez installer ces outils dans les étapes ultérieures. Pour que les scripts fonctionnent, vous devez définir un ensemble de variables d'environnement.

  1. Clonez le référentiel de code sourcedu tutoriel:

    git clone https://github.com/IBM-Cloud/vpc-tutorials.git
    
  2. Définissez une variable nommée CHECKOUT_DIR pointant vers le répertoire du code source :

    cd vpc-tutorials
    export CHECKOUT_DIR=$PWD
    
  3. Accédez au répertoire du tutoriel :

    cd $CHECKOUT_DIR/vpc-app-deploy
    
  4. Copiez le fichier de configuration :

    cp export.template export
    
  5. Editez le fichier export et définissez les valeurs des variables d'environnement :

    • TF_VAR_ibmcloud_api_key est une clé d'API IBM Cloud. Vous pouvez en créer une à partir de la console.

    • TF_VAR_ssh_key_name est le nom de la clé publique SSH VPC identifiée à la section précédente. Il s'agit de la clé publique qui sera chargée dans les instances de serveur virtuel pour assurer l'accès SSH sécurisé via la clé privée sur votre poste de travail. Utilisez l'interface de ligne de commande pour vérifier qu'elle existe :

      ibmcloud is keys
      
    • TF_VAR_resource_group_name est un groupe de ressources dans lequel seront créées les ressources. Voir la rubrique sur la création et la gestion des groupes de ressources.

    • TF_VAR_region est une région dans laquelle des ressources seront créées. Cette commande affiche les régions :

      ibmcloud is regions
      
    • TF_VAR_zone est une zone dans laquelle des ressources seront créées. Cette commande affiche les zones :

      ibmcloud is zones
      
    • TF_VAR_ssh_agent indique qu'une clé SSH protégée par une phrase passe est utilisée. Activez la variable en supprimant sa mise en commentaire. Utilisez ensuite ssh-add ~/.ssh/id_rsa pour ajouter la clé SSH à l'agent d'authentification.

  6. Chargez les variables dans l'environnement :

    source export
    

    Veillez à toujours utiliser la même fenêtre de terminal dans les sections suivantes ou à définir les variables d'environnement si vous utilisez une nouvelle fenêtre. Les variables d'environnement dans export sont au format Terraform (remarquez le préfixe TF_VAR_ ) pour plus de commodité. Elles sont utilisées dans les sections qui suivent.

Principes de base liés à l'installation des logiciels

Mise à disposition des instances de serveur virtuel à partir d'images de base

Lorsque vous mettez à disposition une instance de serveur virtuel, vous sélectionnez l'image de base à partir d'un ensemble prédéfini d'images de système d'exploitation fournies par IBM. Utilisez la commande ibmcloud is images pour rechercher la liste des images disponibles.

IBM dispose de miroirs internes pour prendre en charge les images IBM. Ces miroirs contiendront les nouvelles versions des logiciels dans les images fournies par IBM ainsi que dans les packages facultatifs associés à la distribution. Les miroirs font partie des noeuds finaux de service disponibles pour IBM Cloud VPC. Il n'y a pas de frais d'entrée pour la lecture des miroirs.

Envisagez de mettre à jour les listes de versions disponibles dans les instances mises à disposition et de mettre à niveau les logiciels installés à partir de ces miroirs.

Initialisation et personnalisation des instances de cloud avec cloud-init

Lors de l'approvisionnement d'une instance de serveur virtuel, vous pouvez spécifier un script cloud-init à exécuter lors de l'initialisation du serveur. Cloud-init est un package multi-distribution qui traite l'initialisation anticipée d'une instance de cloud. Il définit une collection de formats de fichier pour coder l'initialisation des instances de cloud.

Dans IBM Cloud, le contenu du fichier cloud-init est fourni dans le paramètre user-data au moment de la mise à disposition du serveur. Voir Formats des données utilisateur pour le contenu acceptable des données utilisateur. Si vous avez besoin de déboguer l'exécution du script, cloud-init consigne la sortie du script d'initialisation dans le fichier /var/log/cloud-init-output.log sur les instances de serveur virtuel.

Ce tutoriel utilise un script shell nommé install.sh comme script d'initialisation :

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

Dans ce script, la mise à niveau des logiciels installés et l'installation de nginx et d'autres packages à l'aide des outils d'installation de logiciels fournis par le système d'exploitation, montrent que même les instances isolées ont accès aux miroirs fournis par IBM. Pour Ubuntu, les commandes apt-get permettent d'accéder aux miroirs.

La commande curl utilisée pour accéder à www.python.org montre la tentative d'accès et éventuellement d'installation de logiciels à partir d'Internet.

Selon que l'hôte dispose ou non d'une connectivité Internet, le script modifie la page index.html diffusée par nginx.

Téléchargement à partir du système de fichiers et exécution sur l'instance

Il se peut que des données et des logiciels soient disponibles sur le système de fichiers de votre système local ou qu'un pipeline CI/CD doive être téléchargé sur l'instance de serveur virtuel avant d'être exécuté.

Dans ce cas, vous pouvez utiliser la connexion SSH au serveur pour télécharger les fichiers avec scp, puis exécuter des scripts sur le serveur avec ssh. Les scripts peuvent également récupérer les programmes d'installation de logiciels sur Internet ou sur vos systèmes locaux, en supposant que vous ayez établi une connexion de type VPN entre vos systèmes locaux et le cloud.

Le code du tutoriel contient un script nommé uploaded.sh qui sera téléchargé depuis votre poste de travail vers les instances de serveur virtuel (manuellement ou par le biais d'une automatisation comme Terraform et Ansible ).

Dans les sections suivantes, vous utiliserez le script test_provision.bash pour confirmer que les serveurs ont été correctement approvisionnés, qu'ils peuvent (ou non) accéder à Internet et que le script uploaded.sh a été correctement exécuté.

Utilisation de l'interface de ligne de commande IBM Cloud et de scripts shell

L'''interface de ligne de commande IBM Cloud fournit des commandes permettant d'interagir avec toutes les ressources que vous pouvez créer dans IBM Cloud. Cette section explique comment utiliser ces commandes, mais vous n'allez pas créer de ressources. Il est recommandé d'utiliser Terraform pour déployer des solutions complètes.

Avant de commencer

Installez les outils de l'interface de ligne de commande en suivant cette procédure

Mise à disposition d'instances de serveur virtuel et installation de logiciels

L'interface de ligne de commande dispose d'un plug-in pour toutes les fonctionnalités liées à VPC, y compris les ressources de calcul et de réseau.

  1. Avant d'utiliser des ressources VPC, définissez le groupe de ressources et la région en cours:

    ibmcloud target -g $TF_VAR_resource_group_name -r $TF_VAR_region
    
  2. Pour mettre à disposition une instance de serveur virtuel, exécutez la commande d'interface de ligne de commande ibmcloud is instance-create. Dans shared/install.sh se trouve le fichier cloud-init utilisé pour initialiser les serveurs frontaux et dorsaux. Vous pouvez transmettre le script avec le paramètre --user-data comme suit:

    ibmcloud is instance-create ... --user-data @shared/install.sh
    
  3. Avec les instances de serveur virtuel de front-end et de back-end déployées et en mode maintenance, vous pouvez envoyer un script à, par exemple, le serveur de front-end, puis exécuter le script pour installer le logiciel à partir d'Internet. Envoyez un script au serveur de front-end :

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

    Exécutez ensuite ce script :

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

    L'initialisation du service ssh sur le serveur peut prendre quelques minutes, et quelques minutes supplémentaires seront nécessaires pour que le script d' cloud-init s soit terminé. Le script uploaded.sh attend la fin de l'initialisation avant de quitter.

Mise à disposition de l'infrastructure avec Terraform

Terraform vous permet de créer, modifier et améliorer les infrastructures de manière sûre et prévisible. Il s'agit d'un outil open source qui codifie les API dans des fichiers de configuration déclaratifs pouvant être partagés par les membres de l'équipe, traités comme du code, modifiés, revus et corrigés.

Avant de commencer

Suivez les instructions pour installer Terraform et le plug-in IBM Cloud le plug-in Provider pour Terraform sur votre poste de travail.

Mise à disposition d'une instance de serveur virtuel unique

Avant de déployer une architecture plus complexe et afin de vérifier l'installation du fournisseur Terraform, commencez par déployer une seule instance de serveur virtuel avec une adresse IP flottante, puis accédez à ce serveur via SSH.

Vérifiez le main.tf fichier pour un script terraform. Il utilise les variables d'environnement définies auparavant.

  1. Accédez au dossier du script Terraform pour cet exemple :

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

    terraform init
    
  3. Appliquez le plan Terraform :

    terraform apply
    

    Le script crée un cloud privé virtuel (VPC), une instance de serveur virtuel (VSI) et active l'accès SSH.

  4. Examinez la sortie générée par le plan :

    terraform output
    
  5. Vous pouvez effectuer un copier-coller de la sortie de la commande précédente ou utiliser la commande terraform output comme suit pour vous connecter à l'instance de serveur virtuel via SSH :

    $(terraform output -raw sshcommand)
    

    L'utilisation des sorties dans Terraform peut s'avérer utile lorsque vous souhaitez réutiliser les propriétés des ressources dans d'autres scripts après avoir appliqué un plan Terraform.

  6. Supprimez les ressources créées par Terraform :

    terraform destroy
    

Mise à disposition de sous-réseaux et d'instances de serveur virtuel

L'ensemble de fichiers Terraform sous le dossier vpc-app-deploy/tf du référentiel vpc-tutorials implémente l'architecture du tutoriel Public frontal et backend privé dans un nuage privé virtuel .

Le script vpc-app-deploy/tf/main.tf contient la définition des ressources. cela importe un module Terraform partagé avec cet autre tutoriel :

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

Dans cette définition :

  • backend_pgw contrôle si le serveur de back-end a accès à l'Internet public. Une passerelle publique peut être connectée au sous-réseau de back-end. Le sous-réseau de front-end dispose d'une adresse IP qui fournit à la fois une adresse IP publique et une passerelle pour l'accès Internet. Cela va permettre l'accès Internet pour l'installation des logiciels. Le sous-réseau de back-end n'aura pas accès à Internet.
  • frontend_user_data et backend_user_data pointent vers les scripts d'initialisation cloud-init.

Avec Terraform, toutes les ressources peuvent avoir des services de mise à disposition associés. Le service de mise à disposition (provisioner) null_resource ne fournit pas de ressource de cloud mais peut être utilisé pour copier des fichiers sur des instances de serveur. Cette construction est utilisée dans le script pour copier le uploaded.sh fichier puis de l'exécuter comme indiqué ci-dessous. Pour se connecter aux serveurs, Terraform prend en charge l'utilisation de l'hôte bastion tel que prévu dans le tutoriel :

   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}",
        ]
     }
   }

Pour mettre les ressources à disposition :

  1. Accédez au dossier de script Terraform :
    cd $CHECKOUT_DIR/vpc-app-deploy/tf
    
  2. Initialisez Terraform :
    terraform init
    
  3. Appliquez le plan Terraform :
    terraform apply
    
  4. Examinez la sortie générée par le plan :
    terraform output
    

Test de la configuration des serveurs virtuels

Terraform disposant maintenant de ressources déployées, vous pouvez vérifier qu'elles ont été mises à disposition correctement.

  1. Vérifiez que l'instance de serveur virtuel de front-end est accessible et dispose d'un accès sortant sur Internet :
    ../test_provision.bash $(terraform output -raw FRONT_IP_ADDRESS) INTERNET hi
    
    Le résultat de la commande doit être :
    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. Vérifiez que le serveur de back-end est accessible via l'hôte bastion et n'a pas accès à 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)"
    
    Le résultat de la commande doit être :
    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
    

Suppression de ressources

  1. Supprimez les ressources créées par Terraform :
    terraform destroy
    

Installation de logiciels avec Ansible

Ansible est un outil de gestion de la configuration et de provisionnement, similaire à Chef et Puppet, et est conçu pour automatiser les déploiements d'applications à plusieurs niveaux et le provisionnement dans le cloud. Développé en Python, Ansible utilise la syntaxe YAML pour décrire les tâches d'automatisation, ce qui facilite son apprentissage et son utilisation.

Bien qu'Ansible soit utilisable pour la mise à disposition de ressources VPC et l'installation de logiciels, cette section utilise Terraform pour mettre à disposition des ressources VPC et Ansible pour déployer les logiciels.

Avant de commencer

Cette section utilise à la fois Terraform et Ansible.

  1. Suivez les instructions pour installer Terraform et le plug-in IBM Cloud le plug-in Provider pour Terraform sur votre poste de travail.
  2. Suivez ces instructions pour installer Ansible.

Playbook Ansible

Un playbook Ansible fournit les tâches à exécuter. L'exemple ci-dessous comporte un ensemble de tâches requises pour installer NGINX et télécharger un script. Vous pourrez observer les similitudes avec le script cloud-init décrit précédemment. Le script uploaded.sh est identique.

- 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

Inventaire Ansible

Ansible s'applique à plusieurs systèmes de votre infrastructure simultanément. L'inventaire Ansible contient la liste de ces systèmes. Le didacticiel fournit un script inventory.bash pour générer l'inventaire d' Ansible s à partir de la sortie 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)

Mise à disposition de sous-réseaux et d'instances de serveur virtuel

L'annuaire vpc-app-deploy/ansible/tf contient une configuration Terraform similaire à celle décrite dans la section précédente, à l'exception de l'installation du logiciel qui a été supprimée. Le script Ansible installera les logiciels à partir de miroirs et téléchargera ensuite les logiciels depuis votre poste de travail.

  1. Accédez au dossier de script Ansible pour cet exemple :
    cd $CHECKOUT_DIR/vpc-app-deploy/ansible/tf
    
  2. Initialisez Terraform :
    terraform init
    
  3. Appliquez le plan Terraform :
    terraform apply
    
  4. Examinez la sortie générée par le plan :
    terraform output
    
  5. Générez l'inventaire Ansible :
    cd .. && ./inventory.bash > inventory
    
  6. Mettez à disposition les logiciels sur le serveur 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. Mettez à disposition les logiciels sur le serveur 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
    

Test de la configuration des serveurs virtuels

Terraform ayant déployé des ressources et Ansible ayant installé les logiciels, vous pouvez vérifier que leur mise à disposition est correcte.

  1. Vérifiez que l'instance de serveur virtuel de front-end est accessible et dispose d'un accès sortant sur Internet :
    ../test_provision.bash $(cd tf && terraform output -raw FRONT_IP_ADDRESS) INTERNET hi
    
    Le résultat de la commande doit être :
    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. Vérifiez que le serveur de back-end est accessible via l'hôte bastion et n'a pas accès à 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)"
    
    Le résultat de la commande doit être :
    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
    

Suppression de ressources

  1. Supprimez les ressources créées par Terraform :

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

    and

    terraform destroy
    

En fonction de la ressource, le service peut ne pas être supprimé immédiatement mais conservé un certain temps (7 jours par défaut). Pour récupérer la ressource, vous pouvez la supprimer de manière définitive ou la restaurer pendant la période de conservation. Pour savoir comment utiliser la récupération de ressources, consultez ce document.