<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="hu">
	<id>http://wiki.farkas-attila.hu/index.php?action=history&amp;feed=atom&amp;title=EDU%3A%3AGAMF%3A%3AFelh%C5%91alap%C3%BA-szolg%C3%A1ltat%C3%A1sok%3A%3AIaC</id>
	<title>EDU::GAMF::Felhőalapú-szolgáltatások::IaC - Laptörténet</title>
	<link rel="self" type="application/atom+xml" href="http://wiki.farkas-attila.hu/index.php?action=history&amp;feed=atom&amp;title=EDU%3A%3AGAMF%3A%3AFelh%C5%91alap%C3%BA-szolg%C3%A1ltat%C3%A1sok%3A%3AIaC"/>
	<link rel="alternate" type="text/html" href="http://wiki.farkas-attila.hu/index.php?title=EDU::GAMF::Felh%C5%91alap%C3%BA-szolg%C3%A1ltat%C3%A1sok::IaC&amp;action=history"/>
	<updated>2026-09-21T03:29:32Z</updated>
	<subtitle>Az oldal laptörténete a wikiben</subtitle>
	<generator>MediaWiki 1.38.4</generator>
	<entry>
		<id>http://wiki.farkas-attila.hu/index.php?title=EDU::GAMF::Felh%C5%91alap%C3%BA-szolg%C3%A1ltat%C3%A1sok::IaC&amp;diff=855&amp;oldid=prev</id>
		<title>ApelPro: Új IaC gyakorlat oldal létrehozása: Terraform, Ansible, Jenkins (a Docker/AWS oldalak struktúrájához illesztve)</title>
		<link rel="alternate" type="text/html" href="http://wiki.farkas-attila.hu/index.php?title=EDU::GAMF::Felh%C5%91alap%C3%BA-szolg%C3%A1ltat%C3%A1sok::IaC&amp;diff=855&amp;oldid=prev"/>
		<updated>2026-09-14T08:25:43Z</updated>

		<summary type="html">&lt;p&gt;Új IaC gyakorlat oldal létrehozása: Terraform, Ansible, Jenkins (a Docker/AWS oldalak struktúrájához illesztve)&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Új lap&lt;/b&gt;&lt;/p&gt;&lt;div&gt;[[category:GAMF]]&lt;br /&gt;
