Jak zarządzać infrastrukturą chmurową za pomocą Terraform

Jak zarządzać infrastrukturą chmurową za pomocą Terraform

W tym artykule omówimy, z czego składa się Terraform i krok po kroku uruchomimy własną infrastrukturę w chmurze z VMware — przygotujemy trzy VM do różnych celów: proxy, przechowywanie plików i CMS.

O wszystkim szczegółowo i w trzech etapach:

1. Terraform — opis, zalety i komponenty

Terraform to narzędzie IaC (Infrastructure-as-Code) do budowy i zarządzania wirtualną infrastrukturą przy użyciu kodu.

W pracy z narzędziem zauważyliśmy kilka zalet:

  • Szybkość wdrażania nowych tenantów (wirtualnych środowisk użytkowników). Z reguły im więcej nowych klientów, tym więcej „kliknięć” muszą wykonać pracownicy wsparcia technicznego, aby opublikować nowe zasoby. Dzięki Terraform użytkownicy mogą zmieniać parametry maszyn wirtualnych (na przykład automatycznie wyłączać OS i powiększać partycję wirtualnego dysku) bez udziału wsparcia technicznego i wyłączania samej maszyny.

  • Natychmiastowe sprawdzenie planu aktywacji nowego tenanta. Dzięki opisowi kodu infrastruktury możemy od razu sprawdzić, co i w jakiej kolejności zostanie dodane, a także w jakim końcowym stanie będzie dana maszyna wirtualna lub wirtualna sieć z połączeniami do maszyn wirtualnych.

  • Możliwość opisywania większości popularnych platform chmurowych. Możesz korzystać z narzędzia od Amazon i Google Cloud, aż po prywatne platformy oparte na VMware vCloud Director, oferujące usługi w ramach rozwiązań IaaS, SaaS i PaaS.

  • Zarządzanie wieloma dostawcami chmur i rozdzielanie infrastruktury między nimi w celu zwiększenia odporności na awarie, używając jednej konfiguracji do tworzenia, diagnostyki i zarządzania zasobami chmurowymi.

  • Wygodne użycie do tworzenia pokazowych środowisk do testowania i debugowania oprogramowania. Możesz tworzyć i udostępniać środowiska dla działu testów, równocześnie testując oprogramowanie w różnych środowiskach, a także natychmiast zmieniać i usuwać zasoby, tworząc tylko jeden plan budowy zasobów.

„Terrarium” Terraform

Krótko omówiliśmy zalety narzędzia, teraz rozłóżmy je na komponenty

Providers (dostawcy). 

W Terraformie prawie każdy typ infrastruktury można przedstawić jako zasób. Połączenie między zasobami a platformą API zapewniają moduły providers, które umożliwiają tworzenie zasobów w ramach określonej platformy, na przykład Azure lub VMware vCloud Director.

W ramach projektu możesz współpracować z różnymi dostawcami na różnych platformach.

Resources (opis zasobów).

Opis zasobów pozwala zarządzać komponentami platformy, takimi jak maszyny wirtualne lub sieci. 

Możesz samodzielnie stworzyć opis zasobów dla dostawcy VMware vCloud Director i wykorzystać ten opis do tworzenia zasobów u dowolnego dostawcy hostingowego, który korzysta z vCloud Director. Wystarczy, że zamienisz parametry autoryzacji i parametry połączenia sieciowego z odpowiednim dostawcą hostingowym.

Provisioners.

Ta składnik umożliwia wykonywanie operacji wstępnej instalacji i konserwacji systemu operacyjnego po utworzeniu maszyn wirtualnych. Po utworzeniu zasobu maszyny wirtualnej, za pomocą provisioners możesz skonfigurować i połączyć się przez SSH, zaktualizować system operacyjny oraz przesłać i uruchomić skrypt. 

Zmienne Input i Output.

Input zmienne — wejściowe zmienne dla wszystkich typów bloków. 

Output zmienne pozwalają zachować wartości po utworzeniu zasobów i mogą być używane jako wejściowe zmienne w innych modułach, na przykład w bloku Provisioners.

States (stany).

Pliki states przechowują informacje o konfiguracji zasobów platformy dostawcy. Przy pierwszym utworzeniu platformy nie ma żadnych informacji o zasobach, a przed każdą operacją Terraform aktualizuje stan z rzeczywistą infrastrukturą już opisanych zasobów.

