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.
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
○ 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
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
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
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)
@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})
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})
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
import boto.ec2.elb
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]
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)
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)
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
$ fab deploy
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