2017-02-06 5 views
1

Wir verwenden Terraform, um Mesos DC/OS-Cluster auf AWS EC2 zu erstellen und zu zerstören. Anzahl der Agentenknoten in einer variable.tf-Datei definiert:Ist es möglich, Terraform zu bitten, AWS-Knoten mit bekannten IPs zu zerstören?

variable "instance_counts" { 
    type = "map" 
    default = { 
    master  = 1 
    public_agent = 2 
    agent  = 5 
    } 
} 

Sobald die Cluster-up, können Sie hinzufügen oder Agentenknoten entfernen, indem die Anzahl der Agenten in dieser Datei zu ändern und wieder anwenden. Terraform ist schlau genug, um den Unterschied zu erkennen und entsprechend zu handeln. Wenn es Knoten zerstört, neigt es dazu, für die Knoten mit der höchsten Nummer zu gehen. Wenn ich zum Beispiel einen dcos-Cluster mit 8 Knoten habe und 2 der Agenten terminieren möchte, würde Terraform dcos_agent_node-6 und dcos_agent_node-7 entfernen.

Was ist, wenn ich einen Agenten mit einer bestimmten IP zerstören möchte? Terraform muss sich der IPs bewusst sein, da es die Reihenfolge der Instanzen kennt. Wie hacke ich Terraform, um Agenten durch Bereitstellung der IPs zu entfernen?

Antwort

1

Ich denke, Sie missverstehen, wie Terraform funktioniert.

Terraform übernimmt Ihre Konfiguration und erstellt ein Abhängigkeitsdiagramm für die Erstellung der in der Konfiguration beschriebenen Ressourcen. Wenn es eine Statusdatei hat, überlagert es Informationen des Anbieters (z. B. AWS), um zu sehen, was bereits von Terraform erstellt und verwaltet wird, und entfernt diese aus dem Plan und erstellt möglicherweise Pläne für die Zerstörung von Ressourcen, die in der Anbieter- und Statusdatei vorhanden sind.

Wenn Sie also eine Konfiguration mit einem 6-Knoten-Cluster und einem neuen Feld haben (keine Statusdatei, nichts von Terraform in AWS erstellt), erstellt Terraform 6 Knoten. Wenn Sie es dann auf 8 Knoten setzen, wird Terraform versuchen, einen Plan mit 8 Knoten zu erstellen, realisiert, dass es bereits 6 hat und dann einen Plan erstellt, um die 2 fehlenden Knoten hinzuzufügen. Wenn Sie dann Ihre Konfiguration wieder auf 6 Knoten ändern, wird Terraform einen Plan mit 6 Knoten erstellen, Sie haben 8 Knoten und erstellen einen Zerstörungs-Plan für die Knoten 7 und 8.

Um es zu versuchen, etwas anderes zu tun Das würde bedeuten, dass die Zustandsdatei so schrecklich gehackt wird, dass sie davon ausgeht, dass sich die Knoten 7 und 8 von denen unterscheiden, die Terraform zuletzt hinzugefügt hat.

Als Beispiel Ihre Statusdatei wie folgt aussehen könnte:

{ 
    "version": 3, 
    "terraform_version": "0.8.1", 
    "serial": 1, 
    "lineage": "7b565ca6-689a-4aab-a3ec-a1ed77e83678", 
    "modules": [ 
     { 
      "path": [ 
       "root" 
      ], 
      "outputs": {}, 
      "resources": { 
       "aws_instance.test.0": { 
        "type": "aws_instance", 
        "depends_on": [], 
        "primary": { 
         "id": "i-01ee444f57aa32b8e", 
         "attributes": { 
          ... 
         }, 
         "meta": { 
          "schema_version": "1" 
         }, 
         "tainted": false 
        }, 
        "deposed": [], 
        "provider": "" 
       }, 
       "aws_instance.test.1": { 
        "type": "aws_instance", 
        "depends_on": [], 
        "primary": { 
         "id": "i-07c1999f1109a9ce2", 
         "attributes": { 
          ... 
         }, 
         "meta": { 
          "schema_version": "1" 
         }, 
         "tainted": false 
        }, 
        "deposed": [], 
        "provider": "" 
       } 
      }, 
      "depends_on": [] 
     } 
    ] 
} 

Wenn ich wieder eine einzelne Instanz anstelle von 2 dann Terraforming die i-07c1999f1109a9ce2 Instanz zu entfernen versuchen würde gehen wollte wie die Konfiguration zu sagen es sollte aws_instance.test.0 existieren aber nicht aws_instance.test.1. Um es stattdessen zu entfernen i-01ee444f57aa32b8e dann könnte ich meine Zustandsdatei bearbeiten, um die beiden herum zu drehen, und dann würde Terraform denken, dass diese Instanz stattdessen entfernt werden sollte.

Allerdings geraten Sie in ein sehr schwieriges Gebiet, sobald Sie anfangen, solche Dinge zu tun und die Statusdatei zu hacken. Während es etwas ist (kann tun (und gelegentlich möglicherweise)) sollten Sie ernsthaft darüber nachdenken, wie Sie arbeiten, wenn dies etwas anderes als ein einmaliger Fall für einen speziellen Grund ist (z. B. Verschieben von Rohstoffen in Module - jetzt einfacher gemacht mit Terraform's state mv command).

In Ihrem Fall würde ich fragen, warum Sie zwei bestimmte Knoten in einem Mesos-Cluster entfernen müssen, anstatt nur die Größe des Mesos-Clusters anzugeben. Wenn ein bestimmter Knoten schlecht ist, würde ich ihn immer beenden und Terraform erlauben, mir trotzdem einen frischen, gesunden Knoten zu bauen.

+0

Der Grund für den Abbau spezifischer Knoten ist, ich wollte ssh zu den Knoten und bereinigen zuerst.Es gibt einen Befehl zum Beenden von mesos-slave-Diensten, der die Aufgaben an einen anderen Ort verschieben und den Agenten aus dem Cluster abmelden soll. Ich brauche Terraform nur, um die Agenten zu beenden. Natürlich kann die Terminierung über die AWS-Konsole erfolgen, aber es ist einfacher, sie mit Terraform zu skripten. Ich habe einen Weg gefunden, den Agenten zu entfernen, indem ich 'terraform destroy -target' mit der angegebenen Agenten-ID starte. Es ist nicht genau das, was ich suchte (IPs), aber ich denke, das sollte für jetzt tun. – ddd

+0

Das ist eine ganz andere Frage, wie man etwas gegen eine Instanz ausführt, bevor man es stattdessen beendet. Ihr Ansatz, solche Zielknoten manuell zu zerstören, beantwortet Ihre Frage auch nicht wirklich, denn wenn Sie zum Beispiel Knoten 4 zerstören und dann die Konfiguration von 8 auf 6 reduzieren und planen/anwenden, wollen Sie Knoten 4 neu aufbauen und Knoten 7 und 7 entfernen 8. – ydaetskcoR

+0

Sie haben einen gültigen Punkt angesprochen. 'terraform destroy' behandelt nicht die Konfigurationsdatei. Es zerstört Agenten, ohne die Konfiguration zu ändern, was ein Problem für zukünftige Anwendungsfälle verursachen wird. Vielleicht ist es am besten, die Statusdatei zu manipulieren, wie Sie es gesagt haben, und dann die Anzahl in .tf zu verringern und 'terraform apply' auszuführen. – ddd

Verwandte Themen