Aperçu des possibilités d'automatisation avec l'API Nua.ge
Cet article vous guidera pour vous montrer quelques possibilités d'automatisation avec l'API Nua.ge.
Avant de commencer ...
Nous vous conseillons grandement :
- de lire le tutorial de pas à pas avec l'API
- de parcourir la spec technique complète, disponible ici : https://api.nua.ge/docs/
Outils nécessaires
Cet article vous demandera :
curl
, un client HTTP (installé de base sur MAC et Linux).jq
, un outil de manipulation de JSONbash
ainsi que des compétences de base dans ce langage.
Objectif de cet article
- Découvrir et manipuler
jq
- Aborder quelques concepts de l'API Nua.ge
- Démarrer 5 nouvelles instances en quelques secondes ...
- Eteindre et rallumer toutes les instances d'un projet
Connexion au service
Comme nous l'avons vu précédemment, nous devons obtenir un token JWT afin de faire tous nos appels au service. Cette fois nous allons utiliser jq afin de récupérer directement le token dans une variable d'environnement :
export TOKEN=$(curl -s -XPOST https://api.nua.ge/arya/auth -H "Content-Type: application/json" -d '{"name": "test@example.com", "password": "Sup3rP4assw0rd", "organization": "acmecorp"}' |jq -r .token)
Récupération d'une image
Nous voulons maintenant récupérer l'ID de la dernière image Ubuntu disponible :
IMAGE=$(curl -s -g -H "Accept: application/json" 'https://api.nua.ge/rockefeller/images?osName=ubuntu&order[createdAt]=desc' |jq -r '.[0].id')
Ici, nous avons filtré sur le nom de l'OS, demandé à avoir les enregistrements par date de création inversée, et avec jq
nous avons récupéré l'ID du premier élément.
Récupération d'une flavor
Nous voulons récupérer une flavor avec 2 coeurs, 4Go de RAM et 100Go de disque :
FLAVOR=$(curl -s -g -H "Accept: application/json" 'https://api.nua.ge/rockefeller/flavors?core=2&ram=4&disk=100' |jq -r '.[0].id')
Récupération de notre keypair
Si notre keypair a bien été créé au préalable, il nous faut son ID:
KEYPAIR=$(curl -s -g 'https://api.nua.ge/arya/keypairs?isDefault=true' -H "Content-Type: application/json" -H "Accept: application/json" -H "Authorization: Bearer $TOKEN" |jq -r '.[] | select(.isDefault == true).id')
Ici nous avons voulu montrer comment, avec jq, récupérer la clé par défaut même quand plusieurs clés sont retournées.
Récupération de notre projet
Nous avons au préalable créer notre projet qui s'appelle "runner". On récupère donc son ID:
PROJECT=$(curl -s -g 'https://api.nua.ge/arya/projects?description=runner' -H "Content-Type: application/json" -H "Accept: application/json" -H "Authorization: Bearer $TOKEN" |jq -r '.[0].id')Attention de bien utiliser le champ
description
et non name
: le premier est le nom que vous avez donné au projet, alors que name
est un nom interneCréation de nos serveurs
Nous allons maintenant faire une belle boucle pour créer 5 serveurs avec la configuration souhaitée.
for server in $(seq 1 5); do
echo "Creation du serveur #$server ..."
curl -s -XPOST https://api.nua.ge/rockefeller/servers -H "Content-Type: application/json" -H "Accept: application/json" \
-H "Authorization: Bearer $TOKEN" -d '{"name":"runner-$server", "keypair": "/arya/keypairs/$KEYPAIR",
"project": "$PROJECT", "image": "/rockefeller/images/$IMAGE", "flavor": "/rockefeller/flavors/$FLAVOR"}' | jq -r '.id'
done
Attendons quelques secondes et récupérons l'état de nos serveurs :
curl -s -g 'https://api.nua.ge/rockefeller/servers?project=$PROJECT' -H "Content-Type: application/json" -H "Accept: application/json" -H "Authorization: Bearer $TOKEN" |jq -r '.[].state'
Ici nous avons récupéré tous les serveurs dans notre projet, puis affiché seulement le champ "state" pour chacun. Si nous avons du "on" de partout, c'est gagné !
Eteindre tous les serveurs d'un coup
Une fois encore, curl
et jq
vont faire le travail à notre place.
for server in $(curl -s -g 'https://api.nua.ge/rockefeller/servers?project=$PROJECT' -H "Content-Type: application/json" -H "Accept: application/json" -H "Authorization: Bearer $TOKEN" |jq -r '.[].id'); do
echo "Extinction du serveur #$server ..."
curl -s -g -XPATCH 'https://api.nua.ge/rockefeller/servers/$server' -H 'Content-Type: application/merge-patch+json' \
-H 'Accept: application/json' -d '{"status":"off"}' -H "Authorization: Bearer $TOKEN" | jq -r '.status'
done
Vous remarquerez l'usage d'un nouveau content-type, application/merge-patch+json
. Il s'agit d'un format particulier utilisé ici pour décrire une modification de notre objet de départ. En l'occurrence, nous avons changé son attribut status
pour le passer à off.
Quelques pistes pour améliorer notre script
- vous devez modifier votre script pour appliquer un ou plusieurs securityGroup, correspondant à la sécurité que vous voulez sur vos instances.
- il serait de bon ton de rajouter du contrôle d'erreur sur tous vos appels Aidez-vous du code retour de
curl
.
Mis à jour le : 20/12/2021
Merci !