地形における多重環境?いいえ心配、使用するワークスペース


インフラストラクチャを管理したり、変更したり、削除したりするときは、terraformから始めるのは簡単です.だけで終わるファイルを作成します.必要なリソースの説明を含むtf.
たとえば、GCPクラウドプロバイダーで小さなインフラストラクチャを作成したいなら、
  • ベースホスト.
  • は、VPC
  • です
    ファイアウォール我々はちょうどいくつかを作成する必要があります.tfファイル:
    bastion-host.tf
    vpc.tf
    variables.tf
    output.tf
    main.tf
    firewall.tf
    
    ベースホスト.tf :
    resource "google_compute_instance" "mservice_bastion" {
      name         = "mservice-bastion"
      machine_type = "n1-standard-1"
      zone         = var.gcp_zone
    
      tags                      = ["ssh-mservice"]
      allow_stopping_for_update = true
    
      boot_disk {
        initialize_params {
          image = "debian-cloud/debian-9"
        }
      }
    
      network_interface {
        subnetwork = module.vpc.subnetwork
    
        access_config {
          // Ephemeral IP
        }
      }
    
      metadata = {
        service = "mservicebastion"
      }
    
      service_account {
        scopes = [
          "userinfo-email",
          "compute-rw",
          "storage-rw",
          "https://www.googleapis.com/auth/cloud-platform",
          "https://www.googleapis.com/auth/cloud-platform.read-only",
          "https://www.googleapis.com/auth/cloudplatformprojects",
          "https://www.googleapis.com/auth/cloudplatformprojects.readonly",
        ]
      }
    }
    
    VPCtf :
    resource "google_compute_network" "tag_network" {
      name                    = var.gcp_vpc_name
      auto_create_subnetworks = false
    }
    
    resource "google_compute_subnetwork" "tag_subnetwork" {
      name          = var.gcp_vpc_subnet_name
      ip_cidr_range = "10.1.0.0/16"
      region        = var.gcp_region
      network       = google_compute_network.tag_network.self_link
    
      secondary_ip_range {
        range_name    = format("%s-pod-range", var.cluster_name)
        ip_cidr_range = "10.2.0.0/20"
      }
    
      secondary_ip_range {
        range_name    = format("%s-svc-range", var.cluster_name)
        ip_cidr_range = "192.168.0.0/24"
      }
    }
    
    ファイアウォール.TF
    resource "google_compute_firewall" "mservice_allow_ssh" {
      name      = "mservice-allow-ssh"
      network   = module.vpc.network_name
      direction = "INGRESS"
    
      allow {
        protocol = "tcp"
        ports    = ["22"]
      }
    
      source_ranges = ["0.0.0.0/0"]
      target_tags   = ["ssh-mservice"]
    }
    
    変数.TF
    variable "gcp_project" {
      type    = string
      default = "falkinton-0991"
    }
    
    variable "gcp_region" {
      type    = string
      default = "us-central1"
    }
    
    variable "gcp_zone" {
      type    = string
      default = "us-central1-a"
    }
    
    variable "gcp_network" {
      type    = string
      default = "mservice-network"
    }
    
    variable "gcp_subnetwork" {
      type    = string
      default = "mservice-subnetwork"
    }
    
    variable "cluster_name" {
        type = string
        default = "falkinton-test"
    }
    
    メイン.tf :
    provider "google" {
      project = var.gcp_project
      region  = var.gcp_region
      zone    = var.gcp_zone
    }
    
    provider "google-beta" {
      project = var.gcp_project
      region  = var.gcp_region
      zone    = var.gcp_zone
    }
    
    今、我々はterraform(最初の時間だけ)を初期化して、計画を生成して、それを適用する必要があります.
    $ terraform init
    Initializing the backend...
    Initializing provider plugins...
    Terraform has been successfully initialized!
    You may now begin working with Terraform. Try running "terraform plan" to see
    any changes that are required for your infrastructure. All Terraform commands
    should now work.
    If you ever set or change modules or backend configuration for Terraform,
    rerun this command to reinitialize your working directory. If you forget, other
    commands will detect it and remind you to do so if necessary.
    
    initコマンドは、含まれるワーキングディレクトリを初期化します.tf設定ファイル.
    これは、新しい設定のために実行する最初のコマンド、または指定されたGitリポジトリ内の既存の構成のチェックアウトを行った後です.
    initコマンドは以下のようになります.
  • Terraformプロバイダー/プラグインをダウンロードしてインストールする
  • バックエンド(定義されている場合)を初期化する
  • モジュール(定義されている場合)をダウンロードしてインストールする
    terraform v 0から
  • .11 +ではなく、計画を行うし、それを適用するあなたが対話的な使用にあるならば、現在、あなたはちょうどterraform適用を実行する必要があります.コマンドは、計画を作成し、ユーザーを促し、yesが書かれている場合は、terraformは、計画を適用し、すべての変更を行います.
  • ニース、あなたはすでにあなたのインフラを作成することができますが、1つだけの環境で、単独で動作します.

    tfstateはリモートに保存する必要があります


    会社やOSSプロジェクトでは、単独では動作しませんので、ローカルにTfStateを格納し、リモートでそれを格納するために「クラウド」で共有しておく必要があります.
    情報やリマインダーの場合は、TTFフォームは、TorraFormを適用したときのインフラストラクチャのスナップショットです.デフォルトでは、tfstateは局所的にterraformに保存されます.tfstateファイル.しかし、私たちがチームで働くとき、リモートでTFTStateを保存しなければなりません.

    我々は現在、バケツS 3にTFTSTATEを保存して、それを暗号化するためにバックエンドリソースを作成します.
    バックエンド.tf :
    terraform {
      backend "gcs"{
        bucket      = "tagx"
        prefix      = "tf-tagx-state"
      }
    }
    
    我々がTfstateを置くGCSバケット資源を作成するとき、我々はversioningを起動させました.エラーやコピーペーストではありません.ステートファイルのバージョン管理を有効にすることをお勧めします.GCPバケツは、Terraformがそれのためにバックエンドを持っているので、あなたがてこ入れすることができるその能力を持ちます.突然、あなたの状態ファイルが壊れたと想像してください.状態ファイルのバージョン管理のおかげで、古い状態を使用して呼吸することができます.
    tfstateファイルの前に作成したので、ローカル状態をリモート状態に変換する必要があります.
    terraform state push
    

    ワークスペース


    terraformワークスペース機能の前に、複数の環境で処理するために、ソリューションは環境/クラウドプロバイダーアカウントごとに1つのフォルダーを作成し、それを置くことでした.tfファイル.ソリューションは便利ではなく、重複して簡単にメンテナンスできます.tfファイル.
    terraform v 0以降.10 +は、インフラストラクチャリソース/環境の複数の異なるセットを管理するために、我々はterraformワークスペースを使用することができます.
    ワークスペースのための地形形式のCLIはいくつかのコマンドを提供します:
    $ terraform workspace list // The command will list all existing workspaces
    $ terraform workspace new <workspace_name> // The command will create a workspace
    $ terraform workspace select <workspace_name> // The command select a workspace
    $ terraform workspace delete <workspace_name> // The command delete a workspace
    
    CLIを使えば、次のようにワークスペースを簡単に作成、選択、リストできます.
    $ terraform workspace new dev
    Created and switched to workspace 'dev'
    $ terraform workspace new preprod
    Created and switched to workspace 'preprod'
    $ terraform workspace new prod
    Created and switched to workspace 'prod'
    
    「dev」ワークスペースを選択します
    terraform workspace select dev
    
    このワークスペースの設定を使用すると、terraform適用が正常に実行されると、tfstateはGCPバケットの良い環境フォルダに保存されます.
    env:/
        dev/
           state.tfstate    
        preprod/
            state.tfstate    
        prod/
            state.tfstate
    
    完璧なので、環境ごとにtfstateを分離するのがベストプラクティスです.
    あなたが見たように、地形のワークスペースで、我々は簡単に頭痛なしでいくつかの/複数の環境を管理します.
    読んでくれてありがとう.