Meetup Kit

Automating Server Setup with Ansible: Ein DigitalOcean Workshop Kit

Published on May 12, 2020

Developer Advocate

Deutsch
Automating Server Setup with Ansible: Ein DigitalOcean Workshop Kit

Automatisieren der Servereinrichtung mit Ansible Workshop Kit-Materialien

Dieses Workshop Kit ist so konzipiert, dass es einem technischen Fachpublikum erlaubt, sich mit Konfigurationsmanagementkonzepten sowie der Verwendung von Ansible zur Automatisierung der Serverinfrastruktureinrichtung vertraut zu machen.

Das Ziel des Kits besteht darin, einem Redner einen kompletten Ressourcensatz zum Abhalten einer Veranstaltung und Halten einer Einführungsrede über Ansible bereitzustellen. Das Kit beinhaltet:

  • Folien und Redemanuskripte, einschließlich kurzer Demovideos und Anweisungen zur Ausführung einer optionalen Live-Demo. Dieser Vortrag hat eine Länge von etwa 50 Minuten.
  • Ein GitHub-Repository, das den Demo-App-Code und die erforderlichen Ansible-Skripte für die Bereitstellung dieser Anwendung auf einem Ubuntu-Server enthält.
  • Dieses Tutorial, das einen Benutzer durch die Bereitstellung der Travellist-Demo der Laravel-Anwendung auf einem Remoteserver leitet.

Dieses Tutorial ist als Ergänzung für die Vortrags-Demo inklusive zusätzlicher Details und Erläuterungen gedacht. Außerdem dient es als Referenz für Leser, die unter Einsatz von Ansible eine Laravel-Anwendung auf einem Ubuntu-Remoteserver bereitstellen möchten.

Einführung

Server-Automatisierung spielt aufgrund der Löschbarkeit von modernen Anwendungsumgebungen eine wesentliche Rolle bei der Systemverwaltung. Üblicherweise werden zur Optimierung der automatisierten Einrichtung von Servern Tools für das Konfigurationsmanagement wie z. B. Ansible verwendet, um Standardverfahren für neue Server festzulegen. Das hat den Vorteil, dass sich mit manuellen Konfigurationen verbundene menschliche Fehler verringern lassen.

Ansible bietet eine einfache Architektur, die keiner speziellen Software für die Installation auf Knoten bedarf. Des Weiteren bietet es eine Reihe stabiler Funktionen und integrierter Module, die das Schreiben von Automatisierungsskripts erleichtern.

Dieses Tutorial, das als Begleitung zu den Folien und Redemanuskripten für die Automatisierung der Servereinrichtung mit Ansible Workshop Kit gedacht ist, zeigt Ihnen, wie Sie eine Inventurdatei einrichten und eine Reihe von Bereitstellungsskripten ausführen können, um das Verfahren der Einrichtung eines LEMP-Remoteservers (Linux, (E)Nginx, MariaDB und PHP-FPM) unter Ubuntu 18.04 vollständig zu automatisieren und in diesem System eine Laravel-Demoanwendung bereitzustellen.

Anmerkung: Dieses Material soll zeigen, wie Sie mit Ansible Playbooks zur Automatisierung der Servereinrichtung verwenden können. Unsere Demo besteht zwar aus einer Laravel-Anwendung, die auf einem LEMP-Server ausgeführt wird, doch werden Leser dazu ermutigt, die enthaltene Einrichtung ihren Anforderungen entsprechend zu ändern und anzupassen.

Voraussetzungen

Um dieser Anleitung zu folgen, benötigen Sie:

Schritt 1 — Klonen des Demo-Repository

Als Erstes müssen wir das Repository, das die Ansible-Bereitstellungsskripte enthält, und die Laravel-Demoanwendung klonen, die wir auf den Remoteservern bereitstellen werden. Alle erforderlichen Dateien finden Sie im Github-Repository do-community/ansible-laravel-demo.

Nachdem Sie sich als sudo-Benutzer bei Ihrem Ansible-Steuerknoten angemeldet haben, klonen Sie das Repository und navigieren Sie zu dem Verzeichnis, das Sie mit dem Befehl git erstellt haben:

  1. git clone https://github.com/do-community/ansible-laravel-demo.git
  2. cd ansible-laravel-demo

Nun können Sie einen ls-Befehl ausführen, um den Inhalt des geklonten Repository zu inspizieren:

  1. ls -l --group-directories-first

Die Ausgabe sieht dann so aus:

ansible-laravel-demo
drwxrwxr-x 3 sammy sammy 4096 Mar 24 15:24 application
drwxrwxr-x 2 sammy sammy 4096 Mar 24 15:24 group_vars
drwxrwxr-x 7 sammy sammy 4096 Mar 24 15:24 roles
-rw-rw-r-- 1 sammy sammy  102 Mar 24 15:24 inventory-example
-rw-rw-r-- 1 sammy sammy 1987 Mar 24 15:24 laravel-deploy.yml
-rw-rw-r-- 1 sammy sammy  794 Mar 24 15:24 laravel-env.j2
-rw-rw-r-- 1 sammy sammy  920 Mar 24 15:24 readme.md
-rw-rw-r-- 1 sammy sammy  318 Mar 24 15:24 server-setup.yml

Hier ist eine Übersicht über die einzelnen Ordner und Dateien sowie über deren Funktion:

  • application/: Dieses Verzeichnis enthält die Laravel-Demoanwendung, die im Laufe des Workshops auf dem Remoteserver bereitgestellt wird.
  • group_vars/: Dieses Verzeichnis enthält Variablendateien, die benutzerdefinierte Optionen für die Anwendungseinrichtung enthalten, z. B. Datenbankanmeldeinformationen sowie Angaben zum Speicherort der Anwendungsdateien auf dem Remoteserver.
  • roles/: Dieses Verzeichnis enthält die verschiedenen Ansible-Rollen, die die Bereitstellung eines Ubuntu-LEMP-Servers handhaben.
  • inventory-example: Diese Datei kann als Basis zur Erstellung eines benutzerdefinierten Inventars für Ihre Infrastruktur verwendet werden.
  • laravel-deploy.yml: Dieses Playbook stellt die Laravel-Demoanwendung auf dem Remoteserver bereit.
  • laravel-env.j2: Diese Vorlage wird vom Playbook laravel-deploy.yml zur Einrichtung der Anwendungsumgebungsdatei verwendet.
  • readme.md: Diese Datei enthält allgemeine Informationen über die in diesem Repository enthaltene Bereitstellung.
  • server-setup.yml: Dieses Playbook stellt unter Verwendung der im Verzeichnis roles/ definierten Rollen einen LEMP-Server bereit.

Schritt 2 — Einrichten der Inventardatei und Testen der Verbindung zu Knoten

Jetzt erstellen wir eine Inventardatei, um die Hosts aufzulisten, die wir mit Ansible verwalten möchten. Kopieren Sie zunächst die Datei inventory-example in eine neue Datei namens hosts:

  1. cp inventory-example hosts

Verwenden Sie nun einen Texteditor Ihrer Wahl zum Öffnen der neuen Inventardatei und zum Aktualisieren Ihrer eigenen Server. Wir verwenden hier nano:

  1. nano hosts

Das Beispielinventar, das Teil des Workshop Kits ist, enthält zwei Ansible-Gruppen: dev und production. Dadurch soll gezeigt werden, wie sich Gruppenvariablen verwenden lassen, um die Bereitstellung in verschiedenen Umgebungen anzupassen. Wenn Sie diese Einrichtung mit einem einzigen Knoten testen möchten, können Sie entweder die Gruppe dev oder production verwenden und die andere aus der Inventardatei entfernen.

ansible-laravel-demo/hosts
[dev]
203.0.113.0.101

[prod]
203.0.113.0.102

[all:vars]
ansible_python_interpreter=/usr/bin/python3

Anmerkung: Die Variable ansible_python_interpreter definiert den Pfad zur ausführbaren Python-Datei auf dem Remotehost. Hier weisen wir Ansible an, diese Variable für alle Hosts in dieser Inventardatei festzulegen.

Speichern und schließen Sie die Datei, wenn Sie fertig sind. Wenn Sie nano verwenden, können Sie Strg+X drücken, dann Y eingeben und zur Bestätigung ENTER drücken.

Sobald Sie Ihre Inventardatei angepasst haben, können Sie das ping-Ansible-Modul ausführen, um zu testen, ob der Steuerknoten eine Verbindung mit den Hosts herstellen kann:

  1. ansible all -i hosts -m ping -u root

