Prin acest articol doresc sa va fac cunoscuta o metoda prin care puteti sa folositi Azure Pipelines pentru a crea infrastructura necesara deployment-ului aplicatiilor voastre. Bineinteles nu este singurul tool disponibil, dar il vom folosi in acest articol deoarece este integrat bine cu Azure, solutia de cloud public de la Microsoft.

Conceptul de Infrastructure as Code (IaC) nu este unul nou, si se bazeaza pe ideea de template pentru a crea resurse, fie ele masini virtuale, baze de date Platform as a Service (PaaS) sau orice serviciu oferit de un provider de cloud, fie el public sau privat. Se pot crea in acest fel arhitecturi intregi folosind doar cateva fisere text care descriu toata infrastructura necesara si toate interdependentele. Bineinteles, este un proces care consuma timp in faza incipienta, dar odata ce fisierele de configurare sunt create, acestea pot fi folosite sa creeze sau sa distruga infrastructura din cateva clickuri. Acest lucru este în mod special de folos atunci cand faceti acest lucru destul de des, fiind recomandat ca best practice in cazul developerilor care testeaza scenarii sau au nevoie medii diferite, cu versiuni software diferite pentru aplicatiile lor.

Scenariul nostru va include un repository in Github care va contine template-urile noastre in format json. Se pot folosi o multitudine de variante, chiar si repo-uri Git private, dar noi vom merge pe Github pentru simplitate. Repo-ul va avea 2 branch-uri, unul de Productie si altul de testare (Dev). Pentru fiecare branch vom implementa o logica in Azure Pipelines pentru a crea sau actualiza infrastructura dupa plac. Aceasta infrastructura va fi formată in cazul nostru din 2 mașini virtuale (VM), care vor corespunde celor 2 branch-uri din repo. Adica una de Productie si una de Dev. Lucrurile pot fi mult mai complicate de atat, dar pentru a demonstra ideea de baza, fara sa ne complicam cu detalii inutile, va fi suficient.

Pentru inceput vom avea nevoie de urmatoarele:

Mai intai voi descrie in linii mari pasii pe care va trebui sa ii urmam:
1. In cazul in care nu avem deja creat template-ul pentru infrastructura dorita, putem sa exportam unul din portalul Azure. O sa folosim o imagine de Ubuntu ca sistem de operare;
2. Vor trebui create 2 branch-uri in Github unde vom adauga template-urile;
3. Vom integra Github cu Azure Pipelines pentru a avea acces la template-uri;
4. Vom defini fisierul YAML pentru a descrie logica de deployment;
5. Vom crea 2 medii de deployment in Pipelines, care poate fi ulterior folosit pentru a impinge cod pe masini;
6. La final vom avea 2 masini virtuale in Azure, fiecare dispusa intr-un mediu de dezvoltare (Prod si Dev).
Si fiindca nu vrem sa cream un template de la zero, ar fi mult mai usor si rapid sa exportam unul din portalul Azure. Asa ca vom incepe sa cream o masina ca baza pentru template-ul nostru. Mai jos voi descrie pasii necesari pentru a ne atinge acest obiectiv.

