Terraformaanbieder Selectel

Terraformaanbieder Selectel

We hebben een officiële Terraform-provider gelanceerd om met Selectel te werken. Met dit product kunnen gebruikers resource management volledig implementeren via de Infrastructure-as-code-methodologie.

De provider ondersteunt momenteel serviceresourcebeheer "Virtuele privécloud" (hierna VPC genoemd). In de toekomst zijn we van plan om resource management toe te voegen voor andere diensten van Selectel.

Zoals u al weet, is de VPC-service gebouwd op OpenStack. Omdat OpenStack echter geen native tools biedt voor het bedienen van de publieke cloud, hebben we de ontbrekende functionaliteit geïmplementeerd in een reeks aanvullende API's die het beheer van complexe samengestelde objecten vereenvoudigen en het werk gemakkelijker maken. Een deel van de functionaliteit die beschikbaar is in OpenStack is gesloten voor direct gebruik, maar is wel beschikbaar via onze API.

De Selectel Terraform-provider biedt nu de mogelijkheid om de volgende VPC-bronnen te beheren:

  • projecten en hun quota;
  • gebruikers, hun rollen en tokens;
  • openbare subnetten, inclusief interregionaal en VRRP;
  • softwarelicenties.

De provider gebruikt onze openbare Go-bibliotheek om met de VPC API te werken. Zowel de bibliotheek als de aanbieder zelf zijn open-source, hun ontwikkeling vindt plaats op Github:

Voor het beheren van andere cloudbronnen, zoals virtuele machines, schijven en Kubernetes-clusters, kunt u de OpenStack Terraform-provider gebruiken. Officiële documentatie voor beide providers is beschikbaar via de volgende links:

Aan de slag

Om te beginnen moet je Terraform installeren (instructies en links naar installatiepakketten zijn te vinden op de officiële website).

Om te kunnen werken heeft de provider een Selectel API-sleutel nodig, die is aangemaakt in accountcontrolepanelen.

Manifesten voor het werken met Selectel worden gemaakt met Terraform of met behulp van een set kant-en-klare voorbeelden die beschikbaar zijn in onze Github-repository: terraform-voorbeelden.

De repository met voorbeelden is verdeeld in twee mappen:

  • modules, met kleine herbruikbare modules die een reeks parameters als invoer gebruiken en een kleine reeks bronnen beheren;
  • voorbeelden, met voorbeelden van een complete set onderling verbonden modules.

Nadat we Terraform hebben geïnstalleerd, een Selectel API-sleutel hebben aangemaakt en vertrouwd zijn geraakt met de voorbeelden, gaan we verder met praktische voorbeelden.

Een voorbeeld van het maken van een server met een lokale schijf

Laten we eens kijken naar een voorbeeld van het maken van een project, een gebruiker met een rol en een virtuele machine met een lokale schijf: terraform-examples/examples/vpc/server_local_root_disk.

In bestand vars.tf alle parameters die zullen worden gebruikt bij het aanroepen van modules worden beschreven. Sommigen van hen hebben standaardwaarden, de server wordt bijvoorbeeld in de zone gemaakt ru-3a met de volgende configuratie:

variable "server_vcpus" {
default = 4
}

variable "server_ram_mb" {
default = 8192
}

variable "server_root_disk_gb" {
default = 8
}

variable "server_image_name" {
default = "Ubuntu 18.04 LTS 64-bit"
}

In bestand hoofd.tf De Selectel-provider wordt geïnitialiseerd:

provider "selectel" {
token    = "${var.sel_token}"
}

Dit bestand bevat ook de standaardwaarde voor de SSH-sleutel die op de server wordt geïnstalleerd:

module "server_local_root_disk" {
...
server_ssh_key      = "${file("~/.ssh/id_rsa.pub")}"
}

Indien nodig kunt u een andere openbare sleutel opgeven. De sleutel hoeft niet als bestandspad te worden opgegeven; u kunt de waarde ook als string toevoegen.