Głównym celem stanów jest zachowanie powiązania obiektów już stworzonych zasobów w celu porównania konfiguracji dodawanych zasobów i obiektów, aby uniknąć ich ponownego tworzenia i zmian w platformie.

Informacje o stanie domyślnie przechowywane są w lokalnym pliku terraform.tfstate, ale w razie potrzeby istnieje możliwość korzystania z zdalnego przechowywania do pracy w zespole.

Możesz również zaimportować bieżące zasoby platformy w stan, aby następnie współdziałać z innymi zasobami, które z kolei zostały stworzone bez pomocy Terraform.  

2. Tworzenie infrastruktury

Teraz, gdy rozłożyliśmy komponenty, przy pomocy Terraform krok po kroku stworzymy infrastrukturę z trzema maszynami wirtualnymi. Pierwsza z zainstalowanym serwerem proxy nginx, druga z magazynem plików na bazie Nextcloud, a trzecia z CMS Bitrix.

Będziemy pisać kod i go wykonywać na przykładzie naszego chmurowego środowiska na VMware vCloud Director.Użytkownicy otrzymują konto z uprawnieniami Administratora Organizacji; jeśli używasz konta z tymi samymi uprawnieniami w innej chmurze VMware, będziesz mógł odtworzyć kod z naszych przykładów. Zaczynamy!

Najpierw stworzymy dla naszego nowego projektu katalog, w którym będą umieszczone pliki z opisem infrastruktury.

mkdir project01

Następnie opiszemy komponenty infrastruktury. Terraform tworzy powiązania i przetwarza pliki na podstawie opisu w tych plikach. Same pliki można nazywać w zależności od docelowego przeznaczenia opisywanych bloków, na przykład network.tf — opisuje parametry sieciowe dla infrastruktury.

Do opisu komponentów naszej infrastruktury stworzyliśmy następujące pliki:

Lista plików.

main.tf — opis parametrów dla środowiska wirtualnego — maszyny wirtualne, kontenery wirtualne;

network.tf — opis parametrów wirtualnej sieci oraz reguł NAT, Firewall;

variables.tf — lista zmiennych, które używamy;

vcd.tfvars — wartości zmiennych projektu dla modułu VMware vCloud Director.

Język konfiguracji w Terraform jest deklaratywny, a kolejność bloków nie ma znaczenia, z wyjątkiem bloków provisioner, ponieważ w tym bloku opisujemy polecenia do wykonania podczas przygotowania infrastruktury i będą one wykonywane w określonej kolejności.

Struktura bloków.

"" "" {

# Block body

= # Argument

}

Do opisu bloków używany jest własny język programowania HCL (HashiCorp Configuration Language), infrastrukturę można opisać również przy użyciu JSON. Więcej na temat składni można przeczytać na stronie dewelopera..

Konfiguracja zmiennej środowiskowej, variables.tf i vcd.tfvars

Najpierw stworzymy dwa pliki, które opisują listę wszystkich używanych zmiennych i ich wartości dla modułu VMware vCloud Director. Najpierw stworzymy plik variables.tf.

Zawartość pliku variables.tf.

zmienna "vcd_org_user" {

  opis = "użytkownik vCD Tenanta"

}

zmienna "vcd_org_password" {

  opis = "hasło vCD Tenanta"

}

zmienna "vcd_org" {

  opis = "organizacja vCD Tenanta"

}

zmienna "vcd_org_vdc" {

  opis = "vDC Tenanta vCD"

}

zmienna "vcd_org_url" {

  opis = "URL Tenanta vCD"

}

zmienna "vcd_org_max_retry_timeout" {

  domyślnie = "60"

}

zmienna "vcd_org_allow_unverified_ssl" {

  domyślnie = "true"

}

zmienna "vcd_org_edge_name" {

  opis = "nazwa krawędzi vCD"

}

zmienna "vcd_org_catalog" {

  opis = "publiczny katalog vCD"

}

zmienna "vcd_template_os_centos7" {

  opis = "OS CentOS 7"

  domyślnie = "CentOS7"

}

zmienna "vcd_org_ssd_sp" {

  opis = "Polityki przechowywania"

  domyślnie = "Polityka przechowywania Gold"

}

zmienna "vcd_org_hdd_sp" {

  opis = "Polityki przechowywania"

  domyślnie = "Polityka przechowywania Bronze"

}