Lassen Sie uns den Befehl aufschlüsseln:

  • all: Diese Option weist Ansible an, den folgenden Befehl auf allen Hosts in der designierten Inventardatei auszuführen.
  • -i hosts: Gibt an, welches Inventar verwendet werden soll. Wenn diese Option nicht angegeben ist, wird Ansible versuchen, das standardmäßige Inventar zu verwenden, das sich typischerweise unter /etc/ansible/hosts befindet.
  • -m ping: Damit wird das ping-Ansible-Modul ausgeführt, das die Verbindung mit Knoten testen wird und prüft, ob sich die ausführbare Python-Datei auf den Remotesystemen finden lässt.
  • -u root: Diese Option gibt an, welcher Remotebenutzer zur Verbindung mit den Knoten verwendet werden soll. Wir verwenden hier das Root-Konto als Beispiel, da dies in der Regel das einzige Konto ist, das auf neu eingerichteten Servern verfügbar ist. Je nach Ihrem Infrastrukturanbieter und der SSH-Konfiguration können weitere Verbindungsoptionen erforderlich sein.

Wenn Ihre SSH-Verbindung zu den Knoten richtig eingerichtet ist, erhalten Sie folgende Ausgabe:

Output
203.0.113.0.101 | SUCCESS => { "changed": false, "ping": "pong" } 203.0.113.0.102 | SUCCESS => { "changed": false, "ping": "pong" }

Die pong-Antwort bedeutet, dass sich Ihr Steuerknoten mit den verwalteten Knoten verbinden kann und Ansible dazu in der Lage ist, Python-Befehle auf den Remotehosts auszuführen.

Schritt 3 — Einrichten von Variablendateien

Bevor Sie die in diesem Workshop Kit enthaltenen Playbooks ausführen, müssen Sie zunächst die Variablendatei bearbeiten, die Einstellungen wie den Namen des zu erstellenden Remotebenutzers sowie die mit MariaDB einzurichtenden Datenbankanmeldeinformationen enthält.

Öffnen Sie mit Ihrem bevorzugten Texteditor die Datei group_vars/all:

  1. nano group_vars/all.yml
ansible-laravel-demo/group_vars/all.yml
---
# Initial Server Setup
remote_user: sammy

# MySQL Setup
mysql_root_password: MYSQL_ROOT_PASSWORD
mysql_app_db: travellist
mysql_app_user: travellist_user
mysql_app_pass: DB_PASSWORD

# Web Server Setup
http_host: "{{ ansible_facts.eth0.ipv4.address }}"
remote_www_root: /var/www
app_root_dir: travellist-demo
document_root: "{{ remote_www_root }}/{{ app_root_dir }}/public"

# Laravel Env Variables
app_name: Travellist
app_env: dev
app_debug: true
app_url: "http://{{ http_host }}"
db_host: localhost
db_port: 3306
db_database: "{{ mysql_app_db }}"
db_user: "{{ mysql_app_user }}"
db_pass: "{{ mysql_app_pass }}"

Die Variablen, die Ihre Aufmerksamkeit benötigen, sind:

  • remote_user: Der angegebene Benutzer wird auf dem Remoteserver erstellt und erhält sudo-Berechtigungen.
  • mysql_root_password: Diese Variable definiert das Datenbank-Rootpasswort für den MariaDB-Server. Beachten Sie, dass es sich dabei um ein sicheres Passwort Ihrer Wahl handeln sollte.
  • mysql_app_db: Der Name der Datenbank, die für die Laravel-Anwendung erstellt wird. Sie müssen diesen Wert nicht ändern, können es aber auf Wunsch tun. Dieser Wert wird zur Einrichtung der Laravel-Konfigurationsdatei .env verwendet.
  • mysql_app_user: Der Name des Datenbankbenutzers für die Laravel-Anwendung. Auch hier müssen Sie den Wert nicht ändern, können es aber auf Wunsch tun.
  • mysql_app_pass: Das Datenbankpasswort für die Laravel-Anwendung. Das sollte ein sicheres Passwort Ihrer Wahl sein.
  • http_host: Der Domänenname oder die IP-Adresse des Remotehosts. Hier verwenden wir ein Ansible-Fakt, das die IPv4-Adresse für die Netzwerkschnittstelle eth0 enthält. Wenn Sie über Domänennamen verfügen, die auf Ihre Remotehosts verweisen, möchten Sie ggf. für jeden dieser Namen separate Variablendateien erstellen, um diesen Wert zu überschreiben, damit die Nginx-Konfiguration den richtigen Hostnamen für jeden Server enthält.

