Quand il s’agit de paquets systèmes, quel que soit le format (rpm, deb ou autres), le chemin est balisé par de nombreux tutoriels. Nous allons voir dans ce billet une méthode simple pour créer et alimenter un dépôt privé de paquets Python, de façon à ce que Pip et easy_install puissent être utilisés dans votre zone privée.
Avec un peu de recherche, on tombe sur une liste de projets qui implémentent l’API Python Index. Cette API permet à easy_install et Pip de découvrir et télécharger les paquets.
Comme ces projets ont des niveaux de maintenance variés, chacun sa communauté, et que je suis joueur, j’ai décidé de tenter une approche plus light, en servant directement des fichiers statiques depuis un Nginx.
Comme il s’agit d’un billet Ansibled (® ou presque), je vais vous guider dans l’utilisation d’un playbook de mon cru pour réaliser tout cela.
Pour cette recette, il vous faudra :
Nous confierons donc à Relai le soin de télécharger les paquets Python que vous souhaitez, avec leurs dépendances. Quant à Repo, il assurera un service Nginx pour délivrer les paquets Python à tout le reste de la zone privée.
Pour assurer toutes les tâches de setup, download et upload, j’ai préparé pour vous un petit outil Ansible qui se trouve sur Github.
Ces playbooks sont testés sur une image Vagrant CentOS/7.
À la racine du projet, vous trouverez 2 playbooks :
configure-pryvate-repos.yml
: à lancer depuis la machine Relai. Chargé de télécharger les paquets Python sur Relai, puis de configurer la machine du groupe pryvate-repos
pour avoir un Nginx basique, et ensuite uploader les paquets Python dessus.
configure-pryvate-clients.yml
: chargé de configurer les machines du groupe pryvate-clients
pour que Pip aille s’alimenter sur le dépôt. Easy_install est aussi configuré, mais uniquement pour chaque utilisateur. Seul l’utilisateur root
est configuré, pour l’exemple.
Pour configurer le fonctionnement de ces playbooks, allez voir dans group_vars/all.yml
:
---
# Will be used to create location for nginx and directories on
# nginx host.
pryvate_repository_name: >-
pryvate
# Path on nginx host where to put the python package directory.
pryvate_repository_root: >-
/var/lib/nginx
# Full path on nginx host of the python package directory.
pryvate_repository_path: >-
/
# Host name reachable by all host in need to feed on python packages.
pryvate_repository_host: >-
# Full url of the python packages repository.
pryvate_repository_url: >-
http:///
# List of pip-formatted package name to download locally before uploading
# to the private python packages repository.
pip_packages:
- ansible
- pip
La variable de configuration la plus utile est certainement pip_packages
: c’est la liste de paquets à rapatrier depuis Pypi et à injecter dans votre machine privée Repo. Je vous laisse le soin de découvrir les autres variables qui traitent surtout des emplacements des fichiers et des urls nécessaires à la configuration des clients de la zone privée.
Si vous souhaitez voir fonctionner ces playbooks en vase clos pour vous faire une idée, un fichier Vagrantfile
est prêt à servir et, moyennant une installation de Vagrant fonctionnelle, un simple vagrant up
vous fera une démonstration d’exécution.
Pour vous en servir en usage réel, remplissez les 2 groupes de votre inventaire :
pryvate-repos
: doit contenir la machine Repo, qui hébergera les paquets Python pour la zone.pryvate-clients
: doit contenir toutes les machines de la zone privée qui viendront se fournir en paquets Python auprès de Repo.Une fois l’inventaire prêt, vous pouvez utiliser les playbooks.
Il s’agit là d’un outillage sommaire, pouvant rendre des services, ou servir de base de refactoring à ceux qui souhaitent se mettre à Ansible. Si vous souhaitez une version Debian ou une autre distribution, je vous invite à venir en discuter sur les issues du projet.
Je suis un utilisateur assidu d’Ansible en tant qu’outil de scripting avancé, aussi j’espère que l’exercice de style vous aura plu.
Have fun. Hack in peace.