**S’il est bien un outil qui est indispensable dans une démarche Devops c’est bien
le gestionnaire de dépôts. C’est dans cet outil qu’on va stocker les artefacts,
les paquets et les métadonnées produites par les pipelines CI/CD.
J’ai fait le choix d’installer Nexus dans mon Home Lab
Devops pour les raisons suivantes :
Nexus offre dans sa version opensource la gestion de toute une série
de repositories en natif dont : APT, Yum, Docker, Maven, Pypi, Nuget, npm,
R, RubyGems, Go, Helm, Composer*, Cpan*, … et RAW.
C’est un très bon exercice pour se former à Ansible, Terraform, Vagrant
Ma démarche pour l’automatisation de l’installation de Nexus
Mes ressources étant limitées, j’ai commencé par développer le playbook
Ansible sur une machine virtuelle créé avec Vagrant. Une fois le
playbook fonctionnel, je l’ai transposé dans une VM instanciée avec du
Terraform sur une de mes machines de mon Homelab.
Les objectifs que je me suis fixés et les contraintes imposées :
Pouvoir faire les upgrades facilement
Ne pas utiliser de Bdd externes (pas assez de ressources)
Ajouter de la persistance sur les données via un simple partage Nfs. Avant
j’utilisais un cluster glusterfs sur 3 Raspberry Pi. Je rebasculerais
dessus dans les prochaines semaines après l’avoir reconstruit.
Pas d’installation via Docker.
Pour écrire le playbook Ansible, j’ai tout simplement transposé la procédure
d’installation disponible sur le site de la documentation de
Nexus ↗.
Ecriture du Vagrantfile
Maintenant je peux dire que je suis à l’aise avec Vagrant. Donc voici la
configuration que j’ai utilisée :
Comme vous pouvez le voir j’utilise un VM avec 2 CPU et 3 Go de RAM. C’est le
minimum requis. Je ne partage que le port 443, car c’est nginx qui portera la
partie SSL et se chargera de faire le lien vers les différents types de
repository. J’ai utilisé une box AlmaLinux dans sa version 8.
Mise en place du serveur NFS
Pour stocker les données persistantes j’ai fait le choix d’utiliser des montages
NFS. Sur mon PC de travail et sur un de mes serveurs du Home Lab j’ai installé
le serveur NFS, accompagné du service statd (pour la gestion du remote locking).
Comme je n’ai pas créé de FS dédié, je le crée sur le FS /home qui a le plus
de place à disposition. Je n’ai pas non plus mis de restriction sur la plage
d’IP qui peut y accéder (vous pouvez le faire.)
Ecriture du playbook
Je me suis forcé de surtout pas reprendre de l’existant et de l’écrire à la
volée avec les objectifs que je me suis fixé.
L’installation est faite dans le dossier /opt/sonatype en y déposant le
contenu du tar.gz téléchargé. Ensuite un lien est créé vers la version désirée.
Si la version n’existe pas, on arrête Nexus et on fait l’installation, dans le
cas contraire, on bypass pour ne faire que la partie configuration.
Si l’installation s’est mal passée vous pouvez la relancer en mettant
force_install à true. Ne pas oublier de le remettre à false par la suite.
La gestion de la version se fait avec la variable nexus_version. Les
versions disponibles ↗.
La configuration de Nginx se fait via l’utilisation d’un template Ansible :
Il y a redirections dont une qui permet de définir l’accès à une registry
docker. Nous verrons comment la créer plus tard.
Test de la VM avec vagrant
Vous pouvez télécharger le code en clonant le repository que je vous ai mis à
disposition :
N’oubliez pas de changer les variables du fqdn, des certificats et du montage
nfs.
Pour lancer la création de la VM :
Dans la phase de développement, je vous conseille d’ajouter l’option
--no-destroy-on-error qui permet de garder la vm même si le playbook plante.
Pour le relancer l’option --provision permet de spécifier qu’il ne faut que
refaire la partie provisioning.
Ensuite, il suffit de se rendre sur l’url https://192.168.3.10 ↗ dans votre
navigateur. Si vous le faites depuis visual code, vous pouvez ajouter le port
192.168.3.10:443 et dans le navigateur https://localhost ↗.
Pour se connecter la première fois, il faut récupérer le mot de passe que Nexus
a généré. Le user est admin :
Nexus vous demandera de le changer de suite ! Activer l’accès en mode
anonymous.
Installation sur une machine du home Lab avec Terraform
Maintenant que cela fonctionne je l’installe sur une des machines Ubuntu du Home
Lab. Pour cela je crée le partage NFS comme ci-dessus.
[Maj] La configuration automatique des machines du home lab est décrite
ici
Installation de libvirt
Il faut installer et configurer libvirt pour qu’il utilise le pont réseau monté
sur la carte ethernet. Cela permet d’exposer les VM sur le même réseau que la
machine hôte et donc bénéficier du serveur dhcp (ma box).
J’installe cockpit pour faciliter la configuration. En effet, la création du
pont réseau se fait en deux clics.
Une fois identifié, il suffit de se rendre dans la partie réseau et de cliquer
sur [Ajouter un Pont]. Donnez-lui un nom, br0 par exemple et cliquer sur le nom
de la carte réseau à associer (eth0, enp1s0, …). [Appliquez]
On configure ensuite libvirt pour qu’il utilise ce pont. Sur la machine
hôte créer un fichier se nommant bridged-network.xml et y mettre ce contenu :
(attention mettre le nom du pont que vous avez créé précédement !
Et on applique :
Création du code Terraform
Je vous fournis le code que j’ai utilisé :
Il faut modifier :
la variable domain (au début du script)
dans network_interface changer de mac addresse si besoin. Je la fixe pour que
l’ip utilise un bail statique sur ma box Orange.
Ce code fait appel à du cloud-init pour configurer la VM.
Modifier le nom de domain !!
Et pour la partie réseau :
Modifier le nom de domain et la gateway !!
Démarrage de la VM
Maintenant que tout est prêt allez on démarre le tout :
Allez dans cockpit et dans machine virtuelle cliquez sur artefacts.
Ouvrez la console série et entrez root, passwd pour vous connecter.
C’est bon elle est configurée !
On peut lancer le playbook Ansible.
Ça va mouliner un certain temps. Tout dépend des ressources de votre machine
hôte. Moi, c’est un Atom x5-Z8350 et il faut pas moins de 10 minutes avant que
Nexus soit opérationel. J’ai commandé un miniforums UM250 : RYZEN 5 PRO 2500U +
16Go de RAM + 256 Gb de SSD upgradable.Y a eu une belle promo sur
Amazon.fr ↗ à 390€.
Dans la fenêtre console il suffit de taper la commande suivante pour vérifier
que nexus est démarré :
Si le port 8081 apparaît, c’est que Nexus a démarré. Vous pouvez aussi vérifier
les logs dans /data/nexus/log/nexus.log.
Pour stocker vos images de container, vous pouvez activer le plugin docker de
Nexus. Identifiez-vous avec le compte admin. Et cliquez en haut à gauche sur la
roue dentée, puis [repository], puis [create repositories]. Choissisez
docker (hosted) et renseignez les paramêtres comme dans l’image ci-dessous:
Dans la partie finissez par [Create repository].
Test de la registry docker
On va tester le stockage d’image. On va faire simple :
Sur votre poste de travail, taguer une image avec le nom de domaine de votre nexus :
Un petit tour dans nexus. [Browse] [test] ->
On a une registry docker sécurisée ! C’est pas merveilleux ?
Si Nexus ne démarre pas
Connectez-vous avec le compte nexus :
On va lancer la commande de démarrage manuellement :
Si vous ne voyez pas d’erreur recopier la dernière commande affichée. Et lancer
là :
java.lang.NumberFormatException
J’ai eu ce problème qui était dû à l’absence du service rpc.statd sur la
machine hébergeant le partage NFS. Il suffit donc de l’installer et de le
démarrer (voir au début du billet).
Pas assez de ressources.
Par défaut la jvm Nexus est configurée avec les paramètres -Xms2703m,
-Xmx2703m et -XX:MaxDirectMemorySize=2703m. Vous pouvez essayer de les
réduire à 1536 ça devrait démarrer. Ca se passe dans le fichier
/opt/sonatype/nexus/bin/nexus.vmoptions
Attention à chaque nouvelle installation il faudra le refaire, à moins que
vous l’ajoutiez dans le playbook ansible (le temps que je le fasse).
Plus loin
Le code source de l’ensemble est disponible sur gitlab ↗
Il y a encore un peu de travail pour rendre le playbook tip-top au petits
oignons. Mais je vous laisse jouer avec pour apprendre :
gérer la configuration mémoire avec des lineinfile. Je vous déconseille le
template car les fichiers de configuration nexus