Erstellt eine .gitignore-Datei in eurem git-Repo
touch .gitignore
Fügt den Inhalt dieser Datei zu:
https://github.com/genughaben/world-development/blob/master/.gitignore
Living in a data-based world
Erstellt eine .gitignore-Datei in eurem git-Repo
touch .gitignore
Fügt den Inhalt dieser Datei zu:
https://github.com/genughaben/world-development/blob/master/.gitignore
Often I want to use newly created conda enviroments also from Jupyter. Therefore the enviroment needs to be added as kernel to Jupyter. You do that like so.
First make sure pip and ipykernel are installed / up-to-date.
> conda install pip > conda install ipykernel
And then enter:
conda activate <env-to-add> > python -m ipykernel install --user --name <env-to-add> --display-name "<env-to-add>"
Reference: https://ipython.readthedocs.io/en/stable/install/kernel_install.html
Frequently used by me and maybe helpful for you as well.
> conda create --name <new-env-name> --clone <envs-name-you-want-to-copy>
First install and configure aws_cli
> pip3 install awscli --upgrade --user > aws configure
Now, enter your AWS Key, AWS Secret, your standard region (i.e. eu-west-1).
WIth your <S3-Bucket> name, you can now enter:
aws s3 ls s3://<S3-Bucket> --recursive | grep -v -E "(Bucket: |Prefix: |LastWriteTime|^$|--)" | awk 'BEGIN {total=0}{total+=$3} END {print total/1024/1024" MB"}'
With this method you can also inspect the size of other public S3-Buckets.
Have fun with AWS!
Yours
Frank
In diesem Tutorial gehen wir alles durch, was nötig ist, um mit terraform auf ein Droplet aufzusetzen.
Code: https://github.com/genughaben/terraform-digitalocean-droplet
tl;dr: Provider (wie Digital Ocean) stellt die Ressourcen (VMs) zur Verfügung, die wir mit terraform anfragen, erstellen, verwalten, ändern und zerstören können.
ts;wm
Providers
Terraform wird verwendet, um Infrastrukturressourcen wie physische Maschinen, VMs, Netzwerkswitches, Container und mehr zu erstellen, zu verwalten und zu aktualisieren. Fast jeder Infrastrukturtyp kann als Ressource in Terraform dargestellt werden.
Diverse Anbieter bieten API an, über die ihr Ressourcen nutzen könnt. Anbieter sind dabei IaaS-Anbieter wie z.B. Alibaba Cloud, AWS, GCP, Microsoft Azure, OpenStack oder PaaS wie z.B. Heroku oder SaaS-Services wie z.B. Terraform Cloud, DNSimple, CloudFlare.
Wir werden hier Digital Ocean als Provider verwenden.
Resources
Ressourcen sind das wichtigste Element in der Sprache Terraform. Jeder Ressourcenblock beschreibt ein oder mehrere Infrastrukturobjekte, wie z. B. virtuelle Netzwerke, Recheninstanzen oder übergeordnete Komponenten wie DNS-Einträge.
Wir interessieren uns hier für den DO Provider und dessen Ressourcen.
Wir interessieren und hier für die Droplet-Ressource.
Erstellt, wo für euch auf eurem System sinnvoll einen Projektordner und erstellt vier Dateien:
> mkdir terraform-example > cd terraform-example > touch variables.tf > touch provider.tf > touch webserver1.tf > touch webserver.sh
Und kopiert folgende Inhalte in die Dateien:
variables.tf
variable "do_token" { type = "string" description = "Dein Digital Ocean API token" default = "<1. zwischengespeicherten Wert eingeben>" } variable "ssh_fingerprint" { type = "string" description = "Dein Digital Ocean SSH-Schlüssel-Fingerprint" default = "<2. zwischengespeicherten Wert eingeben>" } variable "pub_key" { type = "string" description = "Pfad zu deinem öffentlichen SSH-Schlüssel" default = "/home/<user-name>/.ssh/dokey.pub" } variable "pvt_key" { type = "string" description = "Pfad zu deinem privaten SSH-Schlüssl" default = "/home/<user-name>/.ssh/dokey" }
provider.tf:
provider "digitalocean" { token = "${var.do_token}" }
webserver1.tf
resource "digitalocean_droplet" "webserver1" { image = "ubuntu-18-04-x64" name = "webserver1" region = "fra1" size = "1gb" private_networking = true user_data = "${file("webserver.sh")}" ssh_keys = [ "${var.ssh_fingerprint}" ] connection { user = "root" type = "ssh" private_key = "${file(var.pvt_key)}" timeout = "2m" } }
webserver.sh
#!/bin/bash apt-get -y update apt-get -y install nginx
In eurem Projektordner gebt ihr im Terminal jetzt ein:
> terraform init
Terraform liest alle .tf-Dateien ein (daher sind deren Namen auch egal) und lädt jetzt eventuell nötige Plugins herunter.
Wenn ihr jetzt folgendes eingebt:
> terraform plan
Mit dieser Eingabe prüft Terraform, welche Resources es bereits managet ( im Moment, keine), was geändert und zerstört werden soll (hier auch nichts) und was erstellt werden soll. Und das ist eine Machine. Eure Ausgabe sollte in etwa so aussehen:
> terraform plan Refreshing Terraform state in-memory prior to plan... The refreshed state will be used to calculate this plan, but will not be persisted to local or remote state storage. ------------------------------------------------------------------------ An execution plan has been generated and is shown below. Resource actions are indicated with the following symbols: + create Terraform will perform the following actions: # digitalocean_droplet.webserver1 will be created + resource "digitalocean_droplet" "webserver1" { + backups = false + created_at = (known after apply) + disk = (known after apply) + id = (known after apply) + image = "ubuntu-18-04-x64" + ipv4_address = (known after apply) + ipv4_address_private = (known after apply) + ipv6 = false + ipv6_address = (known after apply) + ipv6_address_private = (known after apply) + locked = (known after apply) + memory = (known after apply) + monitoring = false + name = "webserver1" + price_hourly = (known after apply) + price_monthly = (known after apply) + private_networking = true + region = "fra1" + resize_disk = true + size = "1gb" + ssh_keys = [ + "<euer-SSH-Schlüssel-Fingerprint>", ] + status = (known after apply) + urn = (known after apply) + user_data = "<ein-Hash>" + vcpus = (known after apply) + volume_ids = (known after apply) } Plan: 1 to add, 0 to change, 0 to destroy. ------------------------------------------------------------------------ Note: You didn't specify an "-out" parameter to save this plan, so Terraform can't guarantee that exactly these actions will be performed if "terraform apply" is subsequently run.
Die grünlich markierte Ressourcen und ihre Angaben werden im nächsten Schritt über den Digital Oceans Provider an die Digital Ocean API geschickt, die dann ein passendes Droplet aufsetzt.
NB: Die Angaben, bei denen “computed” steht, werden dynamisch berechnet.
Im Moment ist noch nichts passert. Es wurde nur ein Plan erstellt. Ihr könnt in eurem Digital Oceans Dashboard prüfen (Droplets-Menü), dass hier noch keine neue Resource angelegt wurde.
Gebt ihr aber nun:
> terraform apply
ein und bestätigt noch einmal durch eingabe von ‘yes’ (ohne Anführungszeichen!), wird jetzt die beschriebene Resource erzeugt.
Wenn ihr jetzt im Browser eure Droplet-Liste neuladed, erscheint dort ein neues Droplet mit der Bezeichnung “webserver1”!
Gebt ihr die passende IP-Addresse in eurem Webbrowser ein, solltet ihr sehen, dass auf der Maschine durch das Skript in der webserver.sh auch ein NGINX installiert worden sein sollte.
Gratulation! Ihr habt eben euer erstes Droplet mit terraform erzeugt!
Wenn ihr es wieder loswerden wollt, geht das druch die Eingabe:
> terraform destroy
Bestätigt die Eingabe erneut mit Eingabe von ‘yes’ (ohne Anführungszeichen!)
NB: Ihr müsst für Änderungen in euren Dateien – insbesondere, wenn ihr das, was auf dem Droplet wie in webserver.sh angegeben ändern wollt, nicht selbst jedesmal alle Befehle erneut eingeben. Es reicht – sobald ihr eure Konfigurationsänderung eingegeben habt, erneut
> terraform apply
aufzurufen.
Selbstredend ist dies nur ein Beispiel. Wie schon oben beschrieben könnt ihr auch andere Anbieter nutzen und natürlich vor allem viel kompliziertere Infrastrutur-Setups erreichen, als nur eine Maschine zu starten. Vielleicht dazu in einem anderen Artikel mehr.
Bis dahin: Viel Spaß wünsche ich euch mit Terraform und eurem Digital Ocean Droplet.
p.s.: Ihr braucht mehr Webserver? Weil ihr vielleicht per Load Balancer zwei Maschinen für euren Server verwenden wollt? Die zweite Maschine könnt ihr leicht erzeugen, indem ihr:
> sed 's/webserver1/webserver2/g' webserver1.tf > webserver2.tf
eingebt.
Gebt ihr nun wieder
> terraform plan
ein, seht ihr, dass bei der nächsten Eingabe von terraform apply, zwei Droplets hochgezogen würden.
Ein Beispiel mit Loadbalancer gibt es vielleicht als nächstes.
Quelle: Dieser Artikel basiert auf dem Mini-YouTube-Kurses zu Terraform von tutorialLinux. Ich habe den Artikel aktualisiert, da der Videokurs auf einer älteren Version von terraform aufbaut.
Geht in euren Projektordner und legt einen tmp Ordner an und wechselt hinein.
project> mkdir tmp project> cd temp project/tmp>
Holt euch unter https://www.terraform.io/downloads.html für eure Destribution die passende URL. Für mich ist das unter Linux -> 64bit und dann via Rechtsklick und “Copy link addess” hole ich mir die URL. Führt damit jetzt:
project/tmp> wget <URL>
aus. Entpackt die heruntergeladene Zip-Datei mit:
project/tmp> unzip <terrform_download.zip>
Damit wurde jetzt ein Binary “terraform” entpackt. Kopiert das Binary jetzt mit:
project/tmp> sudo cp terraform /usr/local/bin/
Nach /usr/local/bin. Von dort ist es nun von überall ausführbar, da /usr/local/bin in eurer PATH Umgebungsvariablen stehen sollte. Das könnt ihr prüfen durch folgende Eingabe:
project/tmp> echo $PATH
In der Ausgabe solltest ihr jetzt auch die Pfadangabe /usr/local/bin finden.
Prüft die Erreichbarkeit von terraform kurz durch:
project/tmp> cd .. project> terraform -h
Passt alles könnt ihr den tmp Ordner jetzt löschen…
project> rm -rf tmp
… und dann dann mit terraform loslegen.
Viel Spaß!
Immer wieder ein Gesprächsthema unter entwicklern sind Commit Messages. Ich finde die Guidlines, die Udacity hier zusammengestellt hat sehr hilfreich und nachahmungswürdig.
http://udacity.github.io/git-styleguide/
Habt ihr Commit Message Styles Guides? Was verwendet ihr, um im Repo Übersicht zu behalten?