Verderop in dit bestand worden de modules gelanceerd project_met_gebruiker и server_local_root_disk, die de benodigde middelen beheren.

Laten we deze modules in meer detail bekijken.

Een project en een gebruiker met een rol aanmaken

De eerste module maakt een project aan en een gebruiker met een rol in dat project: terraform-examples/modules/vpc/project_with_user.

De aangemaakte gebruiker kan inloggen op OpenStack en de bronnen beheren. De module is eenvoudig en beheert slechts drie entiteiten:

  • selectel_vpc_project_v2,
  • selectel_vpc_user_v2,
  • selectel_vpc_role_v2.

Een virtuele server maken met lokale schijf

De tweede module behandelt het beheer van OpenStack-objecten, die nodig zijn om een ​​server met een lokale schijf te creëren.

U moet aandacht besteden aan enkele van de argumenten die in deze module voor de bron zijn opgegeven openstack_compute_instance_v2:

resource "openstack_compute_instance_v2" "instance_1" {
  ...

  lifecycle {
    ignore_changes = ["image_id"]
  }

  vendor_options {
    ignore_resize_confirmation = true
  }
}

argument negeer_wijzigingen Hiermee kunt u attribuutwijzigingen negeren id voor de afbeelding die is gebruikt om de virtuele machine te maken. In de VPC-service worden de meeste openbare afbeeldingen één keer per week automatisch bijgewerkt en tegelijkertijd hun id verandert ook. Dit komt door de eigenaardigheden van de OpenStack-component - Glance, waarin afbeeldingen als onveranderlijke entiteiten worden beschouwd.

Als u een bestaande server of schijf maakt of wijzigt met als argument afbeelding_id gebruikt id public image, waarna, nadat die image is bijgewerkt, het Terraform-manifest opnieuw wordt uitgevoerd, de server of schijf opnieuw wordt gemaakt. Een argument gebruiken negeer_wijzigingen kunt u een dergelijke situatie vermijden.

Let op: betoog negeer_wijzigingen verscheen een hele tijd geleden in Terraform: trek#2525.

argument negeer_resize_confirmation nodig om de grootte van de lokale schijf, kernen of servergeheugen succesvol te wijzigen. Dergelijke wijzigingen worden via de OpenStack Nova-component aangebracht met behulp van een verzoek vergroten of verkleinen. Standaard Nova na aanvraag vergroten of verkleinen zet de server in status verifieer_resize en wacht op aanvullende bevestiging van de gebruiker. Dit gedrag kan echter worden gewijzigd, zodat Nova niet wacht op aanvullende acties van de gebruiker.

Met het opgegeven argument kan Terraform niet wachten op de status verifieer_resize voor de server en wees erop voorbereid dat de server een actieve status heeft nadat de parameters zijn gewijzigd. Het argument is beschikbaar vanaf versie 1.10.0 van de OpenStack Terraform-provider: trek#422.

Hulpbronnen creëren

Voordat u de manifesten uitvoert, moet u er rekening mee houden dat in ons voorbeeld twee verschillende providers worden gelanceerd en dat de OpenStack-provider afhankelijk is van de bronnen van de Selectel-provider, omdat het zonder het aanmaken van een gebruiker in het project onmogelijk is om de bijbehorende objecten te beheren . Helaas kunnen we om dezelfde reden de opdracht niet zomaar uitvoeren terraform van toepassing binnen ons voorbeeld. Wij moeten eerst doen dit toepassen voor moduul project_met_gebruiker en daarna voor al het andere.

Opmerking: dit probleem is nog niet opgelost in Terraform, je kunt de discussie op Github volgen op probleem #2430 и probleem #4149.

Ga naar de map om bronnen te maken terraform-examples/examples/vpc/server_local_root_disk, de inhoud zou er als volgt uit moeten zien:

$ ls
README.md	   main.tf		vars.tf

