[PYTHON] J'ai essayé le déploiement autonome de play avec fabric [opération AWS avec boto] [déploiement de lecture]

Vous pouvez utiliser Fabric pour automatiser le déploiement des applications de jeu Puisque j'ai exploité Amazon EC2 et ELB dans le tissu, je voudrais vous donner une brève introduction.

Qu'est-ce que le tissu?

http://fabric-ja.readthedocs.org/en/latest/tutorial.html

Qu'est-ce que le tissu:

-Un outil qui exécute des fonctions Python arbitraires via la ligne de commande. -Une bibliothèque de sous-programmes (construite sur une bibliothèque de bas niveau) Exécutez facilement des commandes shell via SSH à la manière de Python.

Il est difficile de comprendre s'il s'agit d'un document officiel, En combinant les deux, vous pouvez automatiser le processus sur le serveur distant. Déploiement en production Le travail manuel est trop effrayant et compliqué, alors automatisons-le de plus en plus.

Pour comparaison avec Capistrano, je me suis référé à l'article suivant. http://dekokun.github.io/posts/2013-05-21.html

supposition

○ Le flux de déploiement est comme ça Mise à jour de la source ↓ Supprimer EC2 de ELB ↓ play stop ↓ Déployer avec le jeu ↓ play start ↓ Ajouter EC2 à ELB ↓ Fin de déploiement

environnement

Play framework 2.3.x activator 1.2.10 Le système d'exploitation sur lequel effectuer le déploiement est Amazon Linux Fabric 1.8.1

installation de tissu

centOS sudo yum -y install python python-devel python-setuptools gcc sudo easy_install pip sudo pip install fabric==1.8.1

Mac sudo easy_install fabric

Ce que vous voulez savoir à l'avance

appeler la commande shell locale-> locale variable env-> env (singleton global), utilisée pour le partage d'informations entre les tâches lcd-> spécification du répertoire courant local exécuter-> exécuter la tâche

Décorateur @ task-> Charger comme tâche valide @ runs_once-> Empêcher les fonctions encapsulées d'être exécutées plusieurs fois

Pour le moment, je vais mettre dans un fabfile. Partiellement décrit ci-dessous. fabfile

# -*- coding: utf-8 -*-
from fabric.api import *
from fabric.decorators import runs_once
import boto.ec2.elb

env.hosts = ['localhost']
env.user = "username"

env.project_root = "path/to/project"
env.build_path = "target/universal/stage/bin/project_name"
env.config_path = env.project_root + '/conf/application.conf'
env.branch = 'master'

env.region = "ap-northeast-1"
env.elb_name = 'your_elb_name'
env.aws_access_key = 'your_aws_access_key'
env.aws_secret_key = 'your_aws_secret_key'


##Construire
@task
@runs_once
def build_play():
    """ activator clean stage"""
    with lcd(env.project_root):
        local("activator clean stage")


##système d'activation de l'activateur
@task
def play_start():
    """Lancer l'activateur en mode production"""
    with lcd(env.project_root):
        local("%(bin)s -Dconfig.file=%(conf)s &" % {"bin":env.build_path, "conf":env.config_path})

@task
def play_stop():
    """Tuez un processus en cours d'exécution en mode production"""
    if local('ps -ef | grep "%(root)s/target/universal/stage" | grep -v grep | wc -l' % {"root":env.project_root}, capture=True) == "1":
        local("kill `cat %(root)s/target/universal/stage/RUNNING_PID`" % {"root":env.project_root})

@task
def play_restart():
    """Redémarrer en mode production"""
    execute(play_stop)
    execute(play_start)


##Fonctionnement AWS ELB
def get_ec2_id():
    """Obtenir l'ID d'instance de ec2"""
    env.ec2_id = local("curl http://169.254.169.254/latest/meta-data/instance-id", capture=True)

def conn_elb():
    env.conn_elb = boto.ec2.elb.connect_to_region(
        env.region,
        aws_access_key_id = env.aws_access_key,
        aws_secret_access_key = env.aws_secret_key)

def get_elb():
    execute(conn_elb)
    env.elb = env.conn_elb.get_all_load_balancers(env.elb_name)[0]

