Hola usuario de nuestra web, encontramos la respuesta a tu pregunta, has scroll y la verás más abajo.
Solución:
Terraform es compatible con varios proveedores, pero la gran mayoría de ellos están basados en la nube pública.
Sin embargo, puede configurar un clúster de VMware vSphere local y usar el proveedor de vSphere para interactuar con él y comenzar. También hay un proveedor de OpenStack si desea configurar un clúster de OpenStack.
Alternativamente, puede intentar usar algo como Eucalyptus de HPE, que proporciona compatibilidad de API con AWS, pero en las instalaciones.
Dicho esto, a menos que ya tenga un centro de datos que ejecute VMware, todas esas opciones son bastante horribles y requerirán mucho esfuerzo para configurarlas, por lo que es mejor esperar a que se abra su firewall.
Desafortunadamente, no existe una buena implementación de primera parte sin fricciones de un proveedor de VirtualBox, pero puede probar este proveedor de VirtualBox de terceros.
Una forma de acostumbrarse a algunas cosas en las que Terraform es excelente (gestión de dependencias, configuración basada en datos, ciclo de vida de los recursos, etc.) es utilizar el aprovisionador null_resource en su estación de trabajo. Esto supone que tiene suficiente control sobre su estación de trabajo para instalar Terraform (esto es bastante difícil en muchos lugares que tienen altas necesidades de seguridad).
Con solo usar el aprovisionador null_resource de Terraform, puede acostumbrarse a un lote de las cosas que usará con una nube. Si tiene la capacidad de instalar Docker en su estación de trabajo, puede ir De Verdad lejos de actuar como una nube porque Docker admite el modo enjambre en una estación de trabajo.
Por ejemplo,
resource "null_resource" "docker_swarm"
provisioner "local-exec"
command = "docker swarm init"
provisioner "local-exec"
command = <
En ese simple ejemplo anterior, verá cómo administraría el ciclo de vida. Y aquí está la parte interesante: así es exactamente como iniciaría un Docker Swarm compatible en AWS, Azure, etc., aunque será un poco más complicado y llevará un poco más de tiempo.
Si no tiene Docker, estoy seguro de que puede pensar en algún otro ciclo de vida de creación / destrucción que pueda tener en su estación de trabajo.
¡Buena suerte! En mi humilde opinión, Terraform es una de las cosas más profundas que se encuentran en nuestros teclados (Docker también se ubica allí).
Mientras esperamos que se resuelvan estos problemas de red, ¿hay alguna forma de que pueda experimentar con Terraform localmente sin necesidad de conectarme a Azure o AWS? ¿Quizás con Virtual Box?
Uso KVM para tener tantas máquinas virtuales como necesito para jugar con cualquier cosa, y ahora estoy aprendiendo Terraform, pero con la intención específica de automatizar la creación de estas VM.
Entonces, si está buscando un área de juegos de host local para aprender Terraform, entonces KVM es un enfoque agradable y más liviano que el uso de otras tecnologías de virtualización pesadas, como la que mencionó, Virtualbox.
Si desea aprender Terraform mientras juega con los proveedores de AWS y Azure, esta no es una buena solución para usted; de lo contrario, pruébelo.
Instalar KVM
Primero necesita instalar KVM en su máquina Linux.
sudo apt update && sudo apt upgrade
Compruebe si el sistema admite la virtualización de hardware:
$ egrep -c ‘(svm|vmx)’ /proc/cpuinfo
4
La salida debe ser mayor que 0
, de lo contrario, debemos ingresar a la BIOS y habilitar la tecnología VT.
Compruebe si es compatible con la aceleración de KVM:
Instalación de la herramienta:
sudo apt install cpu-checker
Comprobación:
$ sudo kvm-ok
INFO: /dev/kvm exists
KVM acceleration can be used
Instalación de KVM
sudo apt install qemu qemu-kvm libvirt-bin bridge-utils virt-manager
La comprobación se está ejecutando:
service libvirtd status
Si no se está ejecutando:
sudo service libvirtd start && sudo update-rc.d libvirtd enable
Otro cheque:
sudo virsh -c qemu:///system list
Cómo crear máquinas virtuales en KVM con Terraform
Crearemos las máquinas virtuales utilizando este proveedor KVM Libvirt.
mkdir playground && cd playground
Archivo principal de Terraform
Crea el archivo main.tf
:
################################################################################
# ENV VARS
################################################################################
# https://www.terraform.io/docs/commands/environment-variables.html
variable "VM_COUNT"
default = 3
type = number
variable "VM_USER"
default = "developer"
type = string
variable "VM_HOSTNAME"
default = "vm"
type = string
variable "VM_IMG_URL"
default = "https://cloud-images.ubuntu.com/releases/bionic/release/ubuntu-18.04-server-cloudimg-amd64.img"
type = string
variable "VM_IMG_FORMAT"
default = "qcow2"
type = string
variable "VM_CIDR_RANGE"
default = "10.10.10.10/24"
type = string
################################################################################
# PROVIDERS
################################################################################
# instance the provider
provider "libvirt"
uri = "qemu:///system"
################################################################################
# DATA TEMPLATES
################################################################################
# https://www.terraform.io/docs/providers/template/d/file.html
# https://www.terraform.io/docs/providers/template/d/cloudinit_config.html
data "template_file" "user_data"
template = file("$path.module/cloud_init.cfg")
vars =
VM_USER = var.VM_USER
data "template_file" "network_config"
template = file("$path.module/network_config.cfg")
################################################################################
# RESOURCES
################################################################################
resource "libvirt_pool" "vm"
name = "$var.VM_HOSTNAME_pool"
type = "dir"
path = "/tmp/terraform-provider-libvirt-pool-ubuntu"
# We fetch the latest ubuntu release image from their mirrors
resource "libvirt_volume" "vm"
count = var.VM_COUNT
name = "$var.VM_HOSTNAME-$count.index_volume.$var.VM_IMG_FORMAT"
pool = libvirt_pool.vm.name
source = var.VM_IMG_URL
format = var.VM_IMG_FORMAT
# Create a public network for the VMs
resource "libvirt_network" "vm_public_network"
name = "$var.VM_HOSTNAME_network"
mode = "nat"
domain = "$var.VM_HOSTNAME.local"
addresses = ["$var.VM_CIDR_RANGE"]
dhcp
enabled = true
dns
enabled = true
# for more info about paramater check this out
# https://github.com/dmacvicar/terraform-provider-libvirt/blob/master/website/docs/r/cloudinit.html.markdown
# Use CloudInit to add our ssh-key to the instance
# you can add also meta_data field
resource "libvirt_cloudinit_disk" "cloudinit"
name = "$var.VM_HOSTNAME_cloudinit.iso"
user_data = data.template_file.user_data.rendered
network_config = data.template_file.network_config.rendered
pool = libvirt_pool.vm.name
# Create the machine
resource "libvirt_domain" "vm"
count = var.VM_COUNT
name = "$var.VM_HOSTNAME-$count.index"
memory = "1024"
vcpu = 1
cloudinit = "$libvirt_cloudinit_disk.cloudinit.id"
# TODO: Automate the creation of public network
network_interface
network_id = "$libvirt_network.vm_public_network.id"
#network_id = "6d8e2494-835d-4baf-a14f-3a5c705febcc"
#network_name = "vm_docker_network"
network_name = "$libvirt_network.vm_public_network.name"
# IMPORTANT
# Ubuntu can hang is a isa-serial is not present at boot time.
# If you find your CPU 100% and never is available this is why.
#
# This is a known bug on cloud images, since they expect a console
# we need to pass it:
# https://bugs.launchpad.net/cloud-images/+bug/1573095
console
type = "pty"
target_port = "0"
target_type = "serial"
console
type = "pty"
target_type = "virtio"
target_port = "1"
disk
volume_id = "$libvirt_volume.vm[count.index].id"
graphics
type = "spice"
listen_type = "address"
autoport = true
################################################################################
# TERRAFORM CONFIG
################################################################################
terraform
required_version = ">= 0.12"
Env Vars
Puede configurar env vars para anular cualquier valor predeterminado para las variables definidas en el ENV VARS
sección, pero cada nombre de var env debe tener el prefijo TF_VAR
:
export TF_VAR_VM_COUNT=5
Iniciación en la nube
Crea el archivo cloud_init.cfg
:
#cloud-config
users:
- name: $VM_USER
sudo: ALL=(ALL) NOPASSWD:ALL
groups: users, admin
home: /home/$VM_USER
shell: /bin/bash
ssh-authorized-keys:
- ssh-rsa your-public-key-here
ssh_pwauth: True
disable_root: false
chpasswd:
list: |
$VM_USER:linux
expire: False
package_update: true
package_upgrade: true
packages:
- qemu-guest-agent
- apt-transport-https
- ca-certificates
- curl
- gnupg-agent
- software-properties-common
- zsh
growpart:
mode: auto
devices: ['/']
runcmd:
- [ sh, -c, 'curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -' ]
- [ sh, -c, 'sudo apt-key fingerprint 0EBFCD88']
- [ sh, -c, 'sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"' ]
- [ sh, -c, 'sudo apt update' ]
- [ sh, -c, 'sudo apt install -y docker-ce docker-ce-cli containerd.io' ]
- [ sh, -c, 'printf "nalias dk="sudo docker"n" >> /home/$VM_USER/.bashrc' ]
- [ sh, -c, 'printf "nalias dkc="sudo docker container"n" >> /home/$VM_USER/.bashrc' ]
- [ sh, -c, 'printf "nalias dki="sudo docker image"n" >> /home/$VM_USER/.bashrc' ]
- [ sh, -c, 'printf "nalias dks="sudo docker service"n" >> /home/$VM_USER/.bashrc' ]
- [ sh, -c, 'printf "nalias dkn="sudo docker node"n" >> /home/$VM_USER/.bashrc' ]
NOTA: Agrega tu público key en el archivo
Configuración de red
Crea el archivo network_config.cfg
:
version: 2
ethernets:
ens3:
dhcp4: true
Ejecutar Terraform
Para iniciar Terraform:
terraform init
Cree las máquinas virtuales:
terraform apply
Direcciones IP de VMS
Obtenga las ips para cada VM:
virsh net-dhcp-leases vm_network
NOTA: Las máquinas virtuales que creamos tardarán algunos segundos en obtener sus ips, por lo que es posible que deba repetir este comando varias veces hasta obtener las ips.
Ahora solo SSH en una de las máquinas virtuales con la dirección IP que obtuviste virsh
:
ssh [email protected]
Diviértete y disfruta de tu nuevo parque infantil.
Si estás contento con lo expuesto, tienes la libertad de dejar una noticia acerca de qué le añadirías a esta división.