Blog

Automatisierte Bereitstellung der Docker Universal Control Plane mit Terraform und Ansible

Sebastiaan van Steenis

Aktualisiert Dezember 2, 2025
9 Minuten

Sie sind in die Docker Universal Control Plane Beta eingestiegen und wollen gleich loslegen. Dann sehen Sie eine Liste mit manuellen Befehlen zur Einrichtung. Da Sie nichts manuell machen wollen, hilft Ihnen dieser Leitfaden, DUCP in wenigen Minuten einzurichten, indem Sie nur ein paar Variablen verwenden. Wenn Sie nicht wissen, was DUCP ist, können Sie den Beitrag lesen, den ich zuvor geschrieben habe. Die Einrichtung basiert auf einem Controller und einer konfigurierbaren Anzahl von Replikaten, die sich automatisch dem Controller anschließen und einen Cluster bilden. Damit dies funktioniert, müssen wir einige Voraussetzungen erfüllen, wie z.B. die Einstellung der externen (öffentlichen) IP während der Ausführung des Installationsprogramms und die Weitergabe des Zertifikatsfingerabdrucks des Controllers an die Replikate während der Einrichtung. Wir werden Terraform verwenden, um die Instanzen zu starten, und Ansible, um die Instanzen bereitzustellen und sie miteinander zu verbinden. Voraussetzungen Aktualisiert am 25.01.2016: v0.7 wurde veröffentlicht, und es wird kein Docker Hub-Konto mehr benötigt, da die Images in den öffentlichen Namensraum verschoben wurden. Diese Version wurde im 'master'-Zweig des Github-Repositorys aktualisiert. Wenn Sie v0.6 noch ausprobieren möchten, können Sie den Tag 'v0.6' auschecken! Bevor Sie mit dem Klonen eines Repositorys und dem Ausführen von Befehlen beginnen, sollten Sie sich die Voraussetzungen ansehen. Sie benötigen:

  • Zugang zur DUCP-Beta (während der Installation müssen Sie sich mit einem Docker Hub-Konto anmelden, das der 'dockerorca'-Organisation hinzugefügt wird, getestet mit v0.5, v0.6 und v0.7. Lesen Sie den Update-Hinweis oben für weitere Informationen).
  • Ein aktives Amazon Web Services- und/oder Google Cloud Platform-Konto zur Erstellung von Ressourcen
  • Terraform (getestet mit v0.6.8 und v0.6.9)
  • Ansible (getestet mit 1.9.4 und 2.0.0.1)

Schritt 1: Klonen Sie das Repository

Die terraform.py von CiscoCloud wird als Ansible Dynamic Discovery verwendet, um unsere Terraform-bereitgestellten Instanzen zu finden, daher wird --recursive benötigt, um auch das Git-Submodul zu erhalten.

[code]git clone --recursive https://github.com/nautsio/ducp-terraform-ansible
cd ducp-terraform-ansible[/code]

Schritt 2.1: AWS-spezifische Anweisungen

Dies sind die AWS-spezifischen Anweisungen. Wenn Sie Google Cloud Platform verwenden möchten, fahren Sie mit Schritt 2.2 fort. Für die AWS-basierte Einrichtung werden Sie eine aws_security_group mit den Regeln für HTTPS (443) und SSH (22) erstellen. Mit Terraform können Sie ganz einfach festlegen, was wir brauchen, indem Sie die Ingress- und Egress-Konfigurationen für Ihre Sicherheitsgruppe angeben. Durch die Angabe von'self = true' wird die Regel auf alle Ressourcen in der zu erstellenden Sicherheitsgruppe angewendet. In der einzelnen aws_instance für den ducp_controller verwenden wir die Lookup-Funktion, um das richtige AMI aus der in vars.tf angegebenen Liste zu erhalten. Innerhalb jeder aws_instance können wir die erstellte Sicherheitsgruppe referenzieren, indem wir "${aws_security_group.ducp.name}". Das ist wirklich einfach und hält die Datei generisch. Um die Anzahl der Instanzen für ducp-replica zu konfigurieren, verwenden wir den Parameter count. Um jede Instanz in unserem Ansible-Setup zu identifizieren, geben wir einen Namen an, indem wir den Parameter tag verwenden. Da wir den Parameter count verwenden, können wir einen Namen generieren, indem wir eine vordefinierte Zeichenkette (ducp-replica) verwenden und ihr den Index der count hinzufügen. Sie können dies erreichen, indem Sie die Funktion concat wie folgt verwenden: "${concat("ducp-replica",count.index)}". Der sshUser-Parameter im Tags-Block wird von Ansible für die Verbindung mit den Instanzen verwendet. Die AMIs werden in der Datei vars.tf konfiguriert. Wenn Sie eine Region angeben, wird das richtige AMI aus der Liste ausgewählt.