def remove_ec2():
    """ ec2(moi même)Depuis ELB"""
    execute(get_elb)
    execute(get_ec2_id)
    env.elb.deregister_instances(env.ec2_id)

def add_ec2():
    """ ec2(moi même)Vers ELB"""
    execute(get_elb)
    execute(get_ec2_id)
    env.elb.register_instances(env.ec2_id)


@task
@runs_once
def update(branch=env.branch):
    """ env.Synchronisez avec la branche. Lors de la spécification d'une succursale-> fab update:branch=branch_name"""
    with lcd(env.project_root):
        local("git fetch")
        local("git reset --hard HEAD")
        local("git checkout " + branch)
        local("git pull")


##Déployer
@task
@runs_once
def deploy(branch=env.branch):
    """Spécification de la branche-> fab deploy:branch=branch_name"""
    execute(remove_ec2)
    execute(play_stop)
    execute(update,branch=branch)
    execute(build_play)
    execute(play_start)
    execute(add_ec2)

Jouer à déployer

Démarrez le processus de lecture en arrière-plan

@task
def play_start():
    """Lancer l'activateur en mode production"""
    with lcd(env.project_root):
        local("%(bin)s -Dconfig.file=%(conf)s &" % {"bin":env.build_path, "conf":env.config_path})

arrêt du processus de lecture

Supprimez le processus à l'aide du fichier RUNNING_PID qui gère le processus dans l'application de lecture.

@task
def play_stop():
    """Tuez un processus en cours d'exécution en mode production"""
    if local('ps -ef | grep "%(root)s/target/universal/stage" | grep -v grep | wc -l' % {"root":env.project_root}, capture=True) == "1":
        local("kill `cat %(root)s/target/universal/stage/RUNNING_PID`" % {"root":env.project_root})

Fonctionnement ELB

boto J'utilise une bibliothèque appelée boto (AWS SDK pour Python) pour faire fonctionner ELB à partir de fabric. API document: http://boto.readthedocs.org/en/latest/ https://github.com/boto/boto

Importer boto

import boto.ec2.elb

Connectez-vous à AWS et obtenez un ELB nommé env.elb_name

def conn_elb():
    env.conn_elb = boto.ec2.elb.connect_to_region(
        env.region,
        aws_access_key_id = env.aws_access_key,
        aws_secret_access_key = env.aws_secret_key)

def get_elb():
    execute(conn_elb)
    env.elb = env.conn_elb.get_all_load_balancers(env.elb_name)[0]

Obtenez l'ID d'instance EC2 (votre)

EC2 semble être capable d'obtenir diverses méta-informations de lui-même. Benri à savoir http://d.hatena.ne.jp/rx7/20100605/p1

Notez que dans le cas de local, il ne sera pas entré dans la variable à moins que capture = True.

def get_ec2_id():
    """Obtenir l'ID d'instance de ec2"""
    env.ec2_id = local("curl http://169.254.169.254/latest/meta-data/instance-id", capture=True)

Supprimer EC2 (self) de ELB

def remove_ec2():
    """ ec2(moi même)Depuis ELB"""
    execute(get_elb)
    execute(get_ec2_id)
    env.elb.deregister_instances(env.ec2_id)

Fixez EC2 (auto) depuis ELB

def add_ec2():
    """ ec2(moi même)Vers ELB"""
    execute(get_elb)
    execute(get_ec2_id)
    env.elb.register_instances(env.ec2_id)

demo

Exécutez la commande fab dans le répertoire courant où le fabfile est installé. Je pense qu'il peut être placé dans la route du projet ou sous / home / user.

Celui avec le décorateur @task est affiché dans la liste. $ fab --list スクリーンショット 2015-02-24 20.46.00.png

$ fab deploy

スクリーンショット 2015-02-24 20.55.23.png

スクリーンショット 2015-02-24 20.53.54.png

en conclusion

J'ai touché à la fois le tissu et le boto pour la première fois cette fois, mais je pensais que les avantages étaient élevés pour le faible coût d'apprentissage. J'ai également fait une version de déploiement du serveur de déploiement vers l'hôte distant, donc quand j'ai le temps, ça aussi J'aimerais bloguer.

Merci d'avoir lu jusqu'à la fin.

Recommended Posts