[[category:GAMF tantárgyak|Tantárgyak]]&lt;br /&gt;
[[category:GAMF AWS|AWS]]&lt;br /&gt;
== Mi az az Infrastructure as Code (IaC)? ==&lt;br /&gt;
Eddig a gyakorlatok során mindent kézzel, a grafikus felületen keresztül hoztunk létre - EC2 példányt, VPC-t, RDS-t, Security Groupot stb. Ez tanulási célra kiváló, mert látjuk, hogy pontosan mi történik, de éles környezetben rengeteg problémát okoz:&lt;br /&gt;
* Nem reprodukálható megbízhatóan (két ember, két kattintgatás - könnyen eltérő eredmény)&lt;br /&gt;
* Nincs verziókezelve, nem látszik a történet, ki mit miért módosított&lt;br /&gt;
* Nincs automatikusan dokumentálva - a konfiguráció &amp;quot;a fejekben&amp;quot; és a felületen él&lt;br /&gt;
* Nehéz gyorsan, azonos módon többször újra felépíteni (pl. teszt- és éles környezet)&lt;br /&gt;
&lt;br /&gt;
Az &amp;#039;&amp;#039;&amp;#039;Infrastructure as Code&amp;#039;&amp;#039;&amp;#039; lényege, hogy az infrastruktúrát (és sokszor a rajta futó szolgáltatások konfigurációját is) szöveges, verziókezelhető fájlokban írjuk le, amit aztán eszközök automatikusan alkalmaznak. Ezen a gyakorlaton három, egymást kiegészítő - és a piacon igen elterjedt - eszközzel ismerkedünk meg:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Eszköz !! Feladata !! Egy mondatban&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;Terraform&amp;#039;&amp;#039;&amp;#039; || Infrastruktúra &amp;#039;&amp;#039;&amp;#039;létrehozása&amp;#039;&amp;#039;&amp;#039; (provisioning) || &amp;quot;Milyen gépek/hálózatok/szolgáltatások legyenek?&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;Ansible&amp;#039;&amp;#039;&amp;#039; || Már létező szerverek &amp;#039;&amp;#039;&amp;#039;konfigurálása&amp;#039;&amp;#039;&amp;#039; || &amp;quot;Mi fusson/legyen telepítve a gépeken?&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;Jenkins&amp;#039;&amp;#039;&amp;#039; || A folyamat &amp;#039;&amp;#039;&amp;#039;automatizálása&amp;#039;&amp;#039;&amp;#039; (CI/CD) || &amp;quot;Mikor és hogyan fusson le mindez magától?&amp;quot;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
A három eszköz tipikusan egy láncban dolgozik együtt: &amp;#039;&amp;#039;&amp;#039;Jenkins&amp;#039;&amp;#039;&amp;#039; elindítja a folyamatot (pl. egy git push hatására), ami meghívja a &amp;#039;&amp;#039;&amp;#039;Terraform&amp;#039;&amp;#039;&amp;#039;-ot, hogy felépítse/frissítse az infrastruktúrát, majd az &amp;#039;&amp;#039;&amp;#039;Ansible&amp;#039;&amp;#039;&amp;#039; konfigurálja fel és telepíti az alkalmazást a friss szerverekre.&lt;br /&gt;
&lt;br /&gt;
== Terraform ==&lt;br /&gt;
=== Mi az a Terraform? ===&lt;br /&gt;
A HashiCorp által fejlesztett, nyílt forráskódú IaC eszköz. Deklaratív nyelven (HCL - HashiCorp Configuration Language) írjuk le a &amp;#039;&amp;#039;&amp;#039;kívánt végállapotot&amp;#039;&amp;#039;&amp;#039; (&amp;quot;legyen egy ilyen EC2 példányom, ekkora Security Grouppal&amp;quot;), és a Terraform kitalálja, milyen API-hívásokkal éri ezt el - beleértve azt is, ha valamit módosítani vagy törölni kell egy korábbiállapothoz képest.&lt;br /&gt;
&lt;br /&gt;
=== Telepítés ===&lt;br /&gt;
A Terraform nincs benne az alapértelmezett Ubuntu/Debian csomagtárolókban, a HashiCorp hivatalos tárolóját kell hozzáadnunk:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
apt update &amp;amp;&amp;amp; apt install -y gnupg software-properties-common curl&lt;br /&gt;
curl -fsSL https://apt.releases.hashicorp.com/gpg | gpg --dearmor -o /usr/share/keyrings/hashicorp-archive-keyring.gpg&lt;br /&gt;
echo &amp;quot;deb [signed-by=/usr/share/keyrings/hashicorp-archive-keyring.gpg] https://apt.releases.hashicorp.com $(lsb_release -cs) main&amp;quot; \&lt;br /&gt;
  | tee /etc/apt/sources.list.d/hashicorp.list&lt;br /&gt;