zmienna "vcd_edge_local_subnet" {

  opis = "Podsieć sieci organizacji"

}

zmienna "vcd_edge_external_ip" {

  opis = "Zewnętrzny publiczny adres IP"

}

zmienna "vcd_edge_local_ip_nginx" {}

zmienna "vcd_edge_local_ip_bitrix" {}

zmienna "vcd_edge_local_ip_nextcloud" {}

zmienna "vcd_edge_external_network" {}

Wartości zmiennych, które otrzymujemy od dostawcy.

  • vcd_org_user — nazwa użytkownika z uprawnieniami Administratora Organizacji,

  • vcd_org_password — hasło użytkownika,

  • vcd_org — nazwa organizacji,

  • vcd_org_vdc — nazwa wirtualnego centrum danych,

  • vcd_org_url — URL API,

  • vcd_org_edge_name — nazwa wirtualnego routera,

  • vcd_org_catalog — nazwa katalogu z szablonami maszyn wirtualnych,

  • vcd_edge_external_ip — publiczny adres IP,

  • vcd_edge_external_network — nazwa zewnętrznej sieci,

  • vcd_org_hdd_sp — nazwa polityki przechowywania HDD,

  • vcd_org_ssd_sp — nazwa polityki przechowywania SSD.

I definiujemy nasze zmienne:

  • vcd_edge_local_ip_nginx — adres IP maszyny wirtualnej z NGINX,

  • vcd_edge_local_ip_bitrix — adres IP maszyny wirtualnej z 1C: Bitrix,

  • vcd_edge_local_ip_nextcloud — adres IP maszyny wirtualnej z Nextcloud.

W drugim pliku tworzymy i podajemy zmienne dla modułu VMware vCloud Director w pliku vcd.tfvars: Przypominamy, że w naszym przykładzie używamy własnej chmury mClouds, jeśli pracujesz z innym dostawcą, skonsultuj się o wartości z nim. 

Zawartość pliku vcd.tfvars.

vcd_org_url = "https://vcloud.mclouds.ru/api"

vcd_org_user = "orgadmin"

vcd_org_password = "*"

vcd = "org"

vcd_org_vdc = "orgvdc"

vcd_org_maxretry_timeout = 60

vcd_org_allow_unverified_ssl = true

vcd_org_catalog = "Templates"

vcd_templateos_centos7 = "CentOS7"

vcd_org_ssd_sp = "Polityka przechowywania Gold"

vcd_org_hdd_sp = "Polityka przechowywania Bronze"

vcd_org_edge_name = "MCLOUDS-EDGE"

vcd_edge_external_ip = "185.17.66.1"

vcd_edge_local_subnet = "192.168.110.0/24"

vcd_edge_local_ip_nginx = "192.168.110.1"

vcd_edge_local_ip_bitrix = "192.168.110.10"

vcd_edge_local_ip_nextcloud = "192.168.110.11"

vcd_edge_external_network = "NET-185-17-66-0"

Konfiguracja sieci, network.tf.

Zmienne środowiskowe zostały ustawione, teraz skonfigurujemy schemat połączenia wirtualnych maszyn — przypiszemy każdy wirtualnej maszynie prywatny adres IP i za pomocą Destination NAT 'przekierujemy' porty do sieci zewnętrznej. Aby ograniczyć dostęp do portów sterujących, ustalimy dostęp tylko dla naszego adresu IP.

Jak zarządzać infrastrukturą chmurową za pomocą TerraformSchemat sieci dla tworzonej platformy Terraform

Tworzymy wirtualną organizacyjną sieć o nazwie net_lan01, z domyślną bramą: 192.168.110.254 oraz z przestrzenią adresową: 192.168.110.0/24.

Opisujemy wirtualną sieć.

resource "vcd_network_routed" "net" {

  name = "net_lan01"

  edge_gateway = var.vcd_org_edge_name

  gateway = "192.168.110.254"

  dns1 = "1.1.1.1"

  dns2 = "8.8.8.8"

 static_ip_pool {

start_address = "192.168.110.1"

end_address = "192.168.110.253"

  }

}

Utworzymy zasady dla zapory, które umożliwią wirtualnym maszynom dostęp do sieci Internet. W ramach tego bloku wszystkie wirtualne zasoby w chmurze będą miały dostęp do sieci Internet:

Opisujemy zasady dostępu VM do internetu.

