Sie können Fabric verwenden, um die Bereitstellung von Wiedergabeanwendungen zu automatisieren Da ich Amazon EC2 und ELB in Stoff betrieben habe, möchte ich Ihnen eine kurze Einführung geben.
http://fabric-ja.readthedocs.org/en/latest/tutorial.html
Was ist Stoff:
- Ein Tool, das beliebige Python-Funktionen über die Befehlszeile ausführt. -Eine Bibliothek von Unterprogrammen (aufgebaut auf einer Bibliothek auf niedriger Ebene) Führen Sie Shell-Befehle einfach über Python in Python-ähnlicher Weise aus.
Es ist schwer zu verstehen, ob es sich um ein offizielles Dokument handelt. Durch Kombinieren der beiden können Sie den Prozess auf dem Remote-Server automatisieren. Produktionsbereitstellung Manuelle Arbeit ist zu beängstigend und mühsam. Lassen Sie uns sie daher immer mehr automatisieren.
Zum Vergleich mit Capistrano habe ich auf den folgenden Artikel verwiesen. http://dekokun.github.io/posts/2013-05-21.html
○ Der Ablauf der Bereitstellung ist wie folgt Quellupdate ↓ Entfernen Sie EC2 von ELB ↓ play stop ↓ Mit Spiel bereitstellen ↓ play start ↓ Fügen Sie EC2 zu ELB hinzu ↓ Ende der Bereitstellung
Play framework 2.3.x activator 1.2.10 Das Betriebssystem, auf dem bereitgestellt werden soll, ist 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
Rufen Sie den Befehl local-> local shell auf env-> env-Variable (globaler Singleton), die für den Informationsaustausch zwischen Aufgaben verwendet wird lcd-> lokale aktuelle Verzeichnisspezifikation Ausführen-> Aufgabe ausführen
Dekorateur @ task-> Als gültige Aufgabe laden @ running_once-> Verhindert, dass umschlossene Funktionen mehrmals ausgeführt werden
Vorerst werde ich eine Fabfile einfügen. Teilweise unten beschrieben. 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'
##Bauen
@task
@runs_once
def build_play():
""" activator clean stage"""
with lcd(env.project_root):
local("activator clean stage")
##Aktivator-Aktivierungssystem
@task
def play_start():
"""Starten Sie den Aktivator im Produktionsmodus"""
with lcd(env.project_root):
local("%(bin)s -Dconfig.file=%(conf)s &" % {"bin":env.build_path, "conf":env.config_path})
@task
def play_stop():
"""Beenden Sie einen Prozess, der im Produktionsmodus ausgeführt wird"""
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():
"""Im Produktionsmodus neu starten"""
execute(play_stop)
execute(play_start)
##AWS ELB-Betrieb
def get_ec2_id():
"""Holen Sie sich die Instanz-ID von 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(mich selber)Von ELB"""
execute(get_elb)
execute(get_ec2_id)
env.elb.deregister_instances(env.ec2_id)
def add_ec2():
""" ec2(mich selber)Zu ELB"""
execute(get_elb)
execute(get_ec2_id)
env.elb.register_instances(env.ec2_id)
@task
@runs_once
def update(branch=env.branch):
""" env.Mit Zweig synchronisieren. Bei der Angabe eines Zweigs-> 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")
##Bereitstellen
@task
@runs_once
def deploy(branch=env.branch):
"""Branchenspezifikation-> 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():
"""Starten Sie den Aktivator im Produktionsmodus"""
with lcd(env.project_root):
local("%(bin)s -Dconfig.file=%(conf)s &" % {"bin":env.build_path, "conf":env.config_path})
Löschen Sie den Prozess mit der Datei RUNNING_PID, die den Prozess in der Wiedergabeanwendung verwaltet.
@task
def play_stop():
"""Beenden Sie einen Prozess, der im Produktionsmodus ausgeführt wird"""
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 Ich verwende eine Bibliothek namens boto (AWS SDK für Python), um ELB von Fabric aus zu betreiben. 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 scheint in der Lage zu sein, verschiedene Metainformationen von sich selbst zu erhalten. Benri zu wissen http://d.hatena.ne.jp/rx7/20100605/p1
Beachten Sie, dass im Fall von local nicht in die Variable eingegeben wird, es sei denn, capture = True.
def get_ec2_id():
"""Holen Sie sich die Instanz-ID von ec2"""
env.ec2_id = local("curl http://169.254.169.254/latest/meta-data/instance-id", capture=True)
def remove_ec2():
""" ec2(mich selber)Von ELB"""
execute(get_elb)
execute(get_ec2_id)
env.elb.deregister_instances(env.ec2_id)
def add_ec2():
""" ec2(mich selber)Zu ELB"""
execute(get_elb)
execute(get_ec2_id)
env.elb.register_instances(env.ec2_id)
demo
Führen Sie den Befehl fab in dem aktuellen Verzeichnis aus, in dem die Fabdatei installiert ist. Ich denke, es kann in der Projektroute oder unter / home / user platziert werden.
Der mit dem @ Task-Dekorator wird in der Liste angezeigt. $ fab --list
$ fab deploy
Diesmal habe ich zum ersten Mal sowohl Stoff als auch Boto berührt, aber ich dachte, dass die Vorteile für die niedrigen Lernkosten hoch waren. Ich habe auch eine Bereitstellungsversion vom Bereitstellungsserver zum Remote-Host erstellt. Wenn ich also Zeit habe, auch das Ich würde gerne bloggen.
Vielen Dank für das Lesen bis zum Ende.
Recommended Posts