[PYTHON] Ich habe versucht, eine eigenständige Bereitstellung von Play with Fabric [AWS-Operation mit Boto] [Play Deployment] durchzuführen.

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.

Was ist Stoff?

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

Annahme

○ 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

Umgebung

Play framework 2.3.x activator 1.2.10 Das Betriebssystem, auf dem bereitgestellt werden soll, ist Amazon Linux Fabric 1.8.1

Stoffinstallation

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

Was Sie im Voraus wissen wollen

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)

Play Deploy spielen

Starten Sie den Wiedergabevorgang im Hintergrund

@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})

Spielvorgang stoppen

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})

ELB-Betrieb

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

Boto importieren

import boto.ec2.elb

Stellen Sie eine Verbindung zu AWS her und erhalten Sie eine ELB mit dem Namen 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]

Holen Sie sich die EC2 (Ihre) Instanz-ID

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)

Entfernen Sie EC2 (self) von ELB

def remove_ec2():
    """ ec2(mich selber)Von ELB"""
    execute(get_elb)
    execute(get_ec2_id)
    env.elb.deregister_instances(env.ec2_id)

Befestigen Sie EC2 (self) von ELB

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 スクリーンショット 2015-02-24 20.46.00.png

$ fab deploy

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

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

abschließend

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

Ich habe versucht, eine eigenständige Bereitstellung von Play with Fabric [AWS-Operation mit Boto] [Play Deployment] durchzuführen.
Ich habe versucht, zum Zeitpunkt der Bereitstellung mit Fabric und ChatWork Api automatisch in ChatWork zu posten
Ich möchte mit aws mit Python spielen
Ich habe versucht, Runenfiguren mit Scikit-Learn handschriftlich zu erkennen
Ich habe Hunderte Millionen SQLite mit Python ausprobiert
Ich habe versucht, Bilder mit CIFAR-10 mit Keras-Learning- zu erkennen.
Ich habe versucht, Bilder von CIFAR-10 mit Keras-Bilderkennung zu erkennen.
Ich habe Flask mit Remote-Containern von VS Code ausprobiert
Ich habe versucht, AWS Lambda mit anderen Diensten zu verbinden
Ich habe versucht, Funktionen mit SIFT von OpenCV zu extrahieren
Ich habe eine emotionale Analyse von Amazon Comprehend mit der AWS CLI durchgeführt.
[OpenCV / Python] Ich habe versucht, Bilder mit OpenCV zu analysieren
Ich habe AWS CDK ausprobiert!
Ich habe AWS Iot ausprobiert
[Einführung in AWS] Ich habe versucht, mit der Sprach-Text-Konvertierung zu spielen ♪
Ich habe versucht, das Bild mit Python + OpenCV "morphologisch zu konvertieren"
Ich habe versucht, die Entropie des Bildes mit Python zu finden
Ich habe versucht, mit TensorFlow den Durchschnitt mehrerer Spalten zu ermitteln
Ich habe versucht, Djangos Server mit VScode anstelle von Pycharm zu starten
Ich habe versucht, Movidius NCS mit Python von Raspberry Pi3 auszuführen
Ich habe versucht, ListNet of Rank Learning mit Chainer zu implementieren
Ich habe versucht, die handschriftliche Zeichenerkennung von Runenzeichen mit CNN mithilfe von Keras zu erkennen
Ich habe versucht, die Wahrscheinlichkeit eines Bingospiels mit Python zu simulieren
Ich habe die Grundoperation von matplotlib in Jupyter Lab geschrieben
Ich habe fp-Wachstum mit Python versucht
Ich habe versucht, mit Python zu kratzen
Ich habe versucht, mit Elasticsearch Ranking zu lernen!
S3-Betrieb mit Python Boto3
Ich habe versucht, mit PyCaret zu clustern
Ich habe gRPC mit Python ausprobiert
Ich habe versucht, mit Python zu kratzen
Ich habe versucht, AWS Chalice zu verwenden
Ich habe versucht, den Sesam für Eingang 2 mit einem einzigen Druck auf die AWS IoT-Taste zu entsperren
Ich habe versucht, das Ranking des Qiita-Adventskalenders mit Python zu kratzen
[AWS / Tello] Ich habe versucht, die Drohne mit meiner Stimme Part2 zu bedienen
Ich habe versucht, die Bewässerung des Pflanzgefäßes mit Raspberry Pi zu automatisieren
Ich habe versucht, mit Python eine Liste von Primzahlen zu erstellen
Ich habe versucht zu beheben "Ich habe versucht, die Wahrscheinlichkeit eines Bingospiels mit Python zu simulieren"
Ich habe versucht, mit Boto3 eine Liste der AMI-Namen zu erhalten
Ich habe die Grundoperation von Pandas im Jupyter Lab geschrieben (Teil 1)
[AWS / Tello] Ich habe versucht, die Drohne mit meiner Stimme Part1 zu bedienen
Ich habe versucht, die Größe des logischen Volumes mit LVM zu erweitern
Ich habe versucht, den DNN-Teil von OpenPose mit Chainer-CPU auszuführen
Ich habe versucht, die Effizienz der täglichen Arbeit mit Python zu verbessern
Ich habe versucht, automatisch Bilder von Kanna Hashimoto mit Python zu sammeln! !!
Ich habe die grundlegende Operation von Pandas im Jupyter Lab geschrieben (Teil 2).
Ich habe versucht, mit Go einen exklusiven Kontrollmechanismus zu erstellen
Ich habe versucht, Sätze mit summpy zusammenzufassen
Holen Sie sich die AWS-Konto-ID mit boto3
Ich habe maschinelles Lernen mit liblinear versucht
Ich habe versucht, WebScraping mit Python.
Ich habe versucht, Essen mit SinGAN zu bewegen
Ich habe versucht, GrabCut von OpenCV zu verwenden
Ich habe versucht, DeepPose mit PyTorch zu implementieren
Automatisierung von Remote-Operationen mit Fabric
Ich habe versucht, das Gesicht mit MTCNN zu erkennen
Ich konnte Gunicorn mit Fabric nicht zu einem Dämon machen
Ich habe versucht, Prolog mit Python 3.8.2 auszuführen.