resource "vcd_nsxv_firewall_rule" "fw_internet_access" {

  edge_gateway = var.vcdorgedgename

  name = "Dostęp do Internetu"

  source {

gateway_interfaces = ["internal"]

  }

  destination {

gateway_interfaces = ["external"]

  }

  service {

protocol = "any"

  }

  depends_on = [vcdnetworkrouted.net]

}

Po ustawieniu zależności, że po przetworzeniu bloku vcdnetworkrouted.net przystępujemy do konfiguracji bloku vcdnsxvfirewallrule, za pomocą dependson. Używamy tej opcji, ponieważ niektóre zależności mogą być rozpoznawane niejawnie w konfiguracji.

Następnie tworzymy zasady zezwalające na dostęp do portów z sieci zewnętrznej i podajemy nasz adres IP do połączeń SSH z serwerami. Każdy użytkownik sieci Internet ma dostęp do portów 80 i 443 na serwerze www, a użytkownik z adresem IP 90.1.15.1 ma dostęp do portów SSH wirtualnych serwerów.

Zezwalamy na dostęp do portów z sieci zewnętrznej.

resource "vcd_nsxv_firewall_rule" "fwnatports" {

  edge_gateway = var.vcd_org_edge_name

  name = "Dostęp HTTPs"

  source {

gateway_interfaces = ["external"]

  }

  destination {

  gateway_interfaces = ["internal"]

  }

  service {

protocol = "tcp"

port = "80"

  }

  service {

protocol = "tcp"

port = "443"

  }

  depends_on = [vcd_network_routed.net]

}

resource "vcd_nsxv_firewall_rule" "fw_nat_admin_ports" {

  edge_gateway = var.vcd_org_edge_name

  name = "Dostęp administracyjny"

  source {

  ip_addresses = [ "90.1.15.1" ]

  }

  destination {

  gateway_interfaces = ["internal"]

  }

  service {

protocol = "tcp"

port = "58301"

  }

  service {

protocol = "tcp"

port = "58302"

  }

  service {

protocol = "tcp"

port = "58303"

  }

  depends_on = [vcd_network_routed.net]

}

Tworzymy zasady Source NAT dla dostępu do sieci Internet z chmury lokalnej:

Opisujemy zasady Source NAT.

resource "vcd_nsxv_snat" "snat_local" {

edge_gateway = var.vcd_org_edge_name

  network_type = "ext"

  network_name = var.vcdedgeexternalnetwork

  original_address = var.vcd_edge_local_subnet

translated_address = var.vcd_edge_external_ip

  depends_on = [vcd_network_routed.net]

}

I na zakończenie konfiguracji bloku sieciowego dodajemy zasady Destination NAT dla dostępu do usług z sieci zewnętrznej:

Dodajemy zasady Destination NAT.

resource "vcd_nsxv_dnat" "dnat_tcp_nginx_https" {
edge_gateway = var.vcd_org_edge_name
network_name = var.vcd_edge_external_network
network_type = "ext"

  description = "NGINX HTTPs"

oryginalny_adres = var.vcd_edge_external_ip
oryginalny_port = 443

przetłumaczony_adres = var.vcd_edge_local_ip_nginx
przetłumaczony_port = 443
protokół = "tcp"

depends_on = [vcd_network_routed.net]
}
zasób "vcd_nsxv_dnat" "dnat_tcp_nginx_http" {
edge_gateway = var.vcd_org_edge_name
network_name = var.vcd_edge_external_network
network_type = "ext"

opis = "NGINX HTTP"

oryginalny_adres = var.vcd_edge_external_ip
oryginalny_port = 80

przetłumaczony_adres = var.vcd_edge_local_ip_nginx
przetłumaczony_port = 80
protokół = "tcp"

depends_on = [vcd_network_routed.net]

}

Dodajemy regułę NAT do translacji portów do serwera SSH pod Nginx.

zasób "vcd_nsxv_dnat" "dnat_tcp-nginx_ssh" {
edge_gateway = var.vcd_org_edge_name
network_name = var.vcd_edge_external_network
network_type = "ext"

opis = "SSH NGINX"

oryginalny_adres = var.vcd_edge_external_ip
oryginalny_port = 58301

przetłumaczony_adres = var.vcd_edge_local_ip_nginx
przetłumaczony_port = 22
protokół = "tcp"

depends_on = [vcd_network_routed.net]

}

