Fermer

septembre 28, 2018

Comment automatiser le déploiement d'applications vers Alibaba ECS avec Mina –


Cet article a été créé en partenariat avec Alibaba Cloud . Merci de soutenir les partenaires qui rendent SitePoint possible.

Pensez-vous avoir un meilleur conseil pour tirer le meilleur parti des services Alibaba Cloud? Parlez-en nous et courez la chance de gagner un Macbook Pro (plus d'autres trucs sympas). Pour en savoir plus ici .

Mina est un outil d'automatisation du déploiement et un générateur de script Bash du monde Rails, après les sociétés de développement ] a remarqué ses avantages sur Capistrano. Mina, contrairement à Capistrano, n'utilise qu'une seule connexion SSH au serveur de déploiement et exécute un lot de commandes bash. Cela le rend beaucoup plus rapide que Capistrano, qui ouvre une session SSH séparée pour chaque commande.

Dans cet article, nous allons passer en revue Mina pour le déploiement d'une application Django de base – un ensemble d'outils peu orthodoxes pour le monde Django. a tendance à utiliser Docker ou Fabric plus. Compte tenu de la simplicité et de la souplesse de Mina, nous pensons qu'il vaut la peine d'explorer son utilisation dans le déploiement d'applications Web Python.

Django une infrastructure Web pour les perfectionnistes , "Existe depuis un certain temps maintenant. Il a commencé comme un framework web orienté gestion de contenu, créé en interne par les développeurs web à Lawrence Journal World pour son portail web d'actualités. Il a été publié en 2005 et de là il a pris son envol et le reste est de l'histoire. Il est devenu l'un des frameworks web les plus sérieux et les plus largement adoptés, en concurrence avec Ruby on Rails. Il est utilisé par Instagram, Disqus, le Washington Times, Mozilla, Bitbucket et d'autres. Il est toujours aussi florissant.

Les documents de Django suggèrent Apache avec mod-wsgi comme premier choix. Mais comme nous sommes obsédés par les performances, nous avons décidé pour ce tutoriel de couvrir le déploiement d’une application Django sur l’instance de cloud ECS d’Alibaba avec une pile NGINX et uWSGI.

NGINX est un serveur Web connu pour ses L'efficacité, basée sur les événements, inclut des options de mise en cache, ce qui en fait souvent une solution idéale. uWSGI est un conteneur de serveur d’application – une implémentation de WSGI l’interface Web standard de Python. Il joue très bien avec NGINX.

Mise en route

Avant de commencer, vous devez créer un compte Alibaba Cloud . Il est très facile de démarrer avec Alibaba Cloud et de décider s’il est le bon choix pour vous, car son essai gratuit offre un crédit de US $ 300 aux nouveaux utilisateurs. Une fois que vous avez signé et reçu votre crédit, vous pouvez explorer les ressources de mise en route sur un certain nombre de sujets.

La première chose que nous ferons une fois notre compte configuré, est de créer une instance ECS dans la console dorsale Alibaba Cloud.

Le processus est simple. Nous choisirons Ubuntu 16.04 LTS pour notre système d'exploitation / image de système d'exploitation. Lors de la création, nous voulons nous assurer que notre instance est affectée à des groupes de sécurité appropriés. Dans la terminologie d'Alibaba, il s'agit de règles de pare-feu pour différents ports. C'est généralement quelque chose qui fonctionne par défaut, mais en cas de problèmes avec l'accès Web à notre instance plus tard, assurez-vous de cocher cette case.

La page Groupes de sécurité est accessible via le sous-menu Elastic Compute Service situé à gauche

La prochaine chose à faire lors de la création de notre instance est de la configurer pour l'accès à la clé SSH.

Le moyen le plus simple de le faire est peut-être de définir l'instance, lors de la création, avec un mot de passe. Ensuite, nous pouvons simplement faire la norme ssh-copy-id à partir de notre système de démarrage – probablement un périphérique local.

ssh-copy-id root@xxx.xxx.xxx.xxx exécuté depuis notre périphérique local (où nous remplacerons la séquence xxx… par notre adresse IP publique d'instance ECS Alibaba) nous demandera le mot de passe et, après l'avoir saisi, notre accès par clé devrait être configuré.

Lorsque nous nous connectons à notre instance via ssh, nous ferons apt-get update pour nous assurer que nos sources apt sont à jour, puis nous installons git, curl, wget: apt-get install git curl wget -y

Installation de l'environnement serveur

La version par défaut de Python fournie par défaut avec Ubuntu 16.04 LTS est l'ancienne version 2.7. Pour exécuter la dernière version de Django, nous avons besoin de Python 3+. L'une des manières les moins pénibles de résoudre ce problème consiste à installer pyenv un gestionnaire de version Python.

Cela nous permet de changer la version de Python utilisée globalement ou par projet. Avant d'installer pyenv, conformément au wiki pyenv nous allons installer les prérequis:

apt-get install -y make build-essentiel libssl-dev zlib1g-dev libbz2-dev libreadline-dev libsqlite3-dev librhurses5-dev libncursesw5-dev utils-zz dev-dev-lib lib-lib-dev

Ensuite, nous pouvons installer pyenv:

curl -L https: // github.com/pyenv/pyenv-installer/raw/master/bin/pyenv-installer | bash

À la fin, l'installateur pyenv nous demandera d'ajouter quelques lignes au fichier ~ / .bash_profile, ce que nous ferons:

Nous mettons maintenant à jour PATH dans notre session de travail en faisant source ~ / .bash_profile dans notre terminal.

Pourvu que nous ayons fait cela correctement, nous devrions maintenant être en mesure d'installer Python version 3.7.0:

Faire versions pyenv dans le terminal serveur devrait nous montrer deux éléments maintenant: système et 3.7.0 en supposant que nous avons installé la version 3.7.0 avec succès.

pyenv global 3.7.0 fera de notre version 3.7.0 la version python globale de notre système. Si vous avez des problèmes avec pyenv, c'est l'URL à visiter .

La pile du serveur

Le serveur Apache, qui est préinstallé, est le défaut habituel avec les images Ubuntu. S'il est en cours d'exécution, nous devons l'arrêter avec service apache2 stop puis installer nginx avec apt-get install nginx -y . Cela devrait installer et démarrer le serveur NGINX, qui devrait être visible lorsque nous visitons l'adresse IP publique de notre serveur.

Nous allons également installer uWSGI: pip install uwsgi (Python pip est probablement installé lors de l'installation de pyenv).

Nous veillerons également à ce que Django soit installé: pip install django . Nous pourrions utiliser virtualenv pour garantir un environnement isolé pour notre application, mais pour simplifier ce tutoriel, nous l'ignorerons.

Dans des cas plus complexes, cependant, un choix judicieux.

Ce guide suppose que nous avons dirigé les enregistrements A de notre domaine vers l'adresse IP de notre serveur, donc myxydomain.com est présumé dans le reste de ce guide être dirigé vers l'adresse IP publique de notre serveur ECS.

Nous allons maintenant créer l'hôte virtuel NGINX pour notre site Web. Le fichier peut être trouvé ici . Nous allons passer en revue quelques points:

unix serveur: ///tmp/minaguide.sock;

Ici, nous nous connectons – avec NGINX – au socket Unix que uWSGI va créer dans le répertoire / tmp et / tmp est recommandé pour des complications éventuelles d'autorisations pouvant survenir dans une arborescence de répertoires plus complexe. C’est pour cela que / tmp .

inclut / root / project / minaguide / uwsgi / uwsgi_params;

This ( / root / project / minaguide ) est un répertoire de notre projet django sur le serveur et, à l'intérieur, nous aurons un sous-répertoire uwsgi avec un fichier uwsgi_params qui contiendra certaines variables uWSGI. Nous reviendrons là-dessus plus tard et pour configurer notre application uWSGI.

Nous avons maintenant l'environnement de serveur de base dont nous avons besoin pour le déploiement.

Configuration de Mina

Nous installons Mina sur la machine à partir de laquelle nous effectuons le déploiement. En supposant que le périphérique est aussi Linux / Ubuntu (et les choses ne devraient pas être très différentes pour les utilisateurs de Mac – ni pour les utilisateurs de Windows, tant qu’ils utilisent Windows Subsystem for Linux ), avoir Ruby et Rubygems installés – apt-get install ruby ​​-y devrait faire l'affaire.

Après cela, nous aurons la commande gem disponible, nous ferons donc gem install mina .

Now – aussi sur notre machine locale – nous allons créer un répertoire dédié à notre projet et y faire mina init .

Cela crée un fichier config / deploy.rb dans notre répertoire de projet, que nous allons éditer pour configurer Mina:

 nécessite 'mina / rails'
nécessite 'mina / git'

# nous remplissons nos variables de base ici. Dans ce cas, en utilisant
# ENV ['domain']nous n'avons pas vraiment besoin d'entrer le domaine dans le fichier, comme
# on le passera quand on appelle mina en ligne de commande.

# le script suppose que nous avons configuré l’accès ssh-key au serveur et qu’il ne nous le demandera pas
# pour le mot de passe (pour l'utilisateur 'root')
set: nom_application, 'minaguide'
set: domaine, ENV ['domain']
set: deploy_to, '/ root / project / minaguide'
set: repository, 'https://github.com/tyaakow/django-uwsgi-starter.git'
set: branche, 'maître'
set: utilisateur, 'root'


# nous avons laissé ce vide, mais ceci peut être utilisé pour choisir la version de python de pyenv, comme nous
# fait manuellement
tâche: remote_environment do

fin

# ici, nous mettons toutes les commandes personnalisées dont vous avez besoin pour exécuter à l'installation
# la structure de répertoires de: deploy_to sera créée
tâche: configuration faire
  # nous tirons rc.local d'un gist, afin de rendre le daemonize uWSGI
  # et le faire démarrer avec le système
  commentaire "tirer rc.local vers / etc / ..."
  commande% {wget -P / etc / https://gist.githubusercontent.com/tyaakow/62a5f91dbf59b32e088ec15c8375ca76/raw/c0c864317888419cbb9f2c4311149649cea2be1a/rc.local}
  commentaire "le rendant exécutable ..."
  commande% {sudo chmod 755 /etc/rc.local}
  comment "supprimer les virtualhosts existants de / etc / nginx / sites-enabled / ..."
  commande% {rm / etc / nginx / sites-enabled / *}
  comment "aller chercher le fichier virtualhost à partir de github gist ..."
  commande% {wget -O / etc / nginx / sites-enabled / # {ENV ['domain']}
  comment "remplacer myxydomain.com par le domaine spécifié dans deploy.rb ..."
  commande% {sed -i 's / myxydomain.com / # {ENV ['domain']} / g' / etc / nginx / sites-enabled / # {ENV ['domain']}}
fin

desc "Déploie la version actuelle sur le serveur."
tâche: déployer faire
  déployer faire
    invoquer: 'git: clone'

    sur: lancement do
      commande% {sed -i 's / myxydomain.com / # {ENV ['domain']} / g' /root/project/minaguide/current/minaguide/settings.py}
      commande% {uwsgi --emperor / root / project / minaguide / current / uwsgi / vassals --daemonize /var/log/uwsgi-emperor.log}
      commande% {service nginx restart}
    fin
  fin

fin

Nous pouvons voir dans ce fichier que nous utilisons une interpolation de chaîne Ruby (la syntaxe # {} ).

Nous utilisons également sed pour remplacer par programmation du texte dans des fichiers ( sed -i 's / myxydomain.com / # {ENV ['domain']} / g' /root/project/minaguide/current/minaguide/settings.py) – et nous utilisons ENV ['domain'] à transmettre à Mina sur la ligne de commande. Ceci est destiné à illustrer des techniques permettant de construire des scénarios (peut-être plus sophistiqués) avec Mina.

task: setup do est la syntaxe que nous pouvons utiliser pour définir un nombre arbitraire de tâches.

la documentation de Mina nous pouvons utiliser les variables de syntaxe-symbole assignées avec set au début du fichier – avec la syntaxe fetch (: deploy_to) .

Le fichier peut être trouvé ici .

Dans ce tutoriel, nous avons extrait notre application Django de le dépôt public GitHub créé à cet effet, mais nous aurions pu utiliser un repo local, avec:

 tâche: deploy do
  run (: local) do

… où nous allions lancer rsync ou scp – ou nous aurions pu le récupérer à partir d'un dépôt privé nécessitant un accès à ssh-key.

En créant des tâches pour installer l’ensemble de notre environnement, nous pourrions rapidement sortir du cadre de ce guide.

Nous avons ajouté le répertoire uwsgi à notre application Django standard dans le dépôt – créé par django-admin startproject minaguide :

… où uwsgi_params sont à partir de cette page et uwsgi.ini contient les paramètres uWSGI de base.

Nous extrayons – dans notre script deploy.rb – le fichier hôte virtuel de NGINX depuis cette liste GitHub et en le plaçant dans / etc / nginx / sites-enabled / :

 # le composant en amont nginx doit se connecter à
Django en amont {
    serveur unix: ///tmp/minaguide.sock; # ce fichier sera créé par uWSGI
}

# configuration du serveur
serveur {
    # le port sur lequel votre site sera servi
    écouter 80;
    # le nom de domaine auquel il servira
    nom_serveur myxydomain.com; # sera substitué, avec sed, avec le nom de domaine réel fourni
    # à mina en ligne de commande
    charset utf-8;

    Taille de téléchargement maximale
    client_max_body_size 75M; # ajuster au goût

    # Média Django
    lieu / média {
        alias / root / project / minaguide / current / media; # les fichiers multimédias de votre projet Django - modifiez-les si nécessaire
    }

    emplacement / statique {
        alias / root / project / minaguide / current / static; # les fichiers statiques de votre projet Django - modifier si nécessaire
    }

    # Enfin, envoyez toutes les requêtes non-media au serveur Django.
    emplacement / {
        uwsgi_pass django;
        inclure / root / project / minaguide / current / uwsgi / uwsgi_params; # le fichier uwsgi_params
        # from https://github.com/nginx/nginx/blob/master/conf/uwsgi_params
    }
}

Plus de détails sur le déploiement de Django avec uWSGI et NGINX peuvent être trouvés ici .

Deployment

Maintenant, lorsque nous souhaitons déployer, nous allons appeler depuis notre système local / de développement mina setup domain = myfabulousdomain.com – où nous remplacerons myfabulousdomain.com par l'URL de notre serveur actuel, où nous allons nous déployer. Ceci sera ensuite utilisé par Mina comme ENV ['domain'] mentionné ci-dessus.

Ceci exécutera la tâche setup sur notre serveur.

En faisant mina deploy domain = myfabulousdomain .com nous allons exécuter le bloc / tâche deploy . Lorsque nous visitons notre domaine, nous devrions voir ce qui suit:

Si, lors du déploiement, nous rencontrons des problèmes avec le fichier de socket (problèmes de permission et de propriété ou autres), et nous n'avons pas le temps de le réparer – la solution la plus rapide passe peut-être de la connexion de NGINX à la prise uWSGI pour la connecter à uWSGI via http – uWSGI a - http et - options http-socket disponibles (nous devrons changer nos détails de connexion en amont django / server dans le fichier hôte virtuel nginx – pour nous connecter à quelque chose comme http :: //127.0.0.1: 8080 – et changer notre

Plus d'informations sur - http et - Options http-socket ici et ici . uWSGI est un très gros sujet.

Conclusion

Dans cet article, nous utilisons mina, une solution plutôt simple, très flexible et très rapide f ou déploiement d'applications. Dans le cas de configurations plus complexes nécessitant des solutions plus complètes, nous devrons peut-être automatiser une plus large gamme de détails de configuration du système et de la pile. Nous pouvons également examiner le Container Service d'Alibaba. rationaliser différents scénarios DevOps. Le registre de conteneurs permet des scénarios plus sophistiqués.

Dans le cas où notre produit / service requiert plusieurs instances ECS – nous voudrions également examiner l'équilibreur de charge serveur d'Alibaba. faire évoluer dynamiquement notre infrastructure pour suivre le trafic. Un autre produit ou fonctionnalité d'Alibaba à prendre en considération est Auto Scaling – qui déploie automatiquement de nouvelles instances selon un calendrier prédéterminé ou en fonction de la surveillance, par exemple, de l'utilisation des processeurs et de la mémoire.

Le calcul de fonction nous permet, au contraire, de nous concentrer sur nos logiques métier, tout en déléguant la totalité de l’infrastructure et des problèmes d’environnement au cloud. Le service est piloté par des événements, peut être déclenché par d'autres services, et tout ce que nous faisons est de télécharger notre code (NodeJS, Python, Java). Nous sommes facturés pour le code effectivement exécuté.

Ensuite, il y a une gamme complète de produits / services de sécurité, CDN et solutions de surveillance




Source link