We initialiseren de modules met behulp van de opdracht:

$ terraform init

Uit de uitvoer blijkt dat Terraform de nieuwste versies downloadt van de providers die het gebruikt en alle modules controleert die in het voorbeeld worden beschreven.

Laten we eerst de module toepassen project_met_gebruiker. Dit vereist het handmatig doorgeven van waarden voor variabelen die niet zijn ingesteld:

  • sel_account met uw Selectel-rekeningnummer;
  • sel_token met uw sleutel voor Selectel API;
  • gebruikerswachtwoord met een wachtwoord voor de OpenStack-gebruiker.

De waarden voor de eerste twee variabelen moeten worden overgenomen controle panelen.

Voor de laatste variabele kunt u elk wachtwoord bedenken.

Om de module te gebruiken, moet u de waarden vervangen SEL_ACCOUNT, SEL_TOKEN и GEBRUIKERSWACHTWOORD het commando uitvoeren:

$ env 
TF_VAR_sel_account=SEL_ACCOUNT 
TF_VAR_sel_token=SEL_TOKEN 
TF_VAR_user_password=USER_PASSWORD 
terraform apply -target=module.project_with_user

Na het uitvoeren van de opdracht zal Terraform laten zien welke bronnen het wil aanmaken en om bevestiging vragen:

Plan: 3 to add, 0 to change, 0 to destroy.

Do you want to perform these actions?
Terraform will perform the actions described above.
Only 'yes' will be accepted to approve.

Enter a value: yes

Zodra het project, de gebruiker en de rol zijn aangemaakt, kunt u beginnen met het maken van de resterende resources:

$ env 
TF_VAR_sel_account=SEL_ACCOUNT 
TF_VAR_sel_token=SEL_TOKEN 
TF_VAR_user_password=USER_PASSWORD 
terraform apply

Let bij het aanmaken van bronnen op de Terraform-uitvoer met het externe IP-adres waar de aangemaakte server toegankelijk zal zijn:

module.server_local_root_disk.openstack_networking_floatingip_associate_v2.association_1: Creating...
  floating_ip: "" => "x.x.x.x"

U kunt via SSH met de aangemaakte virtuele machine werken met behulp van het opgegeven IP-adres.

Bronnen bewerken

Naast het maken van bronnen via Terraform, kunnen ze ook worden gewijzigd.

Laten we bijvoorbeeld het aantal kernen en geheugen voor onze server vergroten door de waarden voor de parameters te wijzigen server_vcpus и server_ram_mb in bestand voorbeelden/vpc/server_local_root_disk/main.tf:

-  server_vcpus        = "${var.server_vcpus}"
-  server_ram_mb       = "${var.server_ram_mb}"
+  server_vcpus        = 8
+  server_ram_mb       = 10240

Hierna controleren we tot welke veranderingen dit zal leiden met behulp van het volgende commando:

$ env 
TF_VAR_sel_account=SEL_ACCOUNT 
TF_VAR_sel_token=SEL_TOKEN 
TF_VAR_user_password=USER_PASSWORD 
terraform plan

Als gevolg hiervan heeft Terraform een ​​resourcewijziging doorgevoerd openstack_compute_instance_v2 и openstack_compute_flavor_v2.

Houd er rekening mee dat dit het opnieuw opstarten van de gemaakte virtuele machine met zich meebrengt.

Gebruik de opdracht om de nieuwe configuratie van de virtuele machine toe te passen terraform van toepassing, die we al eerder hebben gelanceerd.

Alle gemaakte objecten worden weergegeven in VPC-bedieningspanelen:

Terraformaanbieder Selectel

In onze voorbeeld opslagplaatsen U kunt ook manifesten bekijken voor het maken van virtuele machines met netwerkstations.

Voorbeeld van het maken van een Kubernetes-cluster

