Zum Zeitpunkt des Schreibens hat der v2-Zweig eine Group
Klasse, die in der Lage sein sollte, als die Einheiten zu dienen, die früher als "Rollen" bekannt waren, auch bekannt als "ein Haufen Hosts, mit denen/mit denen man Dinge tun kann".
Es gibt jedoch noch keine spezielle Möglichkeit, Group
Objekte zu organisieren oder zu kennzeichnen; es ist "fertig" genug für den reinen API-Anwendungsfall von fortgeschrittenen Benutzern, die ihre eigene spezifische Art der Erstellung verfolgen möchten, aber es fehlt alles für CLI-orientierte Benutzer oder fortgeschrittene Benutzer, die etwas Frameworkisches zum Aufbauen wollen.
Anders ausgedrückt, es sei denn, Sie arbeiten ausschließlich mit der API, ist es nutzlos, Gruppenobjekte irgendwo herumliegen zu lassen, wenn die CLI oder die Task-Aufrufbits keine Möglichkeit haben, sie zu finden!
In v1 waren Rollen effektiv ein einzelner flacher Namespace, der einfache Zeichenfolgenlabels zu den Gruppen in v2 zuordnete, und sie konnten zur Laufzeit auf der CLI ausgewählt ( fab --roles=web,db
) und/oder als Standardziele für Aufgaben registriert werden ( @task('db') \n def migrate():
), ähnlich wie bei Gastgebern.
Benutzer haben sie in env.roledefs
, einem einfachen Diktat; jede mittlere bis erweiterte Funktionalität drehte sich darum, sie zu modifizieren, normalerweise zur Laufzeit (über Pre-Task oder Subroutine), manchmal zur Ladezeit des Moduls.
Group
s und/oder Connection
s zurück.Lexicon
anstelle eines dict
.db
, web
, lb
, aber dann einen Namen der zweiten Ebene namens prod
das ist immer die Vereinigung der anderen drei. Ich vergesse, wenn ich das schon zu Lexicon
hinzugefügt habe. Möglicherweise gibt es andere Map-Unterklassen, die dies auch bereits tun.if cxn in group
funktionieren würde, auch wenn cxn
eine eindeutige Objekt vom gleichen Mitglied innerhalb von group
.db
"@group
wie @task
haben und die Funktionen keine ausführbaren Arbeitseinheiten sind, sondern Gruppenobjekte ergeben.Aus der Mailingliste:
Wir haben unsere eigene interne REST-API implementiert, die env.roledefs je nach bereitgestelltem Projekt dynamisch auffüllt und stark darauf angewiesen ist, Host-Strings nicht in die Fabfile des Projekts einzubetten oder in der CLI anzugeben.
Unsere Anwendungsfälle sind:
EnvironmentDatabaseAPIClient(
'https://rest.api.url/schema/',
env.service_name,
).apply_env()
Anzahl der Serverumgebungen – mehrere Testumgebungen (einige davon privat, andere öffentlich) und mehrere Produktionsumgebungen (für verschiedene Clients). Jede Umgebung besteht aus einem oder mehreren Hosts und ist einer Fabric-Rolle zugeordnet.
Jeder Dienst ( env.service_name
im obigen Beispiel) hat unterschiedliche Umgebungen.
Wir haben auch Meta-Rollen (Rollengruppen). Ihnen wird group-
vorangestellt: group-production
, group-test
, group-external
, group-internal
, group-all
. Auf diese Weise können wir mehrere Serverrollen bereitstellen, ohne sie einzeln anzugeben, beispielsweise wird group-all
für alle Rollen bereitgestellt, sowohl für die Produktion als auch für den Test.
Wir haben spezielle Fabric-Aufgaben, um Informationen über Rollengruppen, Rollen und Hosts zu drucken.
Wir verlassen uns auch stark auf die umgekehrte Zuordnung von Host-Strings zurück zu Rollennamen (Hosts-Strings sind pro service_name eindeutig). Dies wird für die Bereitstellungsprotokollierung und Benachrichtigungen verwendet. Grundsätzlich protokollieren wir Dienstbereitstellungen auf jedem Host und senden Slack-Benachrichtigungen, wenn der Dienst auf allen Hosts in einer Rolle bereitgestellt wurde. Dafür ist der EnvironmentDatabaseAPI-Server verantwortlich (er führt Protokolle und Bereitstellungsstatus). Dies geschieht durch Dekorieren von Stoffaufgaben mit einem Dekorateur, der env.host
, env.port
und env.service_name
(plus Commit-Informationen) zurück an den API-Server sendet.
Wir planen, in Zukunft die Deployment-Authentifizierung hinzuzufügen und sehr wahrscheinlich mehr env
Variablen vom Server zu ziehen, um sie im Aufgabenkontext verfügbar zu machen.
Danke @max-arnold! Viele davon kenne ich auch aus meinen eigenen Anwendungsfällen in der Vergangenheit. Ich erinnere mich, dass insbesondere das Reverse-Mapping-Bit in v1 ein paar Mal auftauchte, also habe ich es der Liste hinzugefügt.
Damit Fabric v2 für mich nützlich wird, müsste ich fab
mitteilen,
Zuvor habe ich Rollen definiert und dann fab -R ...
. (Eigentlich wurden die Rollen programmgesteuert mit einem IP-Adressbereich definiert, aber das ist keine Voraussetzung und eine statische Liste in einer YAML-Datei wäre in Ordnung.)
Ich kann in Fabric v2 kein Äquivalent finden, und ich konnte diese Funktion auch nicht emulieren mit:
fabric.yaml
Konfigurationsdatei mitactive_hostset: null
hostsets:
myhostset:
- ...
active_hostset = config["hostsets"][config["active_hostset"]]
in fabfile.py
env INVOKE_ACTIVE_HOSTSET=myhostset fab ...
Anstelle der erwarteten Liste von Hosts bekomme ich KeyError: 'active_hostset'
.
Wir ordnen jeder Rolle für jede unserer Umgebungen in Fabric v1 verschiedene Sätze von Hosts zu, und die Umgebung wird eingerichtet, indem eine role.environment:staging
Aufgabe ausgeführt wird, um sie anzugeben. Diese Aufgabe beeinflusst also die Hosts, die von den folgenden Aufgaben verwendet werden.
In v2 haben wir versucht, eine benutzerdefinierte Aufgabe zu verwenden, aber das Problem ist, dass Executor.expand_calls
bevor unsere Aufgabe role.environment
Daher kennt keine der folgenden Aufgaben die Umgebung, um ihre Hostlisten dynamisch zu erstellen.
Wenn Sie Executor.expand_calls
einem Generator machen, kann die Aufgabenausführung die spätere Aufgabenausführung beeinflussen. Mein obiges Beispiel funktioniert also, wo wir ein benutzerdefiniertes Task
, das seine Umgebung kennen muss, um Rollen richtig auf Hosts zu erweitern. zB fab role.environment dev deploy.app
- der role.environment
Task wird jetzt ausgeführt bevor deploy.app
erweitert wird, und somit kennt deploy.app
die Umgebung und kann ihre Hosts konfigurieren und wird dann erweitert in die richtige Aufgabenstellung.
Ich habe dies in meinen Gabeln prototypiert:
https://github.com/pyinvoke/invoke/compare/master...rectalogic :expand-generator
https://github.com/fabric/fabric/compare/master...rectalogic :expand-generator
Hallo, ich weiß nach vielen Jahren nicht, was mit dieser Software passiert ist, aber ich habe das "Rollen" -Konzept in [email protected] wirklich vermisst, besonders wenn ich $ fab -R dev
Wir verwenden Rollen auch, um die gleichen Operationen in verschiedenen Umgebungen darzustellen. Vielleicht wäre es sinnvoll, das Konzept einer benannten Rolle und einer benannten Umgebung zu trennen? Wie in der Webrolle in der Entwicklungsumgebung.
Hilfreichster Kommentar
Hallo, ich weiß nach vielen Jahren nicht, was mit dieser Software passiert ist, aber ich habe das "Rollen" -Konzept in [email protected] wirklich vermisst, besonders wenn ich
$ fab -R dev