Dodajemy regułę NAT do translacji portów do serwera SSH z 1C-Bitrix.

zasób "vcd_nsxv_dnat" "dnat_tcp_bitrix_ssh" {
edge_gateway = var.vcd_org_edge_name
network_name = var.vcd_edge_external_network
network_type = "ext"

opis = "SSH Bitrix"

oryginalny_adres = var.vcd_edge_external_ip
oryginalny_port = 58302

przetłumaczony_adres = var.vcd_edge_local_ip_bitrix
przetłumaczony_port = 22
protokół = "tcp"

depends_on = [vcd_network_routed.net]

}

Dodajemy regułę NAT do translacji portów do serwera SSH z Nextcloud.

zasób "vcd_nsxv_dnat" "dnat_tcp_nextcloud_ssh" {
edge_gateway = var.vcd_org_edge_name
network_name = var.vcd_edge_external_network
network_type = "ext"

opis = "SSH Nextcloud"

oryginalny_adres = var.vcd_edge_external_ip
oryginalny_port = 58303 przetłumaczony_adres = var.vcd_edge_local_ip_nextcloud
przetłumaczony_port = 22
protokół = "tcp"

depends_on = [vcd_network_routed.net]

}

Konfiguracja wirtualnego środowiska main.tf

Jak zaplanowaliśmy na początku artykułu, stworzymy trzy maszyny wirtualne. Zostaną one przygotowane z użyciem „Guest Customization”. Parametry sieciowe zostaną zapisane zgodnie z naszymi ustawieniami, a hasło użytkownika będzie generowane automatycznie.

Opiszemy vApp, w którym będą znajdować się maszyny wirtualne oraz ich konfiguracja.

Jak zarządzać infrastrukturą chmurową za pomocą TerraformKonfiguracja maszyn wirtualnych

Stworzymy kontener vApp. Abyśmy mogli od razu podłączyć vApp i maszyny wirtualne do wirtualnej sieci, dodajemy także parametr depends_on:

Tworzymy kontener

zasób "vcd_vapp" "vapp" {
nazwa = "web"
włączone = "true" depends_on = [vcd_network_routed.net]

}

Stworzymy maszynę wirtualną z opisem

zasób "vcd_vapp_vm" "nginx" {

nazwa_vapp = vcd_vapp.vapp.name

nazwa = "nginx"

nazwa_katalogu = var.vcd_org_catalog

nazwa_szablonu = var.vcd_template_os_centos7

profil_przechowywania = var.vcd_org_ssd_sp

pamięć = 8192

procesory = 1

rdzenie_cpu = 1

sieć {

typ = "org"

nazwa = vcd_network_routed.net.name

jest_podstawowy = true

typ_adaptera = "VMXNET3"

tryb_przydzielania_ip = "MANUAL"

ip = var.vcd_edge_local_ip_nginx

}

nadpisz_szablon_dysku {

typ_busa = "paravirtual"

rozmiar_w_mb = "32768"

numer_busa = 0

numer_jednostki = 0

profil_przechowywania = var.vcd_org_ssd_sp

}

}

Podstawowe parametry w opisie VM:

  • nazwa — nazwa maszyny wirtualnej,

  • nazwa_vapp — nazwa vApp, do którego dodać nową VM,

  • nazwa_katalogu / nazwa_szablonu — nazwa katalogu i nazwa szablonu maszyny wirtualnej,

  • profil_przechowywania — domyślna polityka przechowywania.

Parametry bloku sieci:

  • typ — typ podłączanej sieci,

  • nazwa — do jakiej wirtualnej sieci podłączyć VM,

  • jest_podstawowy — podstawowy adapter sieciowy,

  • tryb_przydzielania_ip — tryb przydzielania adresu MANUAL / DHCP / POOL,

  • ip — adres IP dla maszyny wirtualnej, podamy ręcznie.

Blok nadpisywania_szablonu_dysku:

  • rozmiarwmb — rozmiar dysku startowego dla maszyny wirtualnej

  • profil_przechowywania — polityka przechowywania dla dysku

Stworzymy drugą VM z opisem pamięci masowej Nextcloud