Voordat we naar het volgende voorbeeld gaan, ruimen we de bronnen op die we eerder hebben gemaakt. Om dit in de root van het project te doen terraform-examples/examples/vpc/server_local_root_disk Laten we de opdracht uitvoeren om OpenStack-objecten te verwijderen:

$ env 
TF_VAR_sel_account=SEL_ACCOUNT 
TF_VAR_sel_token=SEL_TOKEN 
TF_VAR_user_password=USER_PASSWORD 
terraform destroy -target=module.server_local_root_disk

Voer vervolgens de opdracht uit om Selectel VPC API-objecten te wissen:

$ env 
TF_VAR_sel_account=SEL_ACCOUNT 
TF_VAR_sel_token=SEL_TOKEN 
TF_VAR_user_password=USER_PASSWORD 
terraform destroy -target=module.project_with_user

In beide gevallen moet u het verwijderen van alle objecten bevestigen:

Do you really want to destroy all resources?
Terraform will destroy all your managed infrastructure, as shown above.
There is no undo. Only 'yes' will be accepted to confirm.

Enter a value: yes

Het volgende voorbeeld bevindt zich in de directory terraform-examples/examples/vpc/kubernetes_cluster.

In dit voorbeeld wordt een project gemaakt, een gebruiker met een rol in het project, en wordt één Kubernetes-cluster geactiveerd. In bestand vars.tf u kunt standaardwaarden zien, zoals het aantal knooppunten, hun kenmerken, de Kubernetes-versie, enz.

Om bronnen te creëren die vergelijkbaar zijn met het eerste voorbeeld, zullen we eerst beginnen met het initialiseren van modules en het maken van modulebronnen project_met_gebruikeren dan al het andere maken:

$ terraform init

$ env 
TF_VAR_sel_account=SEL_ACCOUNT 
TF_VAR_sel_token=SEL_TOKEN 
TF_VAR_user_password=USER_PASSWORD 
terraform apply -target=module.project_with_user

$ env 
TF_VAR_sel_account=SEL_ACCOUNT 
TF_VAR_sel_token=SEL_TOKEN 
TF_VAR_user_password=USER_PASSWORD 
terraform apply

We zullen de creatie en het beheer van Kubernetes-clusters overdragen via de OpenStack Magnum-component. Meer over het werken met een cluster leest u in één van onze eerdere artikelen, en zo in kennis basis.

Bij het voorbereiden van het cluster worden schijven en virtuele machines aangemaakt en worden alle benodigde componenten geïnstalleerd. De voorbereiding duurt ongeveer 4 minuten, gedurende welke tijd zal Terraform berichten weergeven zoals:

module.kubernetes_cluster.openstack_containerinfra_cluster_v1.cluster_1: Still creating... (3m0s elapsed)

Zodra de installatie is voltooid, geeft Terraform aan dat het cluster gereed is en wordt de ID ervan weergegeven:

module.kubernetes_cluster.openstack_containerinfra_cluster_v1.cluster_1: Creation complete after 4m20s (ID: 3c8...)

Apply complete! Resources: 6 added, 0 changed, 0 destroyed.

Om het gemaakte Kubernetes-cluster te beheren via het hulpprogramma kubectl u moet het clustertoegangsbestand ophalen. Ga hiervoor naar het project dat via Terraform is aangemaakt in de lijst met projecten in uw account:

Terraformaanbieder Selectel

Volg vervolgens de link zoals xxxxxx.selvpc.rudie onder de projectnaam verschijnt:

Terraformaanbieder Selectel

Voor inloggegevens gebruikt u de gebruikersnaam en het wachtwoord die u via Terraform heeft aangemaakt. Als je niet hebt vals gespeeld vars.tf of hoofd.tf in ons voorbeeld heeft de gebruiker de naam tf_gebruiker. U moet de waarde van de variabele als wachtwoord gebruiken TF_VAR_user_password, die bij het opstarten is opgegeven terraform van toepassing eerder.

Binnen het project moet je naar het tabblad gaan Kubernetes:

Terraformaanbieder Selectel

Dit is waar het cluster dat via Terraform is gemaakt, zich bevindt. Bestand downloaden voor kubectl Op het tabblad ‘Toegang’ kunt u het volgende doen:

Terraformaanbieder Selectel

Installatie-instructies bevinden zich op hetzelfde tabblad. kubectl en gebruik van de gedownloade bestanden config.yaml.

Nadat de kubectl en het instellen van de omgevingsvariabele KUBECONFIG u kunt Kubernetes gebruiken:

$ kubectl get pods --all-namespaces

NAMESPACE        NAME                                    READY  STATUS  RESTARTS AGE
kube-system   coredns-9578f5c87-g6bjf                      1/1   Running   0 8m
kube-system   coredns-9578f5c87-rvkgd                     1/1   Running   0 6m
kube-system   heapster-866fcbc879-b6998                 1/1   Running   0 8m
kube-system   kube-dns-autoscaler-689688988f-8cxhf             1/1   Running   0 8m
kube-system   kubernetes-dashboard-7bdb5d4cd7-jcjq9          1/1   Running   0 8m
kube-system   monitoring-grafana-84c97bb64d-tc64b               1/1   Running   0 8m
kube-system   monitoring-influxdb-7c8ccc75c6-dzk5f                1/1   Running   0 8m
kube-system   node-exporter-tf-cluster-rz6nggvs4va7-minion-0 1/1   Running   0 8m
kube-system   node-exporter-tf-cluster-rz6nggvs4va7-minion-1 1/1   Running   0 8m
kube-system   openstack-cloud-controller-manager-8vrmp        1/1   Running   3 8m
prometeus-monitoring   grafana-76bcb7ffb8-4tm7t       1/1   Running   0 8m
prometeus-monitoring   prometheus-75cdd77c5c-w29gb           1/1   Running   0 8m

Het aantal clusternodes kan eenvoudig via Terraform worden gewijzigd.
In bestand hoofd.tf de volgende waarde is opgegeven:

cluster_node_count = "${var.cluster_node_count}"

Deze waarde wordt vervangen door vars.tf:

variable "cluster_node_count" {
default = 2
}

U kunt de standaardwaarde wijzigen in vars.tfof geef de vereiste waarde rechtstreeks op in hoofd.tf:

-  cluster_node_count = "${var.cluster_node_count}"
+  cluster_node_count = 3

Om de wijzigingen toe te passen, zoals in het eerste voorbeeld, gebruikt u de opdracht terraform van toepassing:

$ env 
TF_VAR_sel_account=SEL_ACCOUNT 
TF_VAR_sel_token=SEL_TOKEN 
TF_VAR_user_password=USER_PASSWORD 
terraform apply

Wanneer het aantal knooppunten verandert, blijft het cluster beschikbaar. Nadat u een knooppunt via Terraform heeft toegevoegd, kunt u het zonder aanvullende configuratie gebruiken:

$ kubectl get nodes
NAME                               STATUS                     ROLES     AGE   VERSION
tf-cluster-rz6nggvs4va7-master-0   Ready,SchedulingDisabled   master    8m    v1.12.4
tf-cluster-rz6nggvs4va7-minion-0   Ready                      <none>    8m    v1.12.4
tf-cluster-rz6nggvs4va7-minion-1   Ready                      <none>    8m    v1.12.4
tf-cluster-rz6nggvs4va7-minion-2   Ready                      <none>    3m    v1.12.4

Conclusie

In dit artikel maakten we kennis met de belangrijkste manieren om mee te werken "Virtuele privécloud" via Terraform. Wij zullen blij zijn als u de officiële Selectel Terraform-aanbieder gebruikt en feedback geeft.

Eventuele gevonden bugs in de Selectel Terraform-provider kunnen worden gerapporteerd via Github-problemen.

Bron: www.habr.com

Voeg een reactie