apt update &amp;amp;&amp;amp; apt install terraform -y&lt;br /&gt;
terraform -version&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== AWS hitelesítés ===&lt;br /&gt;
A Terraformnak ugyanazokra a hozzáférési kulcsokra van szüksége, mint korábban az AWSCLI-nek (lásd az [[EDU::GAMF::Felhőalapú-szolgáltatások::AWS#Access_Key_management|AWS oldalon]]). Két lehetőségünk van:&lt;br /&gt;
* Ha már lefuttattuk az &amp;#039;&amp;#039;&amp;#039;aws configure&amp;#039;&amp;#039;&amp;#039; parancsot, a Terraform automatikusan megtalálja azt&lt;br /&gt;
* Vagy környezeti változóként is megadhatjuk:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
export AWS_ACCESS_KEY_ID=&amp;quot;ide_jön_az_access_key&amp;quot;&lt;br /&gt;
export AWS_SECRET_ACCESS_KEY=&amp;quot;ide_jön_a_secret_key&amp;quot;&lt;br /&gt;
export AWS_DEFAULT_REGION=&amp;quot;eu-west-1&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
 &amp;#039;&amp;#039;&amp;#039;Figyelem!&amp;#039;&amp;#039;&amp;#039; Soha ne írjuk a hozzáférési kulcsokat közvetlenül a .tf fájlokba, és ne kerüljenek verziókezelőbe (git)! Használjunk környezeti változót, vagy az AWS CLI által létrehozott hitelesítési fájlt.&lt;br /&gt;
&lt;br /&gt;
=== Alapfogalmak ===&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Provider&amp;#039;&amp;#039;&amp;#039;: melyik szolgáltatóval (AWS, Azure, GCP stb.) és hogyan kommunikáljon a Terraform&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Resource&amp;#039;&amp;#039;&amp;#039;: egy konkrét, létrehozandó/kezelendő erőforrás (pl. egy EC2 példány)&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Variable&amp;#039;&amp;#039;&amp;#039;: paraméterezhető bemeneti érték (pl. instance típusa, régió)&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Output&amp;#039;&amp;#039;&amp;#039;: a végrehajtás után visszaadott érték (pl. a létrehozott szerver publikus IP-je)&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;State&amp;#039;&amp;#039;&amp;#039;: a Terraform saját nyilvántartása arról, hogy legutóbb milyen állapotot hozott létre - ez alapján tudja kiszámolni, hogy legközelebb mit kell módosítania&lt;br /&gt;
&lt;br /&gt;
=== Gyakorlati példa: EC2 + Security Group ===&lt;br /&gt;
Hozzunk létre egy &amp;#039;&amp;#039;main.tf&amp;#039;&amp;#039; fájlt, ami a korábban már megismert módon (lásd [[EDU::GAMF::Felhőalapú-szolgáltatások::AWS#EC2_szolgáltatásai|EC2 gyakorlat]]) indít egy t2.micro szervert, rajta egy Security Grouppal, ami engedi a SSH és HTTP forgalmat:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;hcl&amp;quot;&amp;gt;&lt;br /&gt;
terraform {&lt;br /&gt;
  required_providers {&lt;br /&gt;
    aws = {&lt;br /&gt;
      source  = &amp;quot;hashicorp/aws&amp;quot;&lt;br /&gt;
      version = &amp;quot;~&amp;gt; 5.0&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
provider &amp;quot;aws&amp;quot; {&lt;br /&gt;
  region = &amp;quot;eu-west-1&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
variable &amp;quot;neptun&amp;quot; {&lt;br /&gt;
  description = &amp;quot;Neptun kód, az erőforrások elnevezéséhez&amp;quot;&lt;br /&gt;
  type        = string&lt;br /&gt;
  default     = &amp;quot;neptun&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
resource &amp;quot;aws_security_group&amp;quot; &amp;quot;web&amp;quot; {&lt;br /&gt;
  name        = &amp;quot;${var.neptun}-sg&amp;quot;&lt;br /&gt;
  description = &amp;quot;SSH + HTTP engedelyezese&amp;quot;&lt;br /&gt;
&lt;br /&gt;
  ingress {&lt;br /&gt;
    description = &amp;quot;SSH&amp;quot;&lt;br /&gt;
    from_port   = 22&lt;br /&gt;
    to_port     = 22&lt;br /&gt;
    protocol    = &amp;quot;tcp&amp;quot;&lt;br /&gt;
    cidr_blocks = [&amp;quot;0.0.0.0/0&amp;quot;]&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  ingress {&lt;br /&gt;
    description = &amp;quot;HTTP&amp;quot;&lt;br /&gt;
    from_port   = 80&lt;br /&gt;
    to_port     = 80&lt;br /&gt;
    protocol    = &amp;quot;tcp&amp;quot;&lt;br /&gt;
    cidr_blocks = [&amp;quot;0.0.0.0/0&amp;quot;]&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  egress {&lt;br /&gt;
    from_port   = 0&lt;br /&gt;
    to_port     = 0&lt;br /&gt;
    protocol    = &amp;quot;-1&amp;quot;&lt;br /&gt;
    cidr_blocks = [&amp;quot;0.0.0.0/0&amp;quot;]&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  tags = {&lt;br /&gt;
    Name = &amp;quot;${var.neptun}-sg&amp;quot;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
resource &amp;quot;aws_instance&amp;quot; &amp;quot;web&amp;quot; {&lt;br /&gt;
  ami                    = &amp;quot;ami-0c1c30571d2dae5c9&amp;quot; # Ubuntu 22.04 LTS, eu-west-1&lt;br /&gt;
  instance_type          = &amp;quot;t2.micro&amp;quot;&lt;br /&gt;
  key_name               = &amp;quot;test&amp;quot; # a korabban letrehozott kulcspar neve&lt;br /&gt;
  vpc_security_group_ids = [aws_security_group.web.id]&lt;br /&gt;
&lt;br /&gt;
  tags = {&lt;br /&gt;
    Name = &amp;quot;${var.neptun}-web&amp;quot;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
output &amp;quot;public_ip&amp;quot; {&lt;br /&gt;
  value = aws_instance.web.public_ip&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
 &amp;#039;&amp;#039;&amp;#039;Figyelem!&amp;#039;&amp;#039;&amp;#039; Az AMI azonosító régiónként és időszakonként változik - mindig ellenőrizzük a konzolon (EC2 → Launch instance → AMI kiválasztás), hogy az adott régióban érvényes-e még az azonosító, mielőtt bemásoljuk.&lt;br /&gt;
&lt;br /&gt;
=== A munkafolyamat: init / plan / apply / destroy ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
terraform init      # letölti a szükséges providereket, előkészíti a munkakönyvtárat - csak egyszer kell (vagy provider váltáskor)&lt;br /&gt;
terraform plan       # megmutatja, MIT fog csinálni, anélkül hogy bármit is végrehajtana - mindig nézzük át!&lt;br /&gt;
terraform apply       # végrehajtja a terveket - rákérdez, hogy biztosan folytassuk-e (yes-szel hagyjuk jóvá)&lt;br /&gt;
terraform destroy     # törli az összes, ebben a konfigurációban létrehozott erőforrást&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
 &amp;#039;&amp;#039;&amp;#039;Figyelem, ez a legfontosabb szabály a féléves munkához!&amp;#039;&amp;#039;&amp;#039; Amikor végeztünk egy gyakorlattal, futtassunk &amp;#039;&amp;#039;terraform destroy&amp;#039;&amp;#039;-t, különben a létrehozott erőforrások tovább futnak és fizetési kötelezettséget okozhatnak a free tier keretein túl.&lt;br /&gt;
&lt;br /&gt;
=== A state fájl ===&lt;br /&gt;
A &amp;#039;&amp;#039;terraform apply&amp;#039;&amp;#039; lefuttatása után megjelenik egy &amp;#039;&amp;#039;terraform.tfstate&amp;#039;&amp;#039; nevű fájl a könyvtárban - ez tárolja, hogy pontosan mit hozott létre a Terraform. &amp;#039;&amp;#039;&amp;#039;Ez a fájl bizalmas adatokat is tartalmazhat&amp;#039;&amp;#039;&amp;#039; (pl. jelszavakat, ha voltak a konfigurációban), ezért:&lt;br /&gt;
* Soha ne kerüljön git-be (vegyük fel a &amp;#039;&amp;#039;.gitignore&amp;#039;&amp;#039;-ba)&lt;br /&gt;
* Csapatmunkánál érdemes távoli tárolást használni (pl. S3 bucket, amit korábban már megismertünk), hogy mindenki ugyanazt az állapotot lássa&lt;br /&gt;
&lt;br /&gt;
== Ansible ==&lt;br /&gt;
=== Mi az az Ansible, és miben más, mint a Terraform? ===&lt;br /&gt;
Amíg a Terraform azzal foglalkozik, hogy &amp;#039;&amp;#039;&amp;#039;milyen gépek létezzenek&amp;#039;&amp;#039;&amp;#039;, addig az Ansible azzal, hogy &amp;#039;&amp;#039;&amp;#039;mi legyen rajtuk telepítve/beállítva&amp;#039;&amp;#039;&amp;#039;. Az Ansible &amp;#039;&amp;#039;&amp;#039;agentless&amp;#039;&amp;#039;&amp;#039;: nem kell külön ügynök-szoftvert telepíteni a célgépekre, elég, ha van rajtuk SSH szerver (amit eddig is használtunk a gépekhez való csatlakozáshoz) és Python.&lt;br /&gt;
&lt;br /&gt;
=== Telepítés ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
apt update &amp;amp;&amp;amp; apt install ansible -y&lt;br /&gt;
ansible --version&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Inventory - kikhez csatlakozzon? ===&lt;br /&gt;
Az Ansible egy úgynevezett &amp;#039;&amp;#039;inventory&amp;#039;&amp;#039; fájlból tudja, mely szerverekkel dolgozzon. Hozzunk létre egy &amp;#039;&amp;#039;inventory.ini&amp;#039;&amp;#039; fájlt, a korábban megismert SSH kulcsot és felhasználónevet felhasználva (lásd [[EDU::GAMF::Felhőalapú-szolgáltatások::AWS#Csatlakozás_Linux_terminálból|itt]]):&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;ini&amp;quot;&amp;gt;&lt;br /&gt;
[webservers]&lt;br /&gt;
web1 ansible_host=3.252.168.207 ansible_user=ubuntu ansible_ssh_private_key_file=~/test.pem&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ellenőrizzük, hogy elérjük-e a gépet:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
ansible -i inventory.ini webservers -m ping&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Ad-hoc parancsok ===&lt;br /&gt;
Egyszeri feladatokhoz nem kell playbookot írnunk, elég egy modult megneveznünk:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
# csomaglista frissítése minden webservers csoportba tartozó gépen&lt;br /&gt;
ansible -i inventory.ini webservers -m apt -a &amp;quot;update_cache=yes&amp;quot; --become&lt;br /&gt;
&lt;br /&gt;
# egy adott parancs lefuttatása&lt;br /&gt;
ansible -i inventory.ini webservers -m shell -a &amp;quot;uptime&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
 A &amp;#039;&amp;#039;--become&amp;#039;&amp;#039; kapcsoló jelenti a sudo-s (root) jogosultsággal történő végrehajtást, hasonlóan ahhoz, mintha &amp;#039;&amp;#039;sudo&amp;#039;&amp;#039;-t írnánk a parancs elé.&lt;br /&gt;
&lt;br /&gt;
=== Playbook - a korábbi telepítő script Ansible-lel ===&lt;br /&gt;
Emlékezzünk vissza: a gyakorlat elején egy bash scripttel (&amp;#039;&amp;#039;UI indítás&amp;#039;&amp;#039;, lásd az AWS oldalon) telepítettük fel a weboldalunkat egy EC2-re. Ennek &amp;#039;&amp;#039;&amp;#039;két nagy hátránya&amp;#039;&amp;#039;&amp;#039; volt: csak egyszer, az EC2 indításakor futott le (User data), és nem volt idempotens - ha kétszer lefuttatnánk, hibákat okozna (pl. már létező mappa létrehozása). Nézzük meg, hogyan váltja ki ugyanezt egy Ansible playbook, amit &amp;#039;&amp;#039;&amp;#039;bármikor, bármennyiszer&amp;#039;&amp;#039;&amp;#039; újra lefuttathatunk anélkül, hogy kárt tenne:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;yaml&amp;quot;&amp;gt;&lt;br /&gt;
---&lt;br /&gt;
- name: Weboldal UI telepítése&lt;br /&gt;
  hosts: webservers&lt;br /&gt;
  become: yes&lt;br /&gt;
  vars:&lt;br /&gt;
    neptun: &amp;quot;neptun&amp;quot;&lt;br /&gt;
    api_lb_domain: &amp;quot;localhost&amp;quot;&lt;br /&gt;
&lt;br /&gt;
  tasks:&lt;br /&gt;
    - name: Csomaglista frissítése&lt;br /&gt;
      apt:&lt;br /&gt;
        update_cache: yes&lt;br /&gt;
&lt;br /&gt;
    - name: Szükséges csomagok telepítése&lt;br /&gt;
      apt:&lt;br /&gt;
        name:&lt;br /&gt;
          - apache2&lt;br /&gt;
          - libapache2-mod-php8.3&lt;br /&gt;
          - php8.3&lt;br /&gt;
          - php8.3-curl&lt;br /&gt;
          - unzip&lt;br /&gt;
        state: present&lt;br /&gt;
&lt;br /&gt;
    - name: Weboldal letöltése és kicsomagolása&lt;br /&gt;
      unarchive:&lt;br /&gt;
        src: https://wiki.farkas-attila.hu/images/c/c7/Weboldal.zip&lt;br /&gt;
        dest: /tmp/&lt;br /&gt;
        remote_src: yes&lt;br /&gt;
&lt;br /&gt;
    - name: Célkönyvtár létrehozása&lt;br /&gt;
      file:&lt;br /&gt;
        path: &amp;quot;/srv/{{ neptun }}&amp;quot;&lt;br /&gt;
        state: directory&lt;br /&gt;
&lt;br /&gt;
    - name: &amp;lt;ip&amp;gt; csere a tényleges API domain-re és fájlok elhelyezése&lt;br /&gt;
      copy:&lt;br /&gt;
        src: &amp;quot;/tmp/{{ item.src }}&amp;quot;&lt;br /&gt;
        dest: &amp;quot;/srv/{{ neptun }}/{{ item.dest }}&amp;quot;&lt;br /&gt;
        remote_src: yes&lt;br /&gt;
      loop:&lt;br /&gt;
        - { src: &amp;quot;ui.php&amp;quot;, dest: &amp;quot;index.php&amp;quot; }&lt;br /&gt;
        - { src: &amp;quot;ui_newproduct.php&amp;quot;, dest: &amp;quot;newproduct.php&amp;quot; }&lt;br /&gt;
&lt;br /&gt;
    - name: &amp;lt;ip&amp;gt; tag lecserélése a tényleges API domain-re&lt;br /&gt;
      replace:&lt;br /&gt;
        path: &amp;quot;/srv/{{ neptun }}/{{ item }}&amp;quot;&lt;br /&gt;
        regexp: &amp;quot;&amp;lt;ip&amp;gt;&amp;quot;&lt;br /&gt;
        replace: &amp;quot;{{ api_lb_domain }}&amp;quot;&lt;br /&gt;
      loop:&lt;br /&gt;
        - index.php&lt;br /&gt;
        - newproduct.php&lt;br /&gt;
&lt;br /&gt;
    - name: Apache virtualhost beállítása&lt;br /&gt;
      template:&lt;br /&gt;
        src: templates/000-default.conf.j2&lt;br /&gt;
        dest: /etc/apache2/sites-enabled/000-default.conf&lt;br /&gt;
      notify: Apache ujraindul&lt;br /&gt;
&lt;br /&gt;
  handlers:&lt;br /&gt;
    - name: Apache ujraindul&lt;br /&gt;
      service:&lt;br /&gt;
        name: apache2&lt;br /&gt;
        state: restarted&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
 Figyeljük meg az &amp;#039;&amp;#039;&amp;#039;idempotencia&amp;#039;&amp;#039;&amp;#039; elvét minden lépésnél: az &amp;#039;&amp;#039;apt&amp;#039;&amp;#039; modul csak akkor telepít, ha a csomag még nincs fent; a &amp;#039;&amp;#039;file&amp;#039;&amp;#039; modul csak akkor hoz létre könyvtárat, ha az még nem létezik. Ha kétszer futtatjuk le a playbookot, a második futás nem fog hibázni, csak megállapítja, hogy &amp;quot;már minden rendben van&amp;quot; (ez az úgynevezett &amp;#039;&amp;#039;changed=0&amp;#039;&amp;#039; állapot).&lt;br /&gt;
&lt;br /&gt;
A playbook futtatása:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
ansible-playbook -i inventory.ini deploy-ui.yml&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Jenkins ==&lt;br /&gt;
=== Mi az a Jenkins? ===&lt;br /&gt;
A Jenkins egy nyílt forráskódú CI/CD (Continuous Integration / Continuous Deployment) automatizáló szerver: az ő feladata, hogy a fejlesztői munka (pl. egy git push) hatására automatikusan lefuttassa a szükséges lépéseket - tesztelés, build, majd akár a Terraform és Ansible meghívása is, hogy a legfrissebb kód éles környezetbe kerüljön emberi beavatkozás nélkül.&lt;br /&gt;
&lt;br /&gt;
=== Telepítés Docker konténerben ===&lt;br /&gt;
Mivel a félév második fele a Dockerről szól, a Jenkins telepítését is ezen keresztül végezzük el - így nem szennyezzük a hoszt rendszert, és könnyen el is távolítható:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
docker volume create jenkins_home&lt;br /&gt;
docker run -d --name jenkins \&lt;br /&gt;
  -p 8080:8080 -p 50000:50000 \&lt;br /&gt;
  -v jenkins_home:/var/jenkins_home \&lt;br /&gt;
  jenkins/jenkins:lts&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
 A &amp;#039;&amp;#039;&amp;#039;8080&amp;#039;&amp;#039;&amp;#039;-as port a webes admin felület, az &amp;#039;&amp;#039;&amp;#039;50000&amp;#039;&amp;#039;&amp;#039;-es port pedig azoknak az esetleges elosztott build-ügynököknek (agent) van fenntartva, amik egy másik gépről csatlakoznának a Jenkins szerverhez.&lt;br /&gt;
&lt;br /&gt;
A kezdeti admin jelszót a konténer belsejéből kell kiolvasnunk:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
docker exec jenkins cat /var/jenkins_home/secrets/initialAdminPassword&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Ezt beillesztve a &amp;#039;&amp;#039;http://&amp;lt;szerver_ip&amp;gt;:8080&amp;#039;&amp;#039; címen elérhető telepítő varázslóba, majd a javasolt beépülők (plugins) telepítésével elkészül az alapkonfiguráció.&lt;br /&gt;
&lt;br /&gt;
=== Pipeline alapfogalmak ===&lt;br /&gt;
A Jenkins munkafolyamatait &amp;#039;&amp;#039;Jenkinsfile&amp;#039;&amp;#039; néven, a projekt gyökerében elhelyezett, Groovy szintaxisú fájlban írjuk le (tehát ez a fájl is git-be kerül a projekt kódjával együtt - önmagában is egyfajta &amp;quot;code&amp;quot; a CI/CD folyamatból):&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;pipeline&amp;#039;&amp;#039;&amp;#039;: a teljes folyamatot összefogó blokk&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;stage&amp;#039;&amp;#039;&amp;#039;: egy-egy logikai szakasz (pl. &amp;quot;Build&amp;quot;, &amp;quot;Terraform Apply&amp;quot;, &amp;quot;Ansible Deploy&amp;quot;) - ezek jelennek meg névvel a Jenkins felületén&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;steps&amp;#039;&amp;#039;&amp;#039;: az adott szakaszban ténylegesen végrehajtandó parancsok&lt;br /&gt;
&lt;br /&gt;
=== Gyakorlati példa: Terraform + Ansible pipeline ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;groovy&amp;quot;&amp;gt;&lt;br /&gt;
pipeline {&lt;br /&gt;
    agent any&lt;br /&gt;
&lt;br /&gt;
    stages {&lt;br /&gt;
        stage(&amp;#039;Checkout&amp;#039;) {&lt;br /&gt;
            steps {&lt;br /&gt;
                git branch: &amp;#039;main&amp;#039;, url: &amp;#039;https://github.com/pelda/gamf-projekt.git&amp;#039;&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        stage(&amp;#039;Terraform Init&amp;#039;) {&lt;br /&gt;
            steps {&lt;br /&gt;
                sh &amp;#039;terraform init&amp;#039;&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        stage(&amp;#039;Terraform Apply&amp;#039;) {&lt;br /&gt;
            steps {&lt;br /&gt;
                sh &amp;#039;terraform apply -auto-approve&amp;#039;&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        stage(&amp;#039;Ansible Deploy&amp;#039;) {&lt;br /&gt;
            steps {&lt;br /&gt;
                sh &amp;#039;ansible-playbook -i inventory.ini deploy-ui.yml&amp;#039;&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    post {&lt;br /&gt;
        failure {&lt;br /&gt;
            echo &amp;#039;A pipeline elszállt - ellenőrizzük a logokat!&amp;#039;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
 &amp;#039;&amp;#039;&amp;#039;Figyelem!&amp;#039;&amp;#039;&amp;#039; Ahhoz, hogy a fenti &amp;#039;&amp;#039;sh&amp;#039;&amp;#039; lépések ténylegesen működjenek, a Terraform-ot és az Ansible-t is telepíteni kell magába a Jenkins konténerbe (vagy egy erre felkészített, saját &amp;#039;&amp;#039;Dockerfile&amp;#039;&amp;#039;-ból épített Jenkins image-be - gondoljunk vissza a Docker fejezetre, pontosan ez a &amp;#039;&amp;#039;image készítés&amp;#039;&amp;#039; egyik tipikus, valós felhasználási módja).&lt;br /&gt;
&lt;br /&gt;
== Összefoglalás - hogyan áll össze a lánc? ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;margin:0px auto&amp;quot;&lt;br /&gt;
! Lépés !! Eszköz !! Mit csinál&lt;br /&gt;
|-&lt;br /&gt;
| 1 || Fejlesztő || &amp;#039;&amp;#039;git push&amp;#039;&amp;#039; a kódra&lt;br /&gt;
|-&lt;br /&gt;
| 2 || Jenkins || Észleli a változást, elindítja a pipeline-t&lt;br /&gt;
|-&lt;br /&gt;
| 3 || Terraform || Felépíti/frissíti az infrastruktúrát (VPC, EC2, Security Group, RDS stb.)&lt;br /&gt;
|-&lt;br /&gt;
| 4 || Ansible || Feltelepíti és konfigurálja az alkalmazást a friss szervereken&lt;br /&gt;
|-&lt;br /&gt;
| 5 || - || Az alkalmazás elérhetővé válik, emberi kattintgatás nélkül&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Ez a minta közvetlenül kapcsolódik a féléves projektfeladat követelményeihez is: a Terraformmal létrehozott VPC, EC2, ASG/LB, RDS mind beleszámít a projektkövetelmény-listába (lásd a [[EDU::GAMF::Felhőalapú-szolgáltatások|főoldalon]]), csak éppen automatizált, verziókezelt, újra futtatható formában - ami jóval közelebb áll ahhoz, ahogy ma egy valós cégnél is üzemeltetik a felhős infrastruktúrát.&lt;br /&gt;
&lt;br /&gt;
== Jegyzetek ==&lt;br /&gt;
* [[EDU::GAMF::Felhőalapú-szolgáltatások::AWS|AWS]]&lt;br /&gt;
* [[EDU::GAMF::Felhőalapú-szolgáltatások::Docker|Docker]]&lt;br /&gt;
* [[GAMF::Felhőalapú-szolgáltatások::Előadás|Előadás]] - lásd a Felhő ökoszisztéma fejezet IaC alfejezetét az elméleti háttérhez&lt;/div&gt;</summary>
		<author><name>ApelPro</name></author>
	</entry>
</feed>