zasób "vcd_vapp_vm" "nextcloud" {

nazwa_vapp = vcd_vapp.vapp.name

nazwa = "nextcloud"

nazwa_katalogu = var.vcd_org_catalog

nazwa_szablonu = var.vcd_template_os_centos7

profil_przechowywania = var.vcd_org_ssd_sp

pamięć = 8192

procesory = 1

rdzenie_cpu = 1

sieć {

typ = "org"

nazwa = vcd_network_routed.net.name

jest_podstawowy = true

typ_adaptera = "VMXNET3"

tryb_przydzielania_ip = "MANUAL"

ip = var.vcd_edge_local_ip_nextcloud

}

nadpisz_szablon_dysku {

typ_busa = "paravirtual"

rozmiar_w_mb = "32768"

numer_busa = 0

numer_jednostki = 0

profil_przechowywania = var.vcd_org_ssd_sp

}

}

resource "vcd_vm_internal_disk" "disk1" {

vapp_name = vcd_vapp.vapp.name

vm_name = "nextcloud"

bus_type = "paravirtual"

size_in_mb = "102400"

bus_number = 0

unit_number = 1

storage_profile = var.vcd_org_hdd_sp

allow_vm_reboot = true

depends_on = [ vcd_vapp_vm.nextcloud ]

}

W sekcji vcdvminternal_disk opisujemy nowy wirtualny dysk, który jest podłączany do wirtualnej maszyny.

Wyjaśnienia dotyczące bloku vcdvminternaldisk:

  • bustype — typ kontrolera dysku

  • sizeinmb — rozmiar dysku

  • busnumber / unitnumber — miejsce podłączenia w adapterze

  • profil_przechowywania — polityka przechowywania dla dysku

Opisujemy ostatnią VM na Bitrix

resource "vcd_vapp_vm" "bitrix" {

nazwa_vapp = vcd_vapp.vapp.name

name = "bitrix"

nazwa_katalogu = var.vcd_org_catalog

nazwa_szablonu = var.vcd_template_os_centos7

profil_przechowywania = var.vcd_org_ssd_sp

pamięć = 8192

procesory = 1

rdzenie_cpu = 1

sieć {

typ = "org"

nazwa = vcd_network_routed.net.name

jest_podstawowy = true

typ_adaptera = "VMXNET3"

tryb_przydzielania_ip = "MANUAL"

ip = var.vcd_edge_local_ip_bitrix

}

nadpisz_szablon_dysku {

typ_busa = "paravirtual"

size_in_mb = "81920"

numer_busa = 0

numer_jednostki = 0

profil_przechowywania = var.vcd_org_ssd_sp

}

}

Aktualizacja systemu operacyjnego i instalacja dodatkowych skryptów

Sieć jest przygotowana, wirtualne maszyny zostały opisane. Przed importem naszej infrastruktury możemy przeprowadzić początkowe provisionowanie za pomocą bloków provisioners i bez użycia Ansible.

Rozważmy jak zaktualizować system operacyjny i uruchomić skrypt instalacyjny CMS Bitrix za pomocą bloku provisioner.

Najpierw zainstalujemy pakiety aktualizacji CentOS.

resource "null_resource" "nginx_update_install" {

provisioner "remote-exec" {

connection {

type = "ssh"

user = "root"

password = vcd_vapp_vm.nginx.customization[0].admin_password

host = var.vcd_edge_external_ip

port = "58301"

timeout = "30s"

}

inline = [

"yum -y update && yum -y upgrade",

"yum -y install wget nano epel-release net-tools unzip zip" ]

}

}

}

Oznaczenie składników:

  • provisioner «remote-exec» — łączymy blok zdalnego «provisioningu»

  • W bloku connection opisujemy typ i parametry połączenia:

  • type — protokół, w naszym przypadku SSH;

  • user — nazwa użytkownika;

  • password — hasło użytkownika. W naszym przypadku wskazujemy na parametr vcdvappvm.nginx.customization[0].admin_password, który przechowuje wygenerowane hasło dla użytkownika systemu.

  • host — zewnętrzny adres IP do połączenia;

  • port — port do połączenia, który wcześniej wskazaliśmy w ustawieniach DNAT;

  • inline — wymieniamy listę poleceń, które będą wprowadzane. Polecenia będą wprowadzane po kolei, tak jak jest to wskazane w tej sekcji.

Jako przykład, dodatkowo wykonamy skrypt instalacji 1C-Bitrix. Wynik wykonania skryptu będzie dostępny w czasie realizacji planu. Aby zainstalować skrypt, najpierw opiszemy blok:

