Saltar al contenido

Experimentar localmente con Terraform

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.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)


Tags : /

Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *