Comment utiliser l’API pour déployer des Droplets à partir d’un instantané principal

introduction

Dans ce didacticiel, nous allons créer une image d’instantané maître avec notre logiciel et notre configuration, puis utiliser l’API DigitalOcean pour automatiser le déploiement de gouttelettes à l’aide de cette image. Les exemples de ce didacticiel utiliseront le client d’API DigitalOcean officiel pour Ruby DropletKit.

Conditions préalables

  • Ruby doit être installé sur l’ordinateur que vous utiliserez pour vous connecter à l’API.

  • La gem DropletKit doit également être installée dans cet environnement.

  • Vous devriez avoir generated un jeton d’API pour que vos scripts puissent être utilisés.

Première étape: créer votre image principale

Dans ce tutoriel, nous allons créer une image principale basée sur la LAMP One-Click Image, configurer notre configuration par défaut, puis l’utiliser pour créer une image instantanée. Les instantanés coûtent 0,05 USD par gigaoctet par mois, en fonction de la quantité d’espace utilisé dans le système de fichiers. Nous pourrons déployer plusieurs instances de notre pile LAMP personnalisée à l’aide de l’API DigitalOcean.

Créer un nouveau droplet

Nous allons commencer par créer un nouveau droplet nommé + lamp-master + à partir du panneau de commande en sélectionnant l’image LAMP dans l’onglet Applications. Cette image nous fournira un serveur pré-construit Ubuntu 14.04 avec Apache, MySQL et PHP.

Lors de la création du droplet que nous allons utiliser pour générer notre image d’instantané principal, il est important de sélectionner le plus petit plan de droplet possible. Une fois que nous avons créé notre instantané, il ne peut être utilisé que pour créer des gouttelettes sur le même plan ou sur un plan plus grand. Par exemple, si nous créons notre instantané principal à l’aide d’un droplet de 1 Go, nous pourrions l’utiliser pour lancer des gouttelettes sur des plans de 1 Go, 2 Go ou d’autres plans plus grands, mais nous ne pourrions pas lancer de gouttelette contenant 512 Mo de RAM à partir de cet instantané.

Une fois notre nouveau droplet créé, utilisez un client SSH pour vous y connecter.

Configuration initiale

Maintenant que nous sommes connectés à notre nouveau droplet, nous pouvons configurer tous les paramètres ou installer les packages que nous souhaitons avoir sur tous les droplets déployés à partir de notre image principale. Dans ce cas, nous installerons deux modules php supplémentaires; curl et Imagemagick.

sudo apt-get update
sudo apt-get install php5-curl php5-imagick

Création de l’instantané

Maintenant que nous avons ajouté le logiciel supplémentaire que nous souhaitons, nous pouvons éteindre notre gouttelette et créer notre instantané. Bien qu’il soit possible de prendre un instantané d’un système en cours d’exécution, sa mise hors tension garantit que le système de fichiers est dans un état cohérent:

sudo poweroff

Bien que nous puissions créer notre instantané à partir du panneau de configuration, nous utiliserons désormais l’API à partir de maintenant pour utiliser notre compte DigitalOcean. Ces exemples peuvent être exécutés avec Ruby interactif (+ irb +) ou ajoutés à un script et exécutés avec la commande + ruby ​​+. La première étape consistera à inclure le client DropletKit.

require 'droplet_kit'
token=''
client = DropletKit::Client.new(access_token: token)

Afin de créer un instantané à partir de l’API, nous devrons obtenir l’ID de notre droplet principal. Nous pouvons le faire en appelant le noeud final des gouttelettes de l’API.

droplets = client.droplets.all
droplets.each do |droplet|
 if droplet.name == "lamp-master"
   puts droplet.id
 end
end

Cet extrait de code appelle le point de terminaison des gouttelettes de l’API et parcourt les gouttelettes de notre compte à la recherche du nom + lamp-master +. Lorsqu’il le trouvera, le script affichera alors le numéro d’identification de ce droplet.

Maintenant que nous avons notre numéro d’identification de droplet, nous pouvons demander à l’API de créer un instantané de ce droplet en transmettant l’ID de droplet à l’action d’instantané du noeud final du droplet. En plus de l’ID de la gouttelette, nous allons également transmettre un nom d’instantané qui sera utilisé pour notre nouvelle image. Dans ce cas, nous avons décidé de nommer notre instantané + lamp-image +.

client.droplet_actions.snapshot(droplet_id: '', name: 'lamp-image')

La demande d’instantané que nous avons faite renverra un numéro d’identification d’événement pouvant être utilisé pour suivre l’état du processus d’instantané. Ce tutoriel fournira plus d’informations sur l’utilisation des identifiants d’événement.

Deuxième étape: Déploiement de gouttelettes à partir de notre instantané

Nous avons maintenant créé une image d’instantané maître que nous pouvons utiliser pour déployer des droplets avec notre configuration. Comme nous l’avons fait avec notre droplet, nous devrons maintenant interroger l’API pour obtenir l’ID d’image de notre nouvel instantané.

images = client.images.all(public:false)
images.each do |image|
 if image.name == "lamp-image"
   puts image.id
 end
end

Comme avec notre exemple d’identification de gouttelette ci-dessus, ce code parcourt en boucle les images d’instantané et de sauvegarde de notre compte et affiche l’ID de l’image nommée + lamp-image +.

Maintenant que nous avons le numéro d’identification de notre image, nous pouvons commencer à déployer des droplets. Le code suivant créera un nouveau droplet de 2 Go utilisant notre instantané principal dans la région de New York 3.

Notez que notre image instantanée doit être présente dans la région spécifiée pour la création de nos gouttelettes. Vous pouvez transférer une image vers d’autres régions via le panneau de configuration ou via l’API https://developers.digitalocean.com/documentation/v2/#transfer-an-imageimage image].

droplet = DropletKit::Droplet.new(name: 'my-lamp-server', region: 'nyc3', size: '2gb', image: '')
client.droplets.create(droplet)

Troisième étape: Personnalisation avec les données utilisateur

Nous pouvons maintenant déployer de nouvelles gouttelettes avec notre configuration personnalisée à l’aide de l’API, mais nous souhaitons peut-être personnaliser davantage nos nouvelles gouttelettes individuellement. Nous pouvons effectuer une personnalisation supplémentaire en envoyant des données utilisateur à nos droplets lors de leur création.

Pour cet exemple, nous pré-chargerons un fichier index.html personnalisé sur notre nouveau droplet, y compris son nom.

sitename = "example.org"
userdata = "
#cloud-config

runcmd:
- echo '<html><head><title>Welcome to #{sitename} </title></head><body><h1>This is #{sitename}</h1></body></html>' > /var/www/html/index.html
"
droplet = DropletKit::Droplet.new(name: sitename, region: 'nyc3', size: '2gb', image: '', user_data: userdata)
client.droplets.create(droplet)

Dans cet exemple, nous utilisons simplement la commande + echo + dans notre nouveau droplet pour déposer du code HTML dans un fichier index.html à la racine Web. En utilisant d’autres commandes, vous pouvez choisir de configurer de nouveaux hôtes virtuels directement sur votre droplet, d’extraire les détails de configuration supplémentaires d’un serveur distant ou de faire à peu près tout ce que vous pourriez faire via une connexion SSH. Vous pouvez en savoir plus sur les données utilisateur ici.

Quatrième étape: le mettre ensemble

Maintenant que nous pouvons déployer des droplets basés sur notre image instantanée via l’API et personnaliser leur contenu, allons encore plus loin et créons un script interactif pour lancer de nouveaux droplets basés sur notre image. Le script suivant suppose que nous avons déjà créé notre image instantanée et que nous avons son ID disponible.

require 'droplet_kit'
token=''
client = DropletKit::Client.new(access_token: token)
region = 'nyc3'
image_id = ''
droplet_size = '2gb'

puts "Enter a name for your new droplet:"
sitename = gets.chomp

userdata = "
#cloud-config

runcmd:
- echo '<html><head><title>Welcome to #{sitename} </title></head><body><h1>This is #{sitename}</h1></body></html>' > /var/www/html/index.html
"
sitename.gsub!(/\s/,'-')
droplet = DropletKit::Droplet.new(name: sitename, region: region, size: droplet_size, image: image_id, user_data: userdata)
client.droplets.create(droplet)

Répartition du code

Ce script inclut d’abord le client DropletKit et initialise une nouvelle connexion client à l’aide du jeton d’API fourni.

require 'droplet_kit'
token=''
client = DropletKit::Client.new(access_token: token)

Nous spécifions ensuite quelques options pour notre gouttelette, notamment la région, la taille de la gouttelette et l’ID de notre image d’instantané principal.

region = 'nyc3'
image_id = ''
droplet_size = '2gb'

Nous invitons ensuite l’utilisateur à donner un nom au nouveau droplet et à inclure ces informations dans les données utilisateur fournies par notre script au processus de création.

puts "Enter a name for your new droplet:"
sitename = gets.chomp

userdata = "
#cloud-config

runcmd:
- echo '<html><head><title>Welcome to #{sitename} </title></head><body><h1>This is #{sitename}</h1></body></html>' > /var/www/html/index.html
"

Une fois que nous avons inclus le nom de notre site dans notre page index.html, nous devons l’assainir pour nous assurer qu’il peut être utilisé comme nom de gouttelette. Étant donné que les noms de gouttelettes ne peuvent pas contenir d’espaces, nous les remplacerons par des tirets.

sitename.gsub!(/\s/,'-')

Ensuite, nous rassemblons toutes ces variables et soumettons notre demande de création du nouveau droplet.

droplet = DropletKit::Droplet.new(name: sitename, region: region, size: droplet_size, image: image_id, user_data: userdata)
client.droplets.create(droplet)

Prochaines étapes

En utilisant l’API, nous pouvons créer des droplets personnalisés à la demande et inclure nos propres paramètres ou fichiers lors de la création. Vous pouvez choisir de développer ces bases en ajoutant des fonctionnalités supplémentaires à ce script. Les améliorations possibles incluent.

  • Utilisation du point de terminaison DNS de l’API pour configurer automatiquement les enregistrements DNS de vos nouveaux droplets lorsqu’ils sont lancés.

  • Demander à l’utilisateur des entrées supplémentaires telles que la taille de la région ou des gouttelettes.

  • Utiliser des appels utilisateur runcmd pour télécharger du contenu Web dans vos nouvelles droplets ou pour remplir des bases de données MySQL.