Articles sur : Développement

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 JSON
bash 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 interne

Création de nos serveurs


Nous allons maintenant faire une belle boucle pour créer 5 serveurs avec la configuration souhaitée.

Vérifiez bien d'avoir un quota suffisant avant de lancer vos créations, sinon vous obtiendrez des erreurs. Les quotas par défaut sur Nua.ge sont plutôt bas, vous devez faire une demande via le support pour les augmenter.

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

Cet article a-t-il répondu à vos questions ?

Partagez vos commentaires

Annuler

Merci !