Opisujemy instalację 1C-Bitrix.

provisioner "file" {

source = "prepare.sh"

destination = "\/tmp\/prepare.sh"

connection {

type = "ssh"

user = "root"

password = vcd_vapp_vm.nginx.customization[0].admin_password

host = var.vcd_edge_external_ip

port = "58301"

timeout = "30s"

}

}

provisioner "remote-exec" {

inline = [

"chmod +x \/tmp\/prepare.sh", ".\/tmp\/prepare.sh"

]

}

I od razu opisujemy aktualizację Bitrix.

Przykład provisioningu 1C-Bitrix.

resource "null_resource" "install_update_bitrix" {

provisioner "remote-exec" {

connection {

type = "ssh"

user = "root"

password = vcd_vapp_vm.bitrix.customization[0].admin_password

host = var.vcd_edge_external_ip

port = "58302"

timeout = "60s"

}

inline = [

"yum -y update && yum -y upgrade",

"yum -y install wget nano epel-release net-tools unzip zip",

"wget http:\/\/repos.1c-bitrix.ru\/yum\/bitrix-env.sh -O \/tmp\/bitrix-env.sh",

"chmod +x \/tmp\/bitrix-env.sh",

"\/tmp\/bitrix-env.sh"

]

}

}

Uwaga! Skrypt może nie zadziałać, jeśli wcześniej nie wyłączysz SELinux! Jeśli potrzebujesz szczegółowego artykułu na temat instalacji i konfiguracji CMS 1C-Bitrix za pomocą bitrix-env.sh, możesz skorzystać z naszego artykułu na blogu na stronie.

3. Inicjalizacja infrastruktury

Jak zarządzać infrastrukturą chmurową za pomocą TerraformInicjalizacja modułów i wtyczek

Do pracy używamy prostego „zestawu dżentelmena”: laptopa z systemem Windows 10 oraz dystrybucji z oficjalnej strony terraform.io. Rozpakujemy i zainicjalizujemy za pomocą polecenia: terraform.exe init

Po opisaniu infrastruktury obliczeniowej i sieciowej, uruchamiamy planowanie, aby sprawdzić naszą konfigurację, gdzie możemy zobaczyć, co zostanie utworzone i jak jest połączone.

  1. Wykonujemy polecenie - terraform plan -var-file=vcd.tfvars.

  2. Otrzymujemy wynik - Plan: 16 do dodania, 0 do zmiany, 0 do zniszczenia. Oznacza to, że według tego planu zostanie utworzonych 16 zasobów.

  3. Uruchamiamy plan za pomocą polecenia - terraform.exe apply -var-file=vcd.tfvars.

Maszyny wirtualne zostaną utworzone, a następnie wykonane będą wymienione przez nas pakiety w ramach sekcji provisioner — system operacyjny zostanie zaktualizowany i zainstalowane zostanie CMS Bitrix.

Uzyskiwanie danych do połączenia

Po wykonaniu planu chcemy uzyskać dane do połączenia z serwerami w formie tekstowej, w tym celu zorganizujemy sekcję output w następujący sposób:

output "nginxpassword" {

 value = vcdvappvm.nginx.customization[0].adminpassword

}

A następnie wynik informuje nas o haśle do utworzonej maszyny wirtualnej:

Outputs: nginx_password = F#4u8!!N

W rezultacie uzyskujemy dostęp do maszyn wirtualnych z zaktualizowanym systemem operacyjnym i wstępnie zainstalowanymi pakietami do naszej dalszej pracy. Wszystko gotowe!

Ale co jeśli masz już istniejącą infrastrukturę?

3.1. Praca Terraform z już istniejącą infrastrukturą

To proste, możesz zaimportować aktualne maszyny wirtualne i ich kontenery vApp za pomocą polecenia import.

Opiszemy zasób vAPP oraz maszynę wirtualną.

resource "vcd_vapp" "Monitoring" {

name = "Monitoring"

org = "mClouds"

vdc = "mClouds"

}

resource "vcd_vapp_vm" "Zabbix" {

name = "Zabbix"

org = "mClouds"

vdc = "mClouds"

vapp = "Monitoring"

}

Następny krok to import właściwości zasobów vApp w formacie vcdvapp.<vApp> <org>.<orgvdc>.<vApp>, gdzie:

  • vApp — nazwa vApp;

  • org — nazwa organizacji;

  • org_vdc — nazwa wirtualnego centrum danych.

