Bonjour !
Je m'appelle Sergey, je travaille en tant qu'ingénieur infrastructure dans l'équipe API de tinkoff.ru.
Dans cet article, je vais parler des problèmes rencontrés par notre équipe lors de la préparation des équilibrateurs basés sur pour divers projets. Je vais également parler de l'outil qui nous a permis de surmonter la plupart d'entre eux.
Nginx est un serveur proxy multifonctionnel et en constante évolution. Il se distingue par un grand nombre de modules, . Chaque projet impose des exigences spécifiques concernant les fonctionnalités de l'équilibrateur et la version de Nginx (par exemple la présence de http/2 et la gestion du proxy grpc), ainsi que la composition de ses modules.
Nous voulons voir une version à jour avec l'ensemble de modules requis, fonctionnant sous une distribution Linux spécifique. Dans notre cas, il s'agit de systèmes basés sur deb et rpm. L'option des conteneurs n'est pas envisagée dans cet article.
Nous souhaitons modifier rapidement les fonctionnalités de nos équilibrateurs. Et ici se pose immédiatement la question – comment y parvenir en dépensant le moins de ressources possibles ? Mieux encore, mettre en place un processus nous permettant de définir un nombre fini de paramètres d'entrée, afin d'obtenir en sortie un artefact sous la forme d'un paquet deb/rpm pour le système d'exploitation requis.
Il est donc possible de formuler plusieurs problèmes :
- Il n'y a pas toujours de paquets avec la version récente de Nginx.
- Il n'y a pas de paquets avec les modules nécessaires.
- La compilation et la construction du paquet à la main prennent beaucoup de temps et sont tout simplement épuisantes.
- Il n'y a pas de description de la manière dont instance Nginx a été assemblée.
Pour résoudre ces problèmes, un outil s'impose, qui prendrait en entrée une spécification au format lisible par l'homme et construirait à partir de celle-ci un paquet Nginx avec les fonctionnalités requises.
Ne trouvant pas l'option qui nous convenait dans les profondeurs de GitHub, nous avons décidé de créer notre propre outil – .
Spécifications
Dans notre outil, nous voulions créer une description de la spécification sous forme de code, que l'on pourrait ensuite placer dans un dépôt Git. Pour cela, nous avons choisi un format familier pour ce type de choses – yaml. Exemple de spécification :
nginx_version: 1.14.1
output_package: deb
modules:
- module:
name: nginx-auth-ldap
git_url: https://github.com/kvspb/nginx-auth-ldap.git
git_branch: master
dependencies:
- libldap2-dev
- module:
name: ngx_http_substitutions_filter_module
git_url: https://github.com/yaoweibin/ngx_http_substitutions_filter_module.git
- module:
name: headers-more-nginx-module
web_url: https://github.com/openresty/headers-more-nginx-module/archive/v0.261.zip
- module:
name: nginx-module-vts
git_url: https://github.com/vozlt/nginx-module-vts.git
git_tag: v0.1.18
- module:
name: ngx_devel_kit
git_url: https://github.com/simplresty/ngx_devel_kit.git
git_tag: v0.3.0
- module:
name: ngx_cache_purge
git_url: https://github.com/FRiCKLE/ngx_cache_purge.git
- module:
name: ngx_http_dyups_module
git_url: https://github.com/yzprofile/ngx_http_dyups_module.git
- module:
name: nginx-brotli
git_url: https://github.com/eustas/ngx_brotli.git
git_tag: v0.1.2
- module:
name: nginx_upstream_check_module
git_url: https://github.com/yaoweibin/nginx_upstream_check_module.git
- module:
name: njs
git_url: https://github.com/nginx/njs.git
git_tag: 0.2.5
config_folder_path: nginx
Ici, nous indiquons que nous souhaitons voir un paquet deb avec la version Nginx 1.14.2 et le bon ensemble de modules. La section des modules est optionnelle. Pour chacun d'eux, nous pouvons spécifier :
- Le nom.
- L'adresse où il peut être obtenu :
- Le dépôt Git. Il est également possible de spécifier une branche ou un tag.
- Un lien Web vers l'archive.
- Un lien local vers l'archive.
Certains modules nécessitent l'installation de dépendances supplémentaires, par exemple pour nginx-auth-ldap, il faut que libldap2-dev soit installé. Les dépendances nécessaires peuvent également être spécifiées lors de la description du module.
L'environnement
Dans notre outil, vous pouvez rapidement obtenir un environnement avec les utilitaires requis pour la compilation, la création de paquets et d'autres logiciels auxiliaires. Un conteneur docker avec tout le nécessaire convient parfaitement ici (le dépôt contient déjà quelques exemples de fichiers docker pour ubuntu et centos).
Après avoir établi la spécification et préparé l'environnement, nous lançons notre assembleur, après avoir installé ses dépendances :
pip3 install -r requirements.txt
./main.py build -f [config_file].yaml -r [revision_number]
Le numéro de révision ici est optionnel et sert à versionner les assemblages. Il est enregistré dans les métadonnées du paquet, ce qui permet de le mettre à jour facilement sur les serveurs.
Les journaux permettent de suivre le déroulement. Voici un exemple des points principaux :
constructeur - INFO - Analyse du fichier yaml : example.config.yaml
constructeur - INFO - Téléchargement des scripts pour la construction du paquet deb
constructeur - INFO - Téléchargement des sources nginx...
constructeur - INFO - --> http://nginx.org/download/nginx-1.14.1.tar.gz
constructeur - INFO - Téléchargement des modules tiers...
constructeur - INFO - Le module nginx-auth-ldap sera téléchargé par branche
constructeur - INFO - -- Terminé : nginx-auth-ldap
constructeur - INFO - -- Terminé : ngx_http_substitutions_filter_module
constructeur - INFO - Le module headers-more-nginx-module sera téléchargé
constructeur - INFO - Le module nginx-module-vts sera téléchargé par tag
constructeur - INFO - -- Terminé : nginx-module-vts
constructeur - INFO - Le module ngx_devel_kit sera téléchargé par tag
constructeur - INFO - -- Terminé : ngx_devel_kit
constructeur - INFO - -- Terminé : ngx_cache_purge
constructeur - INFO - -- Terminé : ngx_http_dyups_module
constructeur - INFO - Téléchargement des dépendances
constructeur - INFO - Construction du paquet .deb
constructeur - INFO - Exécution de 'dh_make'...
constructeur - INFO - Exécution de 'dpkg-buildpackage'...
dpkg-deb : construction du paquet 'nginx' dans '.. /nginx_1.14.1-1_amd64.deb'.
Ainsi, en quelques commandes, nous créons un environnement et la version nécessaire de Nginx, et le paquet apparaît dans le répertoire d'où le script a été lancé.
Intégration
Nous pouvons également intégrer notre outil dans des processus CI/CD. Cela peut être facilité par n'importe quel système CI existant aujourd'hui, par exemple ou .
En conséquence, pour chaque changement de spécification dans le dépôt Git, la construction de l'artéfact est automatiquement lancée. Le numéro de révision est lié au compteur de l'exécution de la construction.
En prenant un peu plus de temps, il est possible de configurer l'envoi de l'artéfact vers un dépôt local de paquets, Nexus, Artifactory, et ainsi de suite.
Un autre avantage est que le fichier yaml de configuration peut être connecté à Ansible ou à un autre système de configuration automatique, et nous pouvons en tirer le numéro de version et le type de paquet que nous voulons déployer.
Que faire ensuite
Le projet n'est pas encore terminé. Voici sur quoi nous travaillons actuellement :
- Nous élargissons la capacité de configuration tout en la gardant aussi simple que possible. Nous ne voulons pas définir mille paramètres si seuls deux sont nécessaires, les autres étant appropriés par défaut. Cela concerne les drapeaux de compilation (actuellement, ils peuvent être modifiés dans le fichier de configuration interne src/config.py), les chemins d'installation, l'utilisateur pour l'exécution.
- Nous ajoutons des options d'envoi automatique du paquet vers divers dépôts d'artéfacts.
- Exécution de la commande utilisateur lors du chargement du module (par exemple pour l'utilisation de il est nécessaire d'appliquer d'abord le patch de la version spécifiée)
- Nous ajoutons la réalisation de tests :
- Le paquet s'installe correctement.
- Nginx a la version requise et est compilé avec les drapeaux et modules requis.
- Les chemins nécessaires, les comptes utilisateurs, etc. sont créés.
Mais vous pouvez déjà utiliser cet outil et proposer des améliorations — bienvenue!
Source : habr.com
