Dans le cadre de mes activités professionnelles, j'ai développé un petit outil pour instancier très rapidement des machines virtuelles. Vu que je connais un peu Ansible et que je voulais un peu monter en compétence sur un environnement d'Openstack, je me suis lancé dans ce projet avec pour prérequis ces deux briques techniques.
Comme dis précédemment, j'ai fais un peu d'Ansible, loin d'être un maitre en la matière, je me suis fais assisté par un outil: **ChatGPT**. Pour rendre ChatGPT un peu plus pertinent, il faut le "conditionner", c'est a dire utiliser un prompt d'introduction qui rendra les résultats suivants plus intéressants :
Tu es un expert Ansible, Linux et Openstack.
Génère moi un playbook pour instancier des machines virtuelles sur une plateforme Openstack.
Et notre playbook se génère sans problème et parait cohérent, sauf que ChatGPT fait du code crédible, pas obligatoirement fonctionnel
---
- name: Créer des machines virtuelles OpenStack
hosts: localhost
gather_facts: false
become: yes
vars:
openstack_auth_url: "http://<OPENSTACK_AUTH_URL>/v3"
openstack_project_name: "<PROJECT_NAME>"
openstack_username: "<USERNAME>"
openstack_password: "<PASSWORD>"
openstack_domain_name: "Default"
flavor_name: "m1.small"
image_name: "ubuntu18.04"
network_name: "private"
keypair_name: "<KEYPAIR_NAME>"
security_group_name: "<SECURITY_GROUP_NAME>"
instance_count: 2
instance_name_prefix: "vm-"
tasks:
- name: Source OpenStack credentials
os_auth:
cloud: "<CLOUD_NAME>"
auth:
auth_url: "{{ openstack_auth_url }}"
username: "{{ openstack_username }}"
password: "{{ openstack_password }}"
project_name: "{{ openstack_project_name }}"
domain_name: "{{ openstack_domain_name }}"
register: os_auth_result
- name: Create security group
os_security_group:
cloud: "<CLOUD_NAME>"
state: present
name: "{{ security_group_name }}"
description: "Security group for VM instances"
register: os_sg_result
- name: Create instances
os_server:
cloud: "<CLOUD_NAME>"
state: present
name: "{{ instance_name_prefix }}{{ item }}"
flavor: "{{ flavor_name }}"
image: "{{ image_name }}"
network: "{{ network_name }}"
key_name: "{{ keypair_name }}"
security_groups: "{{ security_group_name }}"
wait: yes
loop: "{{ range(instance_count|int) | list }}"
when: os_auth_result.success
De nombreuses erreurs sont présentes et j'abrège les explications de comment obtenir un playbook fonctionnel. Pour résumer, cela passera par reprendre la documentation Ansible et en particulier celui du module Openstack et suivre la documentation du provider (dans notre cas, OVH).
Néanmoins, ChatGPT permet d'avoir rapidement un premier jet, que l'on pourra réitérer par la suite.
L'objectif premier était de pouvoir instancier des machines virtuelles avec Ansible. La première ébauche du playbook fonctionnel ressemble à ceci:
deploy.yml
---
- hosts: localhost
connection: local
gather_facts: false
remote_user: almalinux
tasks:
- name: "Deploy instances on OpenStack"
openstack.cloud.server:
cloud: openstack
state: present
name: "{{ item }}"
flavor: s1-2
image: "AlmaLinux 9"
key_name: bebop-v4
auto_ip: false
network: Ext-Net
security_groups: default
wait: true
inventory.yml
all:
children:
hosts:
lab-1:
#ansible_host:
lab-2:
#ansible_host:
lab-3:
#ansible_host:
lab-4:
#ansible_host:
Par la suite, le playbook peut déployer différentes configurations de VM: avec un espace de stockage supplémentaire, une interface réseau privée, ...
Comme c'est un projet encore en cours de travail, je ferai d'autres articles sur le sujet.
En attendant, vous pouvez regarder directement dans Github pour voir l'avancement du projet.