variable "amis" {
    default = {
        ap-northeast-1 = "ami-46c4f128"
        ap-southeast-1 = "ami-e378bb80"
        ap-southeast-2 = "ami-67b8e304"
        eu-central-1   = "ami-46afb32a"
        eu-west-1      = "ami-2213b151"
        sa-east-1      = "ami-e0be398c"
        us-east-1      = "ami-4a085f20"
        us-west-1      = "ami-fdf09b9d"
        us-west-2      = "ami-244d5345"
    }
}

Die Liste der AMIs

    ami = "${lookup(var.amis, var.region)}"

Die Nachschlagefunktion

Lassen Sie uns die Variablen konfigurieren, damit Sie sie zur Erstellung der Instanzen verwenden können. Im Repository finden Sie eine Datei terraform.tfvars.example. Sie können diese Datei nach terraform.tfvars kopieren oder verschieben, so dass Terraform sie bei einem Plan oder einer Anwendung übernimmt.

[code]cd aws
cp terraform.tfvars.example terraform.tfvars[/code]

Öffnen Sie terraform.tfvars mit Ihrem bevorzugten Texteditor, damit Sie alle Variablen einrichten können, um die Instanzen zum Laufen zu bringen.

  • Region kann aus den verfügbaren Regionen ausgewählt werden
  • access_key und secret_key können über die Konsole abgefragt werden
  • key_name ist der Name des Schlüsselpaares, das für die Instanzen verwendet werden soll
  • replica_count definiert die Anzahl der Replikate, die Sie wünschen

Die Datei könnte wie folgt aussehen:

region = "eu-central-1"
access_key = "string_obtained_from_console"
secret_key = "string_obtained_from_console"
key_name = "my_secret_key"
replica_count = "2"

Indem Sie terraform apply ausführen, können Sie die Instanzen erstellen, lassen Sie uns das jetzt tun. Ihr Befehl sollte mit:

Vollständig bewerben! Ressourcen: 4 hinzugefügt, 0 geändert, 0 zerstört.

Schritt 2.2: Google Cloud Platform spezifische Anweisungen

In GCP ist es etwas einfacher, alles einzurichten. Da es keine Images/AMIs pro Region gibt, können wir ein Disk Image mit einem statischen Namen verwenden. Und da die google_compute_instance über eine Namensvariable verfügt, können Sie denselben Zählungstrick anwenden wie bei AWS, nur diesmal ohne die Metadaten. Wenn Sie die Knoten mit dem Tag https-server klassifizieren, wird automatisch Port 443 in der Firewall geöffnet. Da Sie den Benutzer angeben können, der mit dem von Ihnen gewählten Schlüssel erstellt werden soll, ist die Einstellung des ssh_user erforderlich, um sich später mit Ansible zu verbinden.

Lassen Sie uns unsere Google Cloud Platform-Variablen einrichten.

[code]cd gce
cp terraform.tfvars.example terraform.tfvars[/code]

Öffnen Sie terraform.tfvars mit Ihrem bevorzugten Texteditor, damit Sie alle Variablen einrichten können, um die Instanzen zum Laufen zu bringen.

Die Datei könnte wie folgt aussehen:

project = "my_gce_project"
credentials = "/path/to/file.json"
region = "europe-west1"
zone = "europe-west1-b"
ssh_user = "myawesomeusername"
replica_count = "2"

Indem Sie terraform apply ausführen, können Sie die Instanzen erstellen, lassen Sie uns das jetzt tun. Ihr Befehl sollte mit:

Vollständig bewerben! Ressourcen: 3 hinzugefügt, 0 geändert, 0 zerstört.

Schritt 3: Ansible ausführen

Die Instanzen sollten alle vorhanden sein. Lassen Sie uns nun den Controller installieren und eine Replik hinzufügen. Dieses Setup verwendet terraform.py, um die erstellten Instanzen (und IP-Adressen) auf der Grundlage der Datei terraform.tfstate abzurufen. Damit dies funktioniert, müssen Sie den Speicherort der tfstate-Datei angeben, indem Sie TERRAFORM_STATE_ROOT auf das aktuelle Verzeichnis setzen. Dann geben Sie das Skript zum Nachschlagen des Inventars (-i) und die site.yml an, in der Sie den Hosts die Rollen zuweisen können.

