Ansibled : Dépôt Python privé

Il arrive régulièrement que les architectes réseaux définissent des zones privées, coupées du Grand Internet pour des raisons de sécurité. Dans ces zones, il faut malgré tout assurer les mises à jour des systèmes, souvent avec des serveurs miroirs ou des proxy-cache.

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.

Échauffement

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.

Boîte à outils

Pour cette recette, il vous faudra :

  • une machine ayant accès au Grand Internet, capable de lancer Pip et Ansible, que nous appellerons Relai.
  • un serveur dans votre zone privée, accessible en SSH depuis Relai, que nous appellerons Repo.

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.

Tour du propriétaire

À 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: >-  
  {{ pryvate_repository_root }}/{{ pryvate_repository_name }}

# Host name reachable by all host in need to feed on python packages.
pryvate_repository_host: >-  
  {{ hostvars[groups['pryvate-repos'][0]].ansible_default_ipv4.address }}

# Full url of the python packages repository.
pryvate_repository_url: >-  
  http://{{ pryvate_repository_host }}/{{ pryvate_repository_name }}

# 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.

Tests

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.

Usage

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.

Conclusion

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.