我们正在研究Terraform作为管理基础设施的一种方式,它看起来非常有趣。
但是,目前我们的公司代理/防火墙由于安全限制导致terraform apply
失败。
在我们等待解决这些网络问题的同时,有什么方法可以在本地试验Terraform而无需连接到Azure或AWS?也许使用Virtual Box?
答案 0 :(得分:9)
熟悉Terraform擅长的一些方法(依赖管理,数据驱动配置,资源生命周期等)的一种方法是使用工作站上的null_resource provisioner。这假设您对工作站有足够的控制权来获取Terraform(这在很多具有高安全性需求的地方非常困难)。
通过使用Terraform的null_resource配置程序,您可以习惯使用云计算的 lot 。如果你能够在你的工作站上安装Docker,那么你可以真的远看起来像云一样,因为Docker支持工作站上的swarm模式。
例如,
resource "null_resource" "docker_swarm" {
provisioner "local-exec" {
command = "docker swarm init"
}
provisioner "local-exec" {
command = <<EOF
docker swarm leave --force
# Careful here. This assumes you want a clean Docker slate,
# remove all Docker volumes from your machine.
docker volume rm -f $(docker volume ls -q)
EOF
when = "destroy"
}
}
resource "null_resource" "start_stack" {
provisioner "local-exec" {
command = "docker stack deploy -c ./docker-stack.yml demostack"
}
provisioner "local-exec" {
command = "docker stack rm demostack"
when = "destroy"
}
depends_on = ["null_resource.docker_swarm"]
}
在上面的简单示例中,您将了解如何管理生命周期。这里有一个很酷的部分:这正是你在AWS,Azure等中启动支持的Docker Swarm的方式,虽然它会有点复杂并需要更长的时间。
如果你没有Docker,我相信你可以想到你工作站上可能有的其他一些创建/破坏生命周期。
祝你好运!恕我直言Terraform是键盘上最深刻的东西之一(Docker也在那里排名)。答案 1 :(得分:8)
Terraform支持一堆providers但其中绝大多数是基于公共云的。
但是,您可以设置本地VMWare VSphere群集并使用VSphere提供程序与其进行交互以使您前进。如果您想要设置OpenStack群集,那么它还是OpenStack的提供者。
或者您可以尝试使用HPE's Eucalyptus之类的东西,它提供与AWS的API兼容性,但是在内部。
尽管如此,除非您已经有一个运行VMWare的数据中心,否则所有这些选项都非常糟糕,需要花费很多精力才能进行设置,这样您最好等待防火墙被打开。
不幸的是,对于Virtualbox提供商来说,这是一个很好的无摩擦的第一方实现,但你可以尝试这个third party Virtualbox provider。
答案 2 :(得分:6)
如果您可以访问AWS / Azure,为什么不在那里创建一台计算机?通过这种方式,你可以使用它来研究terraform,并在不受No&#34;部门限制的情况下学习它。
使用不同的提供商并不是一个好主意,因为一个提供商中的配置可能与另一个提供商的配置非常不同,甚至认证(AWS提供商可能是最佳起点)
答案 3 :(得分:2)
如果可以在其他位置下载提供程序文件并将其发送给自己,则可以在项目目录中本地使用它们。这是用于Mac的terraform datadog提供程序的示例:
wget https://releases.hashicorp.com/terraform-provider-datadog/1.0.4/terraform-provider-datadog_1.0.4_darwin_amd64.zip
unzip terraform-provider-datadog_1.0.4_darwin_amd64.zip
mkdir -p project_directory/terraform.d/plugins/darwin_amd64
mv terraform-provider-datadog_1.0.4_darwin_amd64 project_directory/terraform.d/plugins/darwin_amd64
cd project_directory
terraform init
答案 4 :(得分:2)
虽然我们等待这些网络问题得到解决,但是我有什么方法可以在本地进行Terraform的试验而无需连接到Azure或AWS?也许使用Virtual Box?
我使用KVM拥有尽可能多的虚拟机来玩任何东西,现在我正在学习Terraform,但其具体目的是自动创建此VM。
因此,如果您正在寻找一个本地主机游乐场来学习Terraform,那么KVM是一种不错的,更轻量级的方法,然后使用其他沉重的虚拟化技术,例如您提到的Virtualbox。
如果您想同时与AWS和Azure提供者一起学习Terraform,那么这对您来说不是一个好的解决方案,否则请尝试一下。
首先,您需要在Linux机器上安装KVM。
sudo apt update && sudo apt upgrade
检查系统是否支持硬件虚拟化:
$ egrep -c ‘(svm|vmx)’ /proc/cpuinfo
4
输出必须大于0
,否则我们需要进入Bios并启用VT技术。
检查是否支持KVM认证:
安装工具:
sudo apt install cpu-checker
检查:
$ sudo kvm-ok
INFO: /dev/kvm exists
KVM acceleration can be used
安装KVM
sudo apt install qemu qemu-kvm libvirt-bin bridge-utils virt-manager
检查正在运行:
service libvirtd status
如果未运行:
sudo service libvirtd start && sudo update-rc.d libvirtd enable
另一张支票:
sudo virsh -c qemu:///system list
我们将使用此KVM Libvirt Provider创建VM。
mkdir playground && cd playground
创建文件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
部分中定义的变量的任何默认值,但是每个环境变量名称必须以TF_VAR
开头:
export TF_VAR_VM_COUNT=5
创建文件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' ]
注意:将您的公钥添加到文件中
创建文件network_config.cfg
:
version: 2
ethernets:
ens3:
dhcp4: true
要初始化Terraform:
terraform init
创建VM:
terraform apply
获取每个虚拟机的ips:
virsh net-dhcp-leases vm_network
注意::我们创建的VM会花几秒钟才能获得IP,因此您可能需要重复几次此命令,直到获得IP。
现在只需使用您从virsh
获得的IP地址通过SSH进入其中一台VM:
ssh developer@vm-ip-address
玩得开心,享受您的新游乐场。
答案 5 :(得分:1)
即使您没有aws帐户,也可以创建一年免费ec2(您必须注意使用以及此免费帐户可用的资源)。
这使www.terraform.io/intro/getting-started/可供您使用。
这需要您的真实电话号码(AWS通过“机器人”呼叫您填写手机中显示的PIN码)。这需要有效的信用卡(您可以使用虚拟万事达卡/签证卡,价格为1美元)。
从那里开始免费与真正的提供商合作真好!
来自https://www.terraform.io/intro/getting-started/build.html
对于入门指南,我们只会使用符合AWS免费套餐资格的资源,这意味着它将是免费的。如果您已拥有AWS账户,可能会向您收取一定数额的费用,但最多不应超过几美元。