web-dev-qa-db-ja.com

Terraformをローカルで試す

インフラストラクチャを管理する方法としてTerraformを検討しており、非常に興味深いようです。

ただし、現在、企業のプロキシ/ファイアウォールが原因でterraform applyセキュリティ上の制限により失敗します。

これらのネットワークの問題が解決されるのを待つ間、AzureやAWSに接続せずにローカルでTerraformを試すことができる方法はありますか?たぶんVirtual Boxで?

18
David Brower

Terraformは多数の プロバイダー をサポートしていますが、それらの大部分はパブリッククラウドベースです。

ただし、ローカルの VMWare VSphere クラスターをセットアップし、VSphereプロバイダーを使用してそれとやり取りし、作業を開始することもできます。 OpenStackクラスターをセットアップしたい場合は、 OpenStack のプロバイダーもあります。

または、AWSとのAPI互換性を提供する HPEのEucalyptus のようなものを使用してみることもできますが、オンプレミスです。

とは言っても、すでにVMWareを実行しているデータセンターがない限り、これらのオプションはすべてかなりひどく、セットアップに多くの労力がかかるため、代わりにファイアウォールが開かれるのを待つのが最善です。

残念ながら、Virtualboxプロバイダーの摩擦のない素敵なファーストパーティの実装はありませんが、これを試すことができます サードパーティのVirtualboxプロバイダー

9
ydaetskcoR

Terraformが得意とするいくつかのことに依存する1つの方法(依存関係管理、データ駆動型構成、リソースライフサイクルなど)は、ワークステーションで null_resource provisioner を使用することです。これは、Terraformを取得するためにワークステーションを十分に制御できることを前提としています(これは、高度なセキュリティが必要な多くの場所ではかなり困難です)。

Terraformのnull_resourceプロビジョナーを使用するだけで、クラウドで使用するもののロットに慣れることができます。ワークステーションにDockerをインストールできる場合は、Dockerがワークステーションでスウォームモードをサポートしているため、クラウドのように本当に動作することができます。

例えば、

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がない場合は、ワークステーションで使用できる他の作成/破棄ライフサイクルを考えることができると思います。

幸運を! IMHO Terraformは、キーボードに出会う最も深いものの1つです(Dockerもそこにランク付けされます)。

11
Flacito

AWS/Azureにアクセスできたら、そこでマシンを作成してみませんか?そうすれば、それを使って作業したり、地形を調査したり、「noの部門」の制限なしにそれを学んだりできます。

あるプロバイダーでのプロビジョニングは別のプロバイダーとは非常に異なる可能性があるため、異なるプロバイダーを使用することは良い考えではありません。認証についても、その場合はAWSプロバイダーが最適です。

7

これらのネットワークの問題が解決されるのを待つ間、AzureやAWSに接続する必要なしにTerraformをローカルで試すことができる方法はありますか?たぶんVirtual Boxで?

私はKVM=を使用して、何でも遊ぶ必要があるだけの仮想マシンを用意しました。現在、Terraformを学習していますが、このVMの作成を自動化するという特定の目的があります。

したがって、Terraformを学ぶだけのlocalhostプレイグラウンドを探している場合は、KVMは、前述のVirtualboxなど、他の重い仮想化テクノロジーを使用した、より軽量で優れたアプローチです。

AWSおよびAzureプロバイダーで同時にプレイしながらTerraformを学びたい場合は、これは良いソリューションではありません。それ以外の場合は試してみてください。

KVMをインストールする

まず、LinuxマシンにKVM=をインストールする必要があります。

Sudo apt update &&  Sudo apt upgrade

システムがハードウェア仮想化をサポートしているかどうかを確認します。

$ egrep -c ‘(svm|vmx)’ /proc/cpuinfo
4

出力は0より大きくする必要があります。それ以外の場合は、BIOSに入り、VTテクノロジーを有効にする必要があります。

サポートかどうかを確認KVM acelaration:

ツールのインストール:

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 TerraformでVMを作成する方法

この KVM Libvirt Provider を使用してVMを作成します。

mkdir playground && cd playground

Terraformメインファイル

ファイル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セクションで定義された変数のデフォルト値を上書きするようにenv varsを設定できますが、各env var名の前には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を初期化するには:

terraform init

VMを作成します。

terraform apply

VMSのIPアドレス

各VMのIPを取得します。

virsh net-dhcp-leases vm_network

注:作成したVMがipsを取得するまでに数秒かかるため、ipsを取得するまでこのコマンドを数回繰り返す必要がある場合があります。

次に、virshから取得したIPアドレスを使用して、いずれかのVMにSSH接続します。

ssh developer@vm-ip-address

新しい遊び場を楽しんで楽しんでください。

3
Exadra37

プロバイダーファイルを他の場所にダウンロードして自分に送信できる場合は、プロジェクトディレクトリのローカルで使用できます。 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
2
tkjef

aws アカウントを持っていない場合でも、1年間無料の ec2 を作成できます(使用量と、この無料で利用できるリソースに注意する必要があります)アカウント)。

これにより www.terraform.io/intro/getting-started/ が利用できるようになります。

それにはあなたの本当の電話番号が必要です(AWSが表示されたPINを電話で埋めるために「ロボット」によってあなたに電話します)これには有効なクレジットカードが必要です(virtual mastercard/visa cardwith $ 1)。

そこから、無料で実際のプロバイダーと遊ぶのは素晴らしいです!

https://www.terraform.io/intro/getting-started/build.html から

入門ガイドでは、AWSの無料利用枠の対象となるリソースのみを使用します。つまり、無料になります。すでにAWSアカウントをお持ちの場合、いくらかの金額が請求される可能性がありますが、せいぜい数ドルを超えてはなりません。

1
Gilles Quenot