În articolul precedent am folosit Terraform pentru a crea un server nou în Hetzner Cloud, după care am instalat și panoul web Virtualmin. În acest articol voi prezenta același lucru, doar că voi folosi Pulumi în loc de Terraform. Așadar, Hetzner Cloud și Pulumi!
Pulumi este tot un instrument utilizat pentru IaC (Infrastructure as Code) și se aseamănă cu Terraform, în sensul că putem crea, lansa și gestiona infrastructură IT în orice cloud. Dar, spre deosebire de Terraform care folosește un limbaj de programare propriu (HashiCorp Configuration Language - HCL), Pulumi permite folosirea limbajelor de programare existente pentru a ajunge la același scop (Typescript, Javascript, Go, Python - în exemplul meu voi utiliza Typescript. La fel ca Terraform, Pulumi este open source pe GitHub și se poate folosi gratuit.
Se va folosi providerul Hetzner Cloud pentru Pulumi pentru a proviziona și gestiona resursele disponibile în Hetzner Cloud. Repository in GitHub aici: https://github.com/pulumi/pulumi-hcloud.
Lansare proiect nou
Pentru a începe un proiect nou în Pulumi, trebuie să fim într-un director gol și să rulăm următoarele comenzi:
pulumi new
--> din lista alegem Typescript
npm install @pulumi/hcloud
--> pentru instalarea dependințelor necesare providerului Hetzner Cloud
Generare token Hetzner Cloud
Acum, trebuie generat un nou API token în consola Hetzner Cloud: Security - API TOKENS - GENERATE API TOKEN.
Configurare credențiale Hetzner Cloud în Pulumi
Conform documentației, avem 2 posibilități pentru a-i arăta lui Pulumi acest token:
- setarea tokenului prin intermediul unei variabile de mediu (este varianta aleasă de mine):
export HCLOUD_TOKEN=XXXXXXXXXXXXXXXXXXXX
- setarea folosind configurarea Pulumi, dacă se preferă stocarea împreună cu stack-ul (util pentru colaborarea multi-users):
pulumi config set hcloud:token XXXXXXXXXXXXXX --secret
Creare fișiere Pulumi
În Pulumi, fișierul index.ts definește resursele stack-ului. Așadar, în acest fișier vom avea:
- declarații pentru importul bibliotecilor necesare;
- crearea unei chei SSH pentru a ne putea conecta la noua mașină din cloudul Hetzner (vom folosi functia readFileSync pentru a citi cheia publică SSH dintr-un fișier - se va indica calea absolută către fișier);
- crearea noului server în Hetzner Cloud: am stabilit imaginea ca fiind centos-8, numele instanței, tipul serverului (am ales cx11, cea mai mică instanță ideală pentru astfel de teste, dar schimbați-o în funcție de nevoile voastre), am stabilit datacenterul unde va fi ridicat noul server, i-am indicat cheia SSH și i-am indicat fișierul userdata.sh (citit tot cu funcția readFileSync) care instalează Virtualmin;
- la final, afișăm ca output IP-ul public al noii instanțe (necesar pentru a accesa Virtualmin).
Fișierul nostru index.ts va arăta astfel:
import * as pulumi from "@pulumi/pulumi";
import * as hcloud from "@pulumi/hcloud";
import { output } from "@pulumi/pulumi";
import * as fs from "fs";
import { SshKey } from "@pulumi/hcloud";
// Create a new SSH key
const sshKey = new hcloud.SshKey("my_key",
{
name: "my-key",
publicKey: fs.readFileSync("ABSOLUTE_PATH_TO_SSH_KEY/id_rsa.pub").toString(),
//the following line works too (if you choose to add the content of the public ssh key):
//publicKey: "ssh-rsa ZZZuiaC1[...nl8nPnW1[...]yDUYPOfwQ[...]"
});
const server1 = new hcloud.Server("node01", {
image: "centos-8",
name: "plm-centos8",
serverType: "cx11",
datacenter: "nbg1-dc3",
sshKeys: [sshKey.name],
userData: fs.readFileSync("./userdata.sh").toString(),
},
{
dependsOn: [sshKey]
},
);
export const publicIP = server1.ipv4Address;
Instalare Virtualmin
Fișierul userdata.sh conține codul bash care permite instalarea Virtualmin: se va face upgrade-ul distribuției Centos8, se va seta un hostname (atenție la alegerea lui, căci este obligatoriu pentru instalarea fără probleme a Virtualmin), se stabilește un utilizator care va fi adăugat în grupul wheel (după prima logare se va schimba parola sa), se copie cheia SSH în home-ul acestui utilizator (pentru a nu ne conecta cu root) și se instalează Virtualmin.
Fișierul userdata.sh conține:
dnf upgrade -y
timedatectl set-timezone "Europe/Bucharest"
hostnamectl set-hostname YOUR_DESIRED_HOSTNAME --static --pretty --transient
sed -i '/^PermitRootLogin/s/yes/no/' /etc/ssh/sshd_config
sed -i 's/PasswordAuthentication yes/PasswordAuthentication no/g' /etc/ssh/sshd_config
systemctl restart sshd
adduser YOUR_USERNAME
# Change the following password after first login!!!
echo 'ChangeMe' | passwd --stdin YOUR_USERNAME
usermod -aG wheel YOUR_USERNAME
mkdir -p /home/YOUR_USERNAME/.ssh
chmod 700 /home/YOUR_USERNAME/.ssh
cp -a /root/.ssh/authorized_keys /home/YOUR_USERNAME/.ssh/authorized_keys && rm -f /root/.ssh/authorized_keys
chown -R YOUR_USERNAME:YOUR_USERNAME /home/YOUR_USERNAME
dnf install -y wget
wget http://software.virtualmin.com/gpl/scripts/install.sh -v -O install.sh; bash install.sh -f
Rulare Pulumi
Pulumi se rulează simplu cu comanda `pulumi up`:
Precizări
- Schimbați parola userului vostru din ChangeMe în orice altceva.
- Userul root de pe server nu are parolă. Este necesară crearea unei parole pentru root, fără de care nu vom putea accesa panoul web Virtualmin.
- Accesăm Virtualmin la adresa https://IPV4:10000, folosind ca date de autentificare userul root și parola sa configurată în pasul anterior.
- Codul Pulumi și fișierul userdata.sh (care trebuie editat cu hostname-ul și username-ul dorite de voi) pot fi găsite în GitLab aici: https://gitlab.com/Bobses/hetzner-pulumi
- Spor la treabă cu Hetzner Cloud și Pulumi!
Lasă un răspuns