Aria Automation/vRealize Automation : intégrer un pipeline dans un Cloud Template, exemple avec Ansible.

Aria Automation permet d’intégrer Ansible (Ansible Automation Platform – nouveau nom de Ansible Tower - et aussi AWX) et donc de créer des Cloud Templates qui disposent de non seulement la partie fournie en standard par Aria Automation pour la création de VMs mais aussi de leur contenu via Ansible.

Mais que se passe-t-il quand il s’agit d’effectuer des opérations qui n’ont pas pour emplacement d’exécution la machine provisionnée ? J’entends par là les exemples classiques comme l’intégration de la VM au DNS, à la supervision, à la CMDB, au backup et tout un lot d’outils périphériques qui doivent prendre connaissance de cette nouvelle VM. Les exécutions de ces scripts se faisant depuis une machine centralisée (la plupart du temps la machine Ansible elle-même) et non la VM provisionnée.

Prenons l’exemple du DNS dans une infrastructure avec AWX : c’est la machine Ansible qui va discuter avec le DNS de manière centralisée pour ajouter cette nouvelle VM. Or dans le Cloud Template, je ne peux pas ajouter le nœud Ansible (car sinon Aria Automation va considérer qu’il faut le provisionner et donc faire un rip and replace… oups). De même dans Aria Automation, quand je sélectionne un objet Ansible je dois l’attribuer à une machine qui va donc exécuter le Template Ansible, ce que je ne veux pas puisqu’il doit être exécuter depuis la machine Ansible. Comment faire ?

La réponse est simple : on ne peut pas le faire en standard dans le Canvas du Cloud Template (sauf développement très compliqué en Aria Automation Orchestrator, inmaintenable et illisible). Il y a pourtant un moyen très simple que je vais vous expliquer.

Pour cela, nous allons tout d’abord utiliser le composant Aria Automation Pipelines que nous allons intégrer au Cloud Template par la suite.

Pour avoir une présentation plus détaillée de Aria Automation Pipelines, je vous encourage à aller voir : https://docs.vmware.com/en/VMware-Aria-Automation/8.16/Using-Automation-Pipelines/GUID-3625AE99-C60C-4517-803B-18C526ADCFF1.html

Hypothèses de départ :

Nous disposons d’un AWX configuré comme il faut et un template « HelloWorld » qui pointe sur un helloworld2.yml tout simple qui affiche juste une variable afin d’expliquer aussi comment passer les variables (histoire de répondre à toutes les problématiques qui vont se poser).

Note importante : pour que Aria Automation Pipelines puisse modifier les extra_vars, il faut activer l’option « prompt on launch » sur ces paramètres, sinon il ne pourra pas les remplacer (car c’est un appel externe/API).

Ansible est joignable et intégré dans Aria Automation comme il faut.

Phase 1, les secrets dans Aria Automation Pipelines :

On va déjà stocker nos credentials à part dans Aria Automation Pipelines pour faire plus propre en utilisant la partie « secrets », pour cela, allez dans « Configure -> Variables » et créez une variable de type secret avec le token AWX.


Note :  penser à être sur le même project dans tous les objets qui vont être créés : les secrets, le pipeline et le cloud template, sinon il y aura une erreur lors de l’exécution du cloud template qui ne trouvera pas la resource pipeline (même si l’id de ce dernier est le bon, merci notre bon vieux RBAC).

Phase 2, le pipeline :

Toutes les étapes sont des étapes de type REST, je ne vous décrie pas comment créer un pipeline, ajouter une étape et un stage, il y a pléthores de sites pour cela (comme par exemple : https://docs.vmware.com/en/VMware-Aria-Automation/8.16/Using-Automation-Pipelines/GUID-CA20A21C-DE2A-4D3E-B80E-C1961C0D81BC.html  ).

La première chose que l’on va faire c’est créer une variable de type input (pour pouvoir passer le nom de notre machine en paramètre (extra_vars) au job Ansible.


Puis on va créer les étapes.

Etape 1 : on va commencer par déclencher un inventaire

Le plus important ici est l’appel REST qui doit comprendre le Bearer token pour se connecter à Ansible (token qui est stocké dans les secrets de Aria Automation Pipelines).

URL : https://awx.domain.local/api/v2/inventories?search=Demo+Inventory

Etape 2 : on va chercher l’id de notre job Ansible

URL : https://awx.domain.local/api/v2/job_templates?name=helloworld

On a récupéré l’id en output de l’étape précédente (Get Job Id By Name) pour le mettre dans la commande POST pour lance le template.

URL : https://awx.domain.local/api/v2/job_templates/${Stage0.Get Job Id by Name.output.responseJson.results[0].id}/launch/

Notez le payload :

{

  "inventory": 1,

  "limit":"localhost",

  "extra_vars": {

    "machine_name": “${input.machine_name}”

  }

}

c’est ici qu’on ajoute les extra_vars à passer au job Ansible (notamment pour donner le nom de la machine à passer à l’AD ou au DNS), je récupère ma variable d’entrée du Pipeline au passage.

Etape 3 : il faut s’assurer que le travail est bien fait, donc on va attendre le retour du job

URL : https://awx.domain.local/api/v2/jobs/${Stage0.Launch Template.output.responseJson.id}

Le plus important sont les critères de sortie :

Phase 3 : local test et validation

Après avoir validé le pipeline (et testé puisqu’il peut être lancé directement depuis Aria Automation Pipeline ou Aria Automation Service Broker), on récupère son id (on peut le faire par l’API, mais il est plus simple de regarder dans l’url 😊)

Note : On pourrait aussi s’arrêter là et mettre le pipeline au catalogue pour s’en servir directement. Le but ici est d’aller plus loin pour profiter des fonctionnalités avancées des Cloud Template.


Phase 4 : création du Cloud Template dans Aria Automation Assembler

Ici, pas d’objet à déplacer dans le canvas car il n’existe pas, on va utiliser l’Infrastructure as Code directement :

formatVersion: 1

inputs:
  Name:
    type: string
    title: Nom de la machine
resources:
  pipeline.test:
    type: codestream.execution
    properties:
      pipelineId: e1e42015-bc6d-4f99-b5e2-73d1f0b9f4f4
      inputs:
        machine_name: ${input.Name}
      outputs:
       
computed: true

J’ai volontairement laissé une partie input afin de montrer que l’on va pouvoir passer des paramètres aux entrées du pipeline (et donc du template Ansible) si besoin, comme le nom de la machine.

Dans un Cloud Template plus élaboré, on mettra une ou plusieurs machines dans le Canvas et on passera les noms ou IP déployées au pipeline.

On peut maintenant lancer le déploiement.

Résultat :

J’ai bien une resource de type pipeline créée dans mon déploiement avec toutes les informations (input, output).

Dans Aria Automation Pipelines, je constate bien l’exécution de mon pipeline (de même, un tag a été automatiquement ajouté pour préciser qu’il a été lancé via le "catalog").

Et dans AWX, je vois bien l'exécution de mon job avec le passage de variable provenant de mon Cloud Template :


Conclusion :

Vous pouvez maintenant intégrer tout type de Pipelines provenant de Aria Automation Pipelines (pas que du Ansible en fait) dans un Cloud Template en bénéficiant des inputs et autres notions disponibles pour les appeler et faire un Cloud Template qui est complet.

Et voilà, à vous de jouer maintenant !

Commentaires