This shows you the differences between two versions of the page.
| Both sides previous revision Previous revision Next revision | Previous revision | ||
|
технология_terraform [2026/09/26 08:57] val [Установка] |
технология_terraform [2026/09/28 10:33] (current) val [terraform-provider-virtualbox] |
||
|---|---|---|---|
| Line 13: | Line 13: | ||
| * [[https://stackoverflow.com/questions/69860280/how-to-properly-reset-terraform-default-tfstate|How to properly reset Terraform default tfstate?]] | * [[https://stackoverflow.com/questions/69860280/how-to-properly-reset-terraform-default-tfstate|How to properly reset Terraform default tfstate?]] | ||
| + | * Вебинар: [[On-premise Terraform|Развертывание инфраструктуры в On-premise облаке с использованием Terraform]] | ||
| ===== Установка ===== | ===== Установка ===== | ||
| Line 32: | Line 33: | ||
| * https://mirror.selectel.ru/3rd-party/hashicorp-releases/terraform/1.9.2/terraform_1.9.2_windows_amd64.zip | * https://mirror.selectel.ru/3rd-party/hashicorp-releases/terraform/1.9.2/terraform_1.9.2_windows_amd64.zip | ||
| + | * [[Материалы по Windows#Установить PATH]] | ||
| + | <code> | ||
| + | PS C:\Users\Administrator> $Env:PATH | ||
| + | ...;C:\terraform\;... | ||
| + | </code> | ||
| ===== terraform-provider-libvirt ===== | ===== terraform-provider-libvirt ===== | ||
| Line 194: | Line 200: | ||
| <code> | <code> | ||
| - | ~/nodes# terraform validate | + | PS C:\Users\Administrator\nodes> |
| + | или | ||
| + | ~/nodes# | ||
| - | ~/nodes# terraform plan | + | terraform init |
| - | ~/nodes# terraform apply #-auto-approve | + | terraform validate |
| + | terraform plan | ||
| + | |||
| + | terraform apply #-auto-approve -parallelism=1 | ||
| + | |||
| + | terraform destroy #-auto-approve | ||
| + | |||
| + | ### rm -r .terraform .terraform.lock.hcl terraform.tfstate terraform.tfstate.backup | ||
| + | </code><code> | ||
| ~/nodes# virsh list --all | ~/nodes# virsh list --all | ||
| Line 214: | Line 230: | ||
| ... | ... | ||
| - | ~/nodes# terraform destroy #-auto-approve | + | ... |
| ~/nodes# ###virsh destroy domain-nodeN | ~/nodes# ###virsh destroy domain-nodeN | ||
| ~/nodes# ###virsh undefine --domain domain-nodeN | ~/nodes# ###virsh undefine --domain domain-nodeN | ||
| - | |||
| - | ~/nodes# ### rm -r .terraform .terraform.lock.hcl terraform.tfstate terraform.tfstate.backup | ||
| </code> | </code> | ||
| ==== Multi-Machine проект ==== | ==== Multi-Machine проект ==== | ||
| Line 366: | Line 380: | ||
| ===== terraform-provider-virtualbox ===== | ===== terraform-provider-virtualbox ===== | ||
| + | * https://github.com/terra-farm/terraform-provider-virtualbox | ||
| + | |||
| + | * [[Материалы по Windows#Установить PATH]] | ||
| + | <code> | ||
| + | PS C:\Users\Administrator\nodes> $Env:PATH | ||
| + | ...;C:\Program Files\Oracle\VirtualBox;... | ||
| + | |||
| + | PS C:\Users\Administrator\nodes> $env:TF_LOG="DEBUG" | ||
| + | |||
| + | PS C:\Users\Administrator\nodes> notepad providers.tf | ||
| + | </code><code> | ||
| + | terraform { | ||
| + | required_providers { | ||
| + | virtualbox = { | ||
| + | source = "terra-farm/virtualbox" | ||
| + | version = "0.2.2-alpha.1" | ||
| + | } | ||
| + | } | ||
| + | } | ||
| + | |||
| + | provider "virtualbox" { | ||
| + | } | ||
| + | </code><code> | ||
| + | PS C:\Users\Administrator\nodes> mkdir terraform.d\plugins\registry.terraform.io\terra-farm\virtualbox\0.2.2-alpha.1\windows_amd64\ | ||
| + | </code> | ||
| * https://github.com/terra-farm/terraform-provider-virtualbox/releases/download/v0.2.2-alpha.1/terraform-provider-virtualbox_0.2.2-alpha.1_windows_amd64.zip | * https://github.com/terra-farm/terraform-provider-virtualbox/releases/download/v0.2.2-alpha.1/terraform-provider-virtualbox_0.2.2-alpha.1_windows_amd64.zip | ||
| + | * [[#Управление проектом]] | ||
| + | <code> | ||
| + | PS C:\Users\Administrator\nodes> notepad main.tf | ||
| + | </code><code> | ||
| + | resource "virtualbox_vm" "node" { | ||
| + | count = 3 | ||
| + | name = format("node-%02d", count.index + 1) | ||
| + | image = "https://val.bmstu.ru/unix/HashiCorp/debian12-generic.box" | ||
| + | cpus = 2 | ||
| + | memory = "4096 mib" | ||
| + | network_adapter { | ||
| + | type = "hostonly" | ||
| + | host_interface = "VirtualBox Host-Only Ethernet Adapter" | ||
| + | } | ||
| + | |||
| + | provisioner "file" { | ||
| + | source = "${path.module}/pre_network.sh" | ||
| + | destination = "/home/vagrant/pre_network.sh" | ||
| + | |||
| + | connection { | ||
| + | type = "ssh" | ||
| + | user = "vagrant" | ||
| + | password = "vagrant" | ||
| + | host = self.network_adapter.0.ipv4_address | ||
| + | } | ||
| + | } | ||
| + | provisioner "remote-exec" { | ||
| + | |||
| + | #script = "${path.module}/pre_network.sh" | ||
| + | |||
| + | inline = [ | ||
| + | "chmod +x /home/vagrant/pre_network.sh", | ||
| + | "/home/vagrant/pre_network.sh ${count.index + 1}" | ||
| + | ] | ||
| + | |||
| + | connection { | ||
| + | type = "ssh" | ||
| + | user = "vagrant" | ||
| + | password = "vagrant" | ||
| + | host = self.network_adapter.0.ipv4_address | ||
| + | } | ||
| + | } | ||
| + | } | ||
| + | </code><code> | ||
| + | PS C:\Users\Administrator\nodes> notepad outputs.tf | ||
| + | </code><code> | ||
| + | #output "IPAddr" { | ||
| + | # value = element(virtualbox_vm.node.*.network_adapter.0.ipv4_address, 1) | ||
| + | #} | ||
| + | #output "IPAddr_2" { | ||
| + | # value = element(virtualbox_vm.node.*.network_adapter.0.ipv4_address, 2) | ||
| + | #} | ||
| + | output "node_ips" { | ||
| + | value = [for vm in virtualbox_vm.node : vm.network_adapter.0.ipv4_address] | ||
| + | description = "IP for VM" | ||
| + | } | ||
| + | </code> | ||
| + | * [[#Управление проектом]] | ||
| <code> | <code> | ||
| - | PS C:\Users\Administrator\terraform> mkdir terraform.d\plugins\registry.terraform.io\terra-farm\virtualbox\0.2.2-alpha.1\windows_amd64\ | + | PS C:\Users\Administrator\nodes> start notepad++ pre_network.sh |
| + | </code> | ||
| + | * Правка->Формат Конца Строк-> Преобразовать в Unix (LF) | ||
| + | <code> | ||
| + | #!/bin/bash | ||
| - | PS C:\Users\Administrator\terraform> $env:TF_LOG="DEBUG" | + | #!!! CHANGE IT !!! |
| + | X=13 | ||
| + | |||
| + | N=$1 | ||
| + | |||
| + | echo 'vagrant:strongpassword' | sudo /usr/sbin/chpasswd | ||
| + | |||
| + | sudo hostnamectl hostname node$N.corp$X.un | ||
| + | |||
| + | sudo tee /etc/network/interfaces <<EOF | ||
| + | auto lo | ||
| + | iface lo inet loopback | ||
| + | |||
| + | auto eth0 | ||
| + | iface eth0 inet static | ||
| + | address 192.168.$X.20$N | ||
| + | netmask 255.255.255.0 | ||
| + | gateway 192.168.$X.1 | ||
| + | EOF | ||
| + | |||
| + | sudo rm -f /etc/resolv.conf && sudo tee /etc/resolv.conf <<EOF | ||
| + | search corp$X.un | ||
| + | nameserver 192.168.$X.10 | ||
| + | EOF | ||
| + | |||
| + | sudo tee /etc/hosts <<EOF | ||
| + | 127.0.0.1 localhost | ||
| + | 192.168.$X.20$N node$N.corp$X.un node$N | ||
| + | EOF | ||
| + | |||
| + | sudo timedatectl set-timezone Europe/Moscow | ||
| + | |||
| + | echo "net.ipv4.ip_forward=1" | sudo tee /etc/sysctl.d/20-my-forward.conf | ||
| + | |||
| + | (echo '"\e[A": history-search-backward'; echo '"\e[B": history-search-forward') | sudo tee -a /etc/inputrc | ||
| + | |||
| + | sudo shutdown -r +1 | ||
| </code> | </code> | ||
| + | * [[#Управление проектом]] | ||
| ===== Провайдеры Selectel и OpenStack ===== | ===== Провайдеры Selectel и OpenStack ===== | ||