Wenn Sie mit der Bearbeitung dieser Werte fertig sind, speichern und schließen Sie die Datei.

Erstellen zusätzlicher Variablendateien für verschiedene Umgebungen

Wenn Sie Ihre Inventardatei mit mehreren Knoten eingerichtet haben, wollen Sie möglicherweise zusätzliche Variablendateien erstellen, um jeden Knoten entsprechend zu konfigurieren. In unserem Beispielinventar haben wir zwei verschiedene Gruppen erstellt: dev und production. Um zu vermeiden, dass in beiden Umgebungen dieselben Datenbank-Anmeldeinformationen und andere Einstellungen verwendet werden, müssen wir eine separate Variablendatei für die Produktionswerte erstellen.

Vielleicht möchten Sie die standardmäßige Variablendatei kopieren und sie als Basis für Ihre Produktionswerte nutzen:

  1. cp group_vars/all.yml group_vars/production.yml
  2. nano group_vars/production.yml

Da die Datei all.yml die Standardwerte enthält, die für alle Umgebungen gültig sein sollen, können Sie alle Variablen entfernen, die in der neuen Datei production.yml keine Änderung benötigen. Die Variablen, die Sie für die jeweilige Umgebung aktualisieren sollten, sind hier hervorgehoben:

ansible-laravel-demo/group_vars/production
---
# Initial Server Setup
remote_user: prod_user

# MySQL Setup
mysql_root_password: MYSQL_PROD_ROOT_PASSWORD
mysql_app_pass: MYSQL_PROD_APP_PASSWORD

# Laravel Env Variables
app_env: prod
app_debug: false

Beachten Sie, dass wir den Wert app_env in prod geändert haben und den Wert app_debug auf false gesetzt haben. Das sind die empfohlenen Laravel-Einstellungen für Produktionsumgebungen.

Wenn Sie die Anpassung Ihrer Produktionsvariablen abgeschlossen haben, speichern und schließen Sie die Datei.

Verschlüsseln von Variablendateien mit Ansible Vault

Wenn Sie planen, Ihre Ansible-Einrichtung mit anderen Benutzern zu teilen, ist es wichtig, die Datenbank-Anmeldeinformationen und andere sensible Daten in Ihren Variablendateien sicher aufzubewahren. Das ist mit Ansible Vault möglich, einer Funktion, die standardmäßig in Ansible enthalten ist. Mit Ansible Vault können Sie Variablendateien verschlüsseln, damit nur Benutzer, die Zugriff auf das Vault-Passwort haben, die Dateien anzeigen, bearbeiten oder entschlüsseln können. Außerdem wird das Vault-Passwort für die Ausführung eines Playbooks oder Befehls benötigt, das bzw. der verschlüsselte Dateien nutzt.

Um Ihre Produktionsvariablendatei zu verschlüsseln, führen Sie Folgendes aus:

  1. ansible-vault encrypt group_vars/production.yml

Sie werden dazu aufgefordert, ein Vault-Passwort anzugeben und zu bestätigen. Wenn Sie damit fertig sind und die Inhalte dieser Datei überprüfen, sehen Sie, dass die Daten nun verschlüsselt sind.

Wenn Sie die Variablendatei anzeigen möchten, ohne ihren Inhalt zu ändern, können Sie den Befehl view verwenden:

  1. ansible-vault view group_vars/production.yml

Sie werden dazu aufgefordert, das gleiche Passwort einzugeben, das Sie festgelegt haben, als Sie diese Datei mit ansible-vault verschlüsselt haben. Nach Eingabe des Passworts wird der Inhalt der Datei in Ihrem Terminal angezeigt. Geben Sie q ein, um die Dateiansicht zu beenden.

Um eine zuvor mit Ansible Vault verschlüsselte Datei zu bearbeiten, verwenden Sie den Vault-Befehl edit:

  1. ansible-vault edit group_vars/production.yml

Bei diesem Befehl werden Sie dazu aufgefordert, das Vault-Passwort für diese Datei anzugeben. Dann wird Ihr standardmäßiger Terminal-Editor genutzt, um die Datei zur Bearbeitung zu öffnen. Speichern und schließen Sie die Datei nach dem Vornehmen der gewünschten Änderungen, woraufhin sie durch Ansible Vault automatisch verschlüsselt wird.

