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.
Cet article a-t-il répondu à vos questions ?
Annuler
Merci !