Es gibt zwei Rollen, die auf alle Hosts angewendet werden, die common und extip heißen. In common wird alles eingerichtet, um Docker auf den Hosts zum Laufen zu bringen, d.h. es wird das apt Repo konfiguriert, das Paket docker-engine installiert und schließlich das Paket docker-py installiert, da Ansible dieses für die Verwendung von Docker benötigt. In extip gibt es zwei Shell-Befehle, um externe IP-Adressen zu suchen. Denn wenn Sie über die externe IP-Adresse auf DUCP zugreifen möchten, sollte diese im Zertifikat enthalten sein, das DUCP generiert. Da die externen IP-Adressen auf den GCP-Instanzen nicht zu finden sind und ich einen generischen Ansatz wollte, bei dem Sie nur einen Befehl für die Bereitstellung von AWS und GCP benötigen, habe ich mich dafür entschieden, sie nachzuschlagen und schließlich die Variable extip mit derjenigen zu registrieren, die auf den Instanzen korrekt nachgeschlagen wurde. Der zweite Grund für die Verwendung der externen IP ist, dass alle Replikate die externe IP des Controllers benötigen, um sich zu registrieren. Indem Sie den Parameter --url an den join-Befehl übergeben, können Sie angeben, bei welchem Controller er sich registrieren soll.

--url https://"{{ hostvars['ducp-controller']['extip'] }}"

Die Variable extip, die von replica

Dies gilt auch für den Fingerabdruck des Zertifikats. Die Replik sollte den Fingerabdruck des Zertifikats des Controllers enthalten, um sich erfolgreich zu registrieren. Wir können auf diese Variable auf die gleiche Weise zugreifen: "{{ hostvars['ducp-controller']['ducp_controller_fingerprint'].stdout }}. Sie gibt .stdout an, um nur den stdout-Teil des Befehls zu verwenden, um den Fingerabdruck zu erhalten, da er auch Exitcode und so registriert.

Um externe Variablen bereitzustellen, können Sie vars.yml über --extra-vars einbinden. Lassen Sie uns die vars.yml einrichten, indem wir die Beispieldatei nach vars.yml kopieren und konfigurieren.

[code]cd ../ansible
cp vars.yml.example vars.yml[/code]

Wie bereits erwähnt, meldet sich das Installationsprogramm beim Docker Hub an und lädt Images herunter, die der Organisation dockerorca angehören. Ihr Konto muss zu dieser Organisation hinzugefügt werden, damit die Installation erfolgreich ist. Geben Sie die Details Ihres Docker Hub-Kontos in die Datei vars.yml ein und wählen Sie einen Admin-Benutzer und ein Admin-Passwort für Ihre Installation. Wenn Sie ssh-agent verwenden, um Ihre privaten SSH-Schlüssel zu speichern, können Sie mit dem Befehl ansible-playbook fortfahren, andernfalls können Sie Ihre private Schlüsseldatei angeben, indem Sie --private-key <priv_key_location> zur Liste der Argumente hinzufügen. Lassen Sie uns Ansible ausführen, um DUCP einzurichten. Sie müssen in das Verzeichnis wechseln, in dem sich die Datei terraform.tfstate befindet, oder TERRAFORM_STATE_ROOT entsprechend ändern.

[code]cd ../{gce,aws}
TERRAFORM_STATE_ROOT=. ansible-playbook -i ../terraform.py/terraform.py 
../ansible/site.yml 
--extra-vars "@../ansible/vars.yml"[/code]

Wenn alles gut gelaufen ist, sollten Sie etwas sehen wie:

PLAY RECAP *********************************************************************
ducp-controller            : ok=13   changed=9    unreachable=0    failed=0
ducp-replica0              : ok=12   changed=8    unreachable=0    failed=0
ducp-replica1              : ok=12   changed=8    unreachable=0    failed=0

Um unsere brandneue DUCP-Installation zu überprüfen, führen Sie den folgenden Befehl aus, um die IP-Adressen aus den erstellten Instanzen zu extrahieren:

[code]TERRAFORM_STATE_ROOT=. ../terraform.py/terraform.py --hostfile[/code]

Kopieren Sie die IP-Adresse, die vor ducp-controller steht, und öffnen Sie einen Webbrowser. Stellen Sie der Adresse https://<ip&gt; voran. Nun können Sie sich mit Ihrem gewählten Benutzernamen und Passwort anmelden.

ducp-Anmeldung

Ich möchte betonen, dass dies kein produktionsfähiges Setup ist, aber es kann Ihnen auf jeden Fall helfen, wenn Sie DUCP ausprobieren und vielleicht eine produktionsfähige Version aus diesem Setup erstellen möchten. Wenn Sie Unterstützung für andere Plattformen wünschen, stellen Sie bitte einen Antrag auf Github oder reichen Sie eine Pull-Anfrage ein. Ich werde mich gerne für Sie darum kümmern.

Verfasst von

Sebastiaan van Steenis

Contact

Let’s discuss how we can support your journey.