Jetzt haben Sie die Einrichtung Ihrer Variablendateien abgeschlossen. Im nächsten Schritt führen wir das Playbook aus, um Nginx, PHP-FPM und MariaDB (die zusammen mit einem Linux-basierten Betriebssystem wie Ubuntu den LEMP-Stack bilden) auf Ihrem bzw. Ihren Remoteservern einzurichten.

Schritt 4 — Ausführen des LEMP-Playbook

Bevor wir die Laravel-Demoanwendung auf den Remoteservern bereitstellen, müssen wir eine LEMP-Umgebung einrichten, die die Anwendung bereitstellen wird. Das Playbook server-setup.yml enthält die zur Einrichtung erforderlichen Ansible-Rollen. Um dessen Inhalte zu inspizieren, führen Sie Folgendes aus:

  1. cat server-setup.yml
ansible-laravel-demo/server-setup.yml
---
- hosts: all
  become: true
  roles:
    - { role: setup, tags: ['setup'] }

    - { role: mariadb, tags: ['mysql', 'mariadb', 'db', 'lemp'] }

    - { role: php, tags: ['php', 'web', 'php-fpm', 'lemp'] }

    - { role: nginx, tags: ['nginx', 'web', 'http', 'lemp'] }

    - { role: composer, tags: ['composer'] }

Hier ist eine Übersicht über alle in diesem Playbook enthaltenen Rollen:

  • setup: Enthält die Aufgaben, die zur Erstellung eines neuen Systembenutzers und Gewährung von sudo-Berechtigungen sowie zur Aktivierung der ufw-Firewall erforderlich sind.
  • mariadb: Installiert den MariaDB-Datenbankserver und erstellt die Anwendungsdatenbank sowie den Benutzer.
  • php: Installiert php-fpm und PHP-Module, die zur Ausführung einer Laravel-Anwendung benötigt werden.
  • nginx: Installiert den Nginx-Webserver und ermöglicht Zugriff an Port 80.
  • composer: Installiert Composer global.

Beachten Sie, dass wir in jeder Rolle einige Tags eingerichtet haben. Dies soll es erlauben, bei Bedarf nur Teile dieses Playbooks neu auszuführen. Wenn Sie Änderungen an Ihrer Nginx-Vorlagendatei vornehmen, möchten Sie möglicherweise nur die Nginx-Rolle ausführen.

Der folgende Befehl führt dieses Playbook aus Ihrer Inventardatei auf allen Servern aus. --ask-vault-pass ist nur erforderlich, falls Sie im vorherigen Schritt ansible-vault verwendet haben, um verschiedene Variablendateien zu verschlüsseln:

  1. ansible-playbook -i hosts server-setup.yml -u root --ask-vault-pass

Sie werden eine Ausgabe sehen, die dieser ähnelt:

Output
PLAY [all] ********************************************************************************************** TASK [Gathering Facts] ********************************************************************************** ok: [203.0.113.0.101] ok: [203.0.113.0.102] TASK [setup : Install Prerequisites] ******************************************************************** changed: [203.0.113.0.101] changed: [203.0.113.0.102] ... RUNNING HANDLER [nginx : Reload Nginx] ****************************************************************** changed: [203.0.113.0.101] changed: [203.0.113.0.102] PLAY RECAP ********************************************************************************************** 203.0.113.0.101 : ok=31 changed=27 unreachable=0 failed=0 skipped=0 rescued=0 ignored=1 203.0.113.0.102 : ok=31 changed=27 unreachable=0 failed=0 skipped=0 rescued=0 ignored=1

Ihre Knoten sind nun bereit, PHP-Anwendungen mit Nginx+PHP-FPM bereitzustellen, wobei MariaDB als Datenbankserver dient. Im nächsten Schritt werden wir die enthaltene Laravel-Demoanwendung mit dem Ansible-Playbook laravel-deploy.yml bereitstellen.

Schritt 5 — Bereitstellen der Laravel-Anwendung