Jak zarządzać infrastrukturą chmurową za pomocą TerraformImport właściwości zasobu vAPP

Wykonamy import właściwości zasobów VM w formacie: vcdvappvm.<VM> <org>.<orgvdc>.<vApp>.<VM>, w którym:

  • VM — nazwa VM;

  • vApp — nazwa vApp;

  • org — nazwa organizacji;

  • orgvdc — nazwa wirtualnego centrum danych.

Import udany

C:UsersMikhailDesktopterraform>terraform import vcd_vapp_vm.Zabbix mClouds.mClouds.Monitoring.Zabbix

vcd_vapp_vm.Zabbix: Importowanie z ID "mClouds.mClouds.Monitoring.Zabbix"...

vcd_vapp_vm.Zabbix: Import przygotowany!

Przygotowano vcd_vapp_vm do importu

vcd_vapp_vm.Zabbix: OdsRefreshing state... [id=urn:vcloud:vm:778f4a89-1c8d-45b9-9d94-0472a71c4d1f]

Import zakończony sukcesem!

Zaimportowane zasoby są pokazane powyżej. Te zasoby są teraz w
twoim stanie Terraform i będą od teraz zarządzane przez Terraform.

Teraz możemy zobaczyć nowo zaimportowany zasób:

Zaimportowany zasób

> terraform show

...

# vcd_vapp.Monitoring:

resource "vcd_vapp" "Monitoring" {

guest_properties = {}

href = "https://vcloud.mclouds.ru/api/vApp/vapp-fe5db285-a4af-47c4-93e8-55df92f006ec"

id = "urn:vcloud:vapp:fe5db285-a4af-47c4-93e8-55df92f006ec"

ip = "przydzielony"

metadata = {}

name = "Monitoring"

org = "mClouds"

status = 4

status_text = "WŁĄCZONY"

vdc = "mClouds"

}

# vcd_vapp_vm.Zabbix:

resource "vcd_vapp_vm" "Zabbix" {

computer_name = "Zabbix"

cpu_cores = 1

cpus = 2

expose_hardware_virtualization = false

guest_properties = {}

hardware_version = "vmx-14"

href = "https://vcloud.mclouds.ru/api/vApp/vm-778f4a89-1c8d-45b9-9d94-0472a71c4d1f"

id = "urn:vcloud:vm:778f4a89-1c8d-45b9-9d94-0472a71c4d1f"

internal_disk = [

{

numer_busa = 0

typ_busa = "paravirtual"

disk_id = "2000"

iops = 0

size_in_mb = 122880

storage_profile = "Złota Polityka Przechowywania"

thin_provisioned = true

numer_jednostki = 0

},

]

memory = 8192

metadata = {}

name = "Zabbix"

org = "mClouds"

os_type = "centos8_64Guest"

storage_profile = "Złota Polityka Przechowywania"

vapp_name = "Monitoring"

vdc = "mChmury"

customization {

allow_local_admin_password = true

auto_generate_password = true

change_sid = false

enabled = false

force = false

join_domain = false

join_org_domain = false

must_change_password_on_first_login = false

number_of_auto_logons = 0

}

sieć {

adapter_type = "VMXNET3"

ip_allocation_mode = "DHCP"

is_primary = true

mac = "00:50:56:07:01:b1"

name = "MCLOUDS-LAN01"

type = "org"

}

}

Teraz to na pewno gotowe — skończyliśmy z ostatnim elementem (import do istniejącej infrastruktury) i omówiliśmy wszystkie kluczowe aspekty pracy z Terraform. 

Narzędzie okazało się bardzo przydatne i pozwala na opisanie Twojej infrastruktury jako kodu, od maszyn wirtualnych jednego dostawcy chmur do opisywania zasobów komponentów sieciowych.

Jednocześnie niezależność od środowiska umożliwia pracę zarówno z lokalnymi, jak i chmurowymi zasobami, aż po zarządzanie platformą. A w przypadku braku obsługiwanej platformy i chęci dodania nowej, można napisać własnego dostawcę i go używać.

Źródło: habr.com

Kup solidny hosting stron z ochroną przed DDoS, serwery VPS VDS 🔥 Kup solidny hosting stron z ochroną przed DDoS, serwery VPS VDS | ProHoster