J'ai essayé le déploiement autonome de play avec fabric [opération AWS avec boto] [déploiement de lecture]
J'ai essayé de publier automatiquement sur ChatWork au moment du déploiement avec Fabric et ChatWork Api
Je veux jouer avec aws avec python
J'ai essayé la reconnaissance manuscrite des caractères des runes avec scikit-learn
J'ai essayé des centaines de millions de SQLite avec python
J'ai essayé la reconnaissance d'image de CIFAR-10 avec Keras-Learning-
J'ai essayé la reconnaissance d'image de CIFAR-10 avec la reconnaissance d'image Keras-
J'ai essayé Flask avec des conteneurs distants de VS Code
J'ai essayé de connecter AWS Lambda à d'autres services
J'ai essayé d'extraire des fonctionnalités avec SIFT d'OpenCV
J'ai fait une analyse émotionnelle d'Amazon Comprehend avec l'AWS CLI.
[OpenCV / Python] J'ai essayé l'analyse d'image de cellules avec OpenCV
J'ai essayé AWS CDK!
J'ai essayé AWS Iot
[Introduction à AWS] J'ai essayé de jouer avec la conversion voix-texte ♪
J'ai essayé la "conversion de morphologie" de l'image avec Python + OpenCV
J'ai essayé de trouver l'entropie de l'image avec python
J'ai essayé de trouver la moyenne de plusieurs colonnes avec TensorFlow
J'ai essayé de démarrer le serveur de Django avec VScode au lieu de Pycharm
J'ai essayé d'exécuter Movidius NCS avec python de Raspberry Pi3
J'ai essayé d'implémenter ListNet d'apprentissage de rang avec Chainer
J'ai essayé la reconnaissance de caractères manuscrits des caractères runiques avec CNN en utilisant Keras
J'ai essayé de simuler la probabilité d'un jeu de bingo avec Python
J'ai écrit le fonctionnement de base de matplotlib dans Jupyter Lab
J'ai essayé fp-growth avec python
J'ai essayé de gratter avec Python
J'ai essayé Learning-to-Rank avec Elasticsearch!
Opération S3 avec python boto3
J'ai essayé le clustering avec PyCaret
J'ai essayé gRPC avec Python
J'ai essayé de gratter avec du python
J'ai essayé d'utiliser AWS Chalice
J'ai essayé de déverrouiller l'entrée 2 lock sésame d'une simple pression sur le bouton AWS IoT
J'ai essayé de gratter le classement du calendrier de l'avent Qiita avec Python
[AWS / Tello] J'ai essayé de faire fonctionner le drone avec ma voix Part2
J'ai essayé d'automatiser l'arrosage du pot avec Raspberry Pi
J'ai essayé de créer une liste de nombres premiers avec python
J'ai essayé de corriger "J'ai essayé la simulation probabiliste du jeu de bingo avec Python"
J'ai essayé d'obtenir une liste de noms AMI en utilisant Boto3
J'ai écrit le fonctionnement de base de Pandas dans Jupyter Lab (partie 1)
[AWS / Tello] J'ai essayé de faire fonctionner le drone avec ma voix Part1
J'ai essayé d'agrandir la taille du volume logique avec LVM
J'ai essayé d'exécuter la partie DNN d'OpenPose avec le processeur Chainer
J'ai essayé d'améliorer l'efficacité du travail quotidien avec Python
J'ai essayé de collecter automatiquement des images de Kanna Hashimoto avec Python! !!
J'ai écrit le fonctionnement de base de Pandas dans Jupyter Lab (partie 2)
J'ai essayé de créer un mécanisme de contrôle exclusif avec Go
J'ai essayé de résumer des phrases avec summpy
Obtenez l'ID de compte AWS avec boto3
J'ai essayé l'apprentissage automatique avec liblinear
J'ai essayé webScraping avec python.
J'ai essayé de déplacer de la nourriture avec SinGAN
J'ai essayé d'utiliser GrabCut d'OpenCV
J'ai essayé d'implémenter DeepPose avec PyTorch
Automatisation des opérations à distance avec Fabric
J'ai essayé la détection de visage avec MTCNN
Je ne pourrais pas faire de gunicorn un démon avec Fabric
J'ai essayé d'exécuter prolog avec python 3.8.2.