Nachdem Sie auf Ihrem bzw. Ihren Remoteservern nun über eine funktionierende LEMP-Umgebung verfügen, können Sie das Playbook laravel-deploy.yml ausführen. Dieses Playbook führt folgende Aufgaben aus:

  1. Erstellen Sie den Anwendungsdokument-Root auf dem Remoteserver, wenn dies noch nicht geschehen ist.
  2. Synchronisieren Sie den lokalen Anwendungsordner zum Remoteserver mit dem Modul sync.
  3. Verwenden Sie das Modul acl, um Berechtigungen für den Benutzer www-data für den Speicherordner festzulegen.
  4. Richten Sie die Anwendungsdatei .env auf Grundlage der Vorlage laravel-env.j2 ein.
  5. Installieren Sie Anwendungsabhängigkeiten mit Composer.
  6. Erstellen Sie den Anwendungssicherheitsschlüssel.
  7. Richten Sie einen öffentlichen Link für den Ordner storage ein.
  8. Führen Sie Datenbankmigrationen und Seeder aus.

Dieses Playbook sollte von einem non-root user, aber mit sudo-Berechtigungen ausgeführt werden. Dieser Benutzer sollte erstellt worden sein, als Sie im vorherigen Schritt das Playbook server-setup.yml ausgeführt haben – unter Verwendung des Namens, der von der Variable remote_user definiert wird.

Wenn Sie bereit sind, führen Sie das Playbook laravel-deploy.yml aus mit:

  1. ansible-playbook -i hosts laravel-deploy.yml -u sammy --ask-vault-pass

--ask-vault-pass ist nur erforderlich, falls Sie im vorherigen Schritt ansible-vault verwendet haben, um Variablendateien zu verschlüsseln:

Sie werden eine Ausgabe sehen, die dieser ähnelt:

Output
PLAY [all] ********************************************************************************************** TASK [Gathering Facts] ********************************************************************************** ok: [203.0.113.0.101] ok: [203.0.113.0.102] TASK [Make sure the remote app root exists and has the right permissions] ******************************* ok: [203.0.113.0.101] ok: [203.0.113.0.102] TASK [Rsync application files to the remote server] ***************************************************** ok: [203.0.113.0.101] ok: [203.0.113.0.102] ... TASK [Run Migrations + Seeders] ************************************************************************* ok: [203.0.113.0.101] ok: [203.0.113.0.102] PLAY RECAP ********************************************************************************************** 203.0.113.0.101 : ok=10 changed=9 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0 203.0.113.0.102 : ok=10 changed=9 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0

Sobald die Ausführung abgeschlossen ist, können Sie auf die Demoanwendung zugreifen, indem Sie Ihren Browser auf den Domänennamen oder die IP-Adresse Ihres Knotens verweisen:

http://node_domain_or_IP

Sie sehen eine Seite wie diese:

Laravel Travellist-Demo

Zusammenfassung

Dieses Tutorial zeigt, wie Sie eine Ansible-Inventardatei einrichten, eine Verbindung mit Remoteknoten herstellen und Ansible-Playbooks ausführen, um einen LEMP-Server einzurichten und eine Laravel-Demoanwendung darauf bereitzustellen. Dieser Leitfaden ergänzt die Automatisierung der Servereinrichtung um Folien und Redemanuskripte des Ansible Workshop Kit und wird von einem beispielhaften GitHub-Repository begleitet, das alle erforderlichen Dateien zum Befolgen der Demokomponente des Workshops enthält.

Thanks for learning with the DigitalOcean Community. Check out our offerings for compute, storage, networking, and managed databases.

Learn more about our products

About the authors
Default avatar

Developer Advocate

Dev/Ops passionate about open source, PHP, and Linux.

Still looking for an answer?

Ask a questionSearch for more help

Was this helpful?
 
Leave a comment


This textbox defaults to using Markdown to format your answer.

You can type !ref in this text area to quickly search our full set of tutorials, documentation & marketplace offerings and insert the link!

Try DigitalOcean for free

Click below to sign up and get $200 of credit to try our products over 60 days!

Sign up

Join the Tech Talk
Success! Thank you! Please check your email for further details.

Please complete your information!

Featured on Community

Get our biweekly newsletter

Sign up for Infrastructure as a Newsletter.

Hollie's Hub for Good

Working on improving health and education, reducing inequality, and spurring economic growth? We'd like to help.

Become a contributor

Get paid to write technical tutorials and select a tech-focused charity to receive a matching donation.

Welcome to the developer cloud

DigitalOcean makes it simple to launch in the cloud and scale up as you grow — whether you're running one virtual machine or ten thousand.

Learn more