Crearea unui template
  1. Odata logati in portal (https://portal.azure.com) dati click pe Virtual Machines in meniul din stanga sau pur si simplu dati un search dupa „virtual machines”. Apoi selectati Add in pagina care apare;
  2. Meniul de creare al masiniii este compus din mai multe taburi, unde sunt grupate diversele optiuni pentru crearea masinii.

Aici vor trebui completate toate datele necesare. Le voi enumera doar pe cele care vor trebui schimbate, restul sunt ok si in varianta default:

a. Subscription – evident, selectati subscriptia unde doriti sa creati resursele;
b. Resource Group – este folosit pentru gruparea logica a resurselor, dati-i un nume sugestiv daca nu aveti unul deja creat;
c. Virtual machine name – numele masinii, la fel sa fie sugestiv (ex. Prod-VM);
d. Region – regiunea geografica unde doriti resursele, preferabil cat mai aproape de voi;
e. Image – puteti folosi cea mai recenta imagine de Ubuntu LTS;
f. Size – o dimensiune de B1s (1 vCPU, 1GB memory) este suficient pentru aceasta masina;
g. Authentication type – selectati Password si introduceti datele de logare;
h. Public inbound ports – None;
i. OS Disk Type – Standard HDD;
j. Virtual Network – Click pe Create new si acceptati datele default;
k. NIC network security group – Advanced;
l. Public inbound ports – selectati Allow selected ports si in drop-meniul de mai jos selectati SSH;
m. Boot diagnostics – in tabul Management, selectati Off;
n. Review + create – puteti lasa ceilalti pasi default;
o. Chiar la ultimul pas in loc sa selectati Create, aveti o optiune sa salvati template-ul pentru automatizari.

p. Salvati cele doua fisiere json si parameters.json local pe calculator.
q. Daca deschideti cele doua fisiere o sa observati ca detaliile importante pentru noi sun in fisierul json. Deschideti-l cu Notepad (sau si mai bine cu Notepad++) si modificati urmatoarele valori pentru a-l salva ca fisier separat pentru Dev (trebuie sa gasiti numele parametrului si sa modificati valoarea, selectata cu verde mai jos).

Nota: Modificati campul „value” doar.

i. networkInterfaceName – schimbati in orice altce, este numele interfetei de retea a masinii virtuale si nu trebuie sa fie identice;
ii. networkSecurityGroupName – numele firewall-ului;
iii. publicIpAddressName – numele ip-ului public;
iv. virtualMachineName – numele masinii virtuale;
v. adminPassword – inlocuiti cu urmatoarele linii, unde inlocuiti „id” si „secretName” cu valorile Vault-ului unde vom stoca parola in siguranta, ca sa nu apara in template

vi. Salvati apoi fisierul cu numele parameters_dev.json.
Ca sa evitam trecerea parolei in clear text in template vom folosi un Key Vault. Cautati in Azure „key vault” si creati unul, preferabil in aceesi subscriptie, in acelasi Resource Group si aceeasi regiune geografica cu masinile noastre. Daca nu este creat, creati-l, dar tineti cont sa aiba acelasi nume ca in template.
Cand ajungeti la Access Policy selectati Enable access to: Azure Resource Manager for template deployment. In rest lasati totul default.

Dupa ce a fost creat cu succes, deschideti pagina resursei si in meniul din stanga alegeti Secrets.

Apoi selectati Generate/Import din fereastra principala si introduceti numele si valoarea. Valoarea in sensul acesta este chiar parola noastra. Numele trebuie sa fie asa cum a fost definit in template, in cazul nostru VMPassword.

Configurarea branch-urilor in Github

Asa cum am spus, vom crea 2 branch-uri in Github, unde vom stoca cele doua perechi de template-uri (Prod si Dev). Pentru asta urmati pasii de mai jos:
1. Dupa ce v-ati logat pe https://github.com creati un repository nou cu ce nume doriti voi. Nu conteaza daca este public sau privat.
2. Accesati Create New file si copiati continutul din json. Selectati Commit new file in josul paginii. La fel procedati cu parameters.json.
3. Apasati pe butonul Branch: master si in casuta de cautare scrieti Apoi selectati Create branch: dev from ‚master’.

4. Va fi creat branch-ul dev, unde faceti acelasi lucru ca la pasul 2. numai ca folositi continutul fisierelor json si parameters_dev.json. Bineninteles denumiti-le corespunzator. Fisierul template.json nu va trebui modificat. Bineinteles, aceste modificari pot fi facute din CLI, insa nu este scopul nostru aici. Dupa ce branch-urile au fost create urmeaza sa cream pipeline-ul in Azure pentru a face deploy la masini.

Azure Pipeline

Daca nu aveti deja o organizatie creata in Azure DevOps urmati urmatorii pasi:
1. Intrati pe https://dev.azure.com. Va logati cu acelasi user de Azure.
2. Daca nu sunteti intrebat creati o organizatie si apoi un proiect in cadrul acesteia. Proiectul puteti sa il creati public pentru a beneficia de gratuitate in Azure Pipelines.
3. In meniul din stanga selectati Pipelines si apoi in fereastra principala New pipeline.
4. La intrebarea unde este codul selectati Github. Urmeaza o serie de ecrane care va vor cere credenitialele pentru Github.

5. Selectati repository-ul vostru si instalati aplicatia Azure Pipelines. Acest lucuru este necesar deoarece Azure va incerca sa urce un fisier azure-pipelines.yml, prin ajutorul caruia veti putea face modificare in pipeline.
Acum urmeaza sa modificam fisierul azure-pipelines.yml si sa intelegem mai bine sintaxa sa. Stergeti codul din yml generat de Azure si introduceti urmatoarele (atentie la indentare):

Mai sus este specificat ca vrem sa urmarim cele doua branch-uri, master si dev. Adica la orice modificare in oricare branch, pipeline-ul nostru sa ruleze.

Apoi definim primul stage, adica punem conditia ca atunci cand se face un push in branch-ul master, sa ruleze doar aceasta bucata de cod din pipeline. Va fi cate un stage pentru fiecare branch. Trebuie inlocuite urmatoarele:

  • azureSubscription – va trebui trecut ID-ul subscriptiei voastre unde vreti sa faceti deploy, pe care il gasiti in portalul Azure;
  • resourceGroupName – numele Resource Group-ului unde vrei sa faceti deploy;
  • location – zona geografica dorita.

La fel procedam si pentru stage-ul de dev.

Salvati continutul si automat Azure Pipelines va vedea ca a fost modificat continutul si va incepe sa ruleze, creand astfel prima masina virtuala, cea de Productie. Puteti verifica acest lucru in portalul Azure.
Ca sa o cream si pe cea de dev va trebui sa editam pipeline-ul si sa copiem continutul fisierului azure-pipelines.yml si in branchul dev, altfel nu se va activa triggerul pentru acest branch. Puteti schimba branch-ul in casuta din stanga. Astfel:

  • copiati continutul azure-pipelines.yml;
  • schimbati branch-ul;
  • dati paste la continut si salvati, numele fisierului este implicit.

Dupa ce salvati se va rula automat si branch-ul dev, creand astfel si cea de-a doua masina, pe care o puteti vedea in portal.
In acest moment masinile sunt create si pot fi modificate foarte usor doar modificand fisierele parameters.json din Github. Posibilitatile sunt nelimitate, orice resursa o putem crea in acest mod. La final Pipeline-ul va arata cam asa:

Mergem un pas mai departe si construim un Environment pentru a putea face deploy de aplicatii pe aceste masini. Aici trebuie tinut cont ca va fi nevoie de configurari suplimentare pentru a rula cod (instalare pachete, dependente etc.). Pentru acest demo vom crea un Evironment de Productie si unul de Dev si vom rula o comanda de update in bash.
1. Sub Pipelines avem butonul Enviroments;

2. Selectati New environment. Dati-i numele PROD si selectati Virtual Machine la Resource;

3. In urmatoarea pagina selectati Linux la Operating System si copiati scriptul care va trebui rulat pe masina de productie;

4. Conectati-va pe masina de productie prin SSH si dati paste la acel script. El va instala un agent pe masina si o va inregistra in Azure Pipelines. Dupa ce a terminat cu succes, va aparea la Environment;
5. La fel procedam si pentru DEV. La final va trebui sa arate cam asa:

6. La final va trebui sa definim un job in Pipeline care sa acceseze masinile si o sa ruleze o comanda in bash. Pentru asta va trebui sa modificam fisierul azure-pipelines.yml;
7.
Pe branch-ul master va trebui adaugat urmatorul cod la stage-ul Prod:

8. Aceeasi structura va fi si pentru dev, cu numele modificate bineinteles.

9. La final tot fisierul azure-pipelines.yml va arata ca mai jos:

Articol scris de Ovidiu Badican – IT Specialist