标签: terraform

如何自动将打包器输出ami id链接到terraform变量?

我正在使用带有ansible配置器的打包器来构建一个ami,并使用这个ami作为源来设置基础设施 - 与本文有点类似:http://www.paulstack.co.uk/blog/2016/01/ 02 /建筑物-AN-elasticsearch群集式-AWS与-封隔器和terraform

当命令packer build pack.json成功完成时,我以这种格式获得输出ami id:

eu-central-1: ami-12345678
Run Code Online (Sandbox Code Playgroud)

在我的terraform变量中,variables.tf我需要指定源ami id,region等.这里的问题是我不想手动或多次指定它们.对于区域(我事先知道),因为我可以在两种情况下使用环境变量,所以很容易,但是输出ami呢?是否有内置的方式来链接这些产品或一些不那么hacky方法来做到这一点?

编辑: Hacky方法适用于任何可能感兴趣的人.在这个解决方案中,我是grep来自packer输出的aws region&ami,并在perl中使用正则表达式将结果写入terraform.tfvars文件:

vars=$(pwd)"/terraform.tfvars"
packer build pack.json | \
    tee /dev/tty | \
    grep -E -o '\w{2}-\w+-\w{1}: ami-\w+' | \
    perl -ne '@parts = split /[:,\s]+/, $_; print "aws_amis." . $parts[0] ." = \"" . $parts[1] . "\"\n"' > ${vars}
Run Code Online (Sandbox Code Playgroud)

bash packer amazon-web-services terraform

18
推荐指数
2
解决办法
5621
查看次数

如何使用terraform在亚马逊S3桶中创建文件夹

我能够使用此链接在亚马逊S3中创建一个桶.

我使用以下代码创建一个存储桶:

resource "aws_s3_bucket" "b" {
    bucket = "my_tf_test_bucket"
    acl    = "private"
}
Run Code Online (Sandbox Code Playgroud)

现在我想在桶内创建文件夹,比方说Folder1.

我找到了创建S3对象的链接.但这有一个强制性参数source.我不确定这个值有什么,因为我的意图是在S3存储桶中创建一个文件夹.

directory amazon-s3 bucket amazon-web-services terraform

18
推荐指数
4
解决办法
1万
查看次数

Terraform depends_on 与模块

我是 terraform 的新手,我在模块结构上创建了一个自定义的 azure 策略。每个策略代表一个自定义模块。我创建的模块之一是为创建的任何新 azure 资源启用诊断日志。但是,我需要一个存储帐户。(在启用诊断设置之前,我如何实现“depends_on”?或任何其他方法? 我想首先创建存储帐户,然后创建诊断设置模块。在main.tf(调用所有其他模块的地方)或资源内部(模块)?

谢谢您的帮助!!:)

下面的代码代表 main.tf 文件:

//calling the create storage account name

module "createstorageaccount" {

source = "./modules/module_create_storage_account"
    depends_on = [
    "module_enable_diagnostics_logs"
  ]

}
Run Code Online (Sandbox Code Playgroud)

这个代表创建存储帐户模块

resource "azurerm_resource_group" "management" {


  name     = "management-rg"
  location = "West Europe"
}

resource "azurerm_storage_account" "test" {
  name                     = "diagnostics${azurerm_resource_group.management.name}"
  resource_group_name      = "${azurerm_resource_group.management.name}"
  location                 = "${azurerm_resource_group.management.location}"
  account_tier             = "Standard"
  account_replication_type = "LRS"

  tags = {
    environment = "diagnostics"
  }
}

    depends_on = [
    "module_enable_diagnostics_logs"
  ]

Run Code Online (Sandbox Code Playgroud)

azure terraform terraform-provider-azure

18
推荐指数
2
解决办法
3万
查看次数

变量中的地形变量

首先 - 抱歉 - 我对使用 terraform 非常陌生(3 小时后!)。

我希望尝试在另一个变量的声明中使用变量的值。

下面是我的代码 - 我做错了什么?

变量.tf:

variable "EnvironmentName" {
    type = "string"
}
variable "tags" {
    type = "map"
    default = {
        Environment = "${var.EnvironmentName}"
        CostCentre = "C1234"
        Project = "TerraformTest"
        Department = "Systems"
    }
}
Run Code Online (Sandbox Code Playgroud)

变量-dev.tfvars:

EnvShortName = "Dev"
EnvironmentName = "Development1"
#Location
Location = "westeurope"
Run Code Online (Sandbox Code Playgroud)

主要.tf:

resource “azurerm_resource_group” “TestAppRG” {
    name = “EUW-RGs-${var.EnvShortName}”
    location = “${var.Location}”
    tags = “${var.tags}”
}
Run Code Online (Sandbox Code Playgroud)

我收到以下错误:

错误:variables.tf 第 18 行,在变量
“tags”中不允许使用变量:18:Environment = “${var.EnvironmentName}”
此处不能使用变量。

我知道错误消息是不言自明的,这可能是我的方法错误 - …

terraform

18
推荐指数
2
解决办法
1万
查看次数

将 GCP 云与 terraform 结合使用时,我可以自动启用 API 吗?

我对使用 terraform 的 GCP 非常陌生,我想使用集中式工具部署我的所有模块。

有没有什么办法可以去掉每次启用google API的步骤,这样部署就不会中断?

google-cloud-platform terraform terraform-provider-gcp

18
推荐指数
4
解决办法
5843
查看次数

Terraform 13,根据另一个变量的值验证变量

有没有办法实现以下逻辑

variable "environment" {
  description = "The environment this will be run in can only be set to [preprod|test|prod]"
  type        = string
  default     = "test"
  validation {
    condition     = can(regex("^(prod|preprod|test)$", var.environment))
    error_message = "The environment variable can only be set to [prod|preprod|test]."
  }
}

variable "fet_code" {
  description = "Set the feature code"
  type        = string
  default     = ""
  validation {
    condition     = var.environment == "test" && length(var.fet_code) != 3
    error_message = "The environment has been set to 'test' but …
Run Code Online (Sandbox Code Playgroud)

terraform terraform-provider-aws

18
推荐指数
3
解决办法
2万
查看次数

更新 CloudFront Distribution (E32RNPFGEUHQ6J) 时出错:InvalidWebACLId:请求者无法访问 Web ACL

我正在使用它terraform创建一个web-aclinaws并希望将其web-acl与 CloudFront 发行版关联起来。

所以,我的代码如下所示:

provider "aws" {
  alias  = "east1"
  region = "us-east-1"
}

# -------------------------------------------
# -------------------------------------------
# Cloud Front
module "front_end_cloudfront" {
  source = "./modules/front-end/CF"

  # CF_ALIASES = ["terraformer-frontend.dev.effi.com.au"]  
  CF_LAMBDA_ARN = module.frontend_lambda.cf_lambda_qualified_arn
  CF_BUCKET_DOMAIN_NAME = module.front_end_bucket.website_endpoint
  CF_BUCKET_ORIGIN_ID = module.front_end_bucket.website_domain
  CF_TAGS_LIST = { "Name" : "terraformer-front-end-cloudfrontv2" }
  CF_CERTFICATE_ARN = var.CLOUDFRONT_US_EAST_1_ACM_ARN
  # WEB_ACL = module.waf.web_acl_id
  WEB_ACL = module.waf_cf.web_acl_id

  depends_on = [module.waf_cf]
}



# -------------------------------------------
# -------------------------------------------
# WAF for CF
module "waf_cf" { …
Run Code Online (Sandbox Code Playgroud)

amazon-cloudfront terraform amazon-waf

18
推荐指数
2
解决办法
8463
查看次数

升级Terraform版本

我开始使用Terraform,我正在关注他的Github存储库上的项目更新.

我看到发布部分提供了新版本:https: //github.com/hashicorp/terraform/releases

我按照以下步骤安装了Terraform工具:https: //www.terraform.io/intro/getting-started/install.html

新版本是带有基本代码的zip文件,但我想知道如何在我的计算机(OSX)上安装它.我第一次安装时下载的是一个zip文件,只有一个"terraform"文件作为unix可执行文件.

我如何从github发布部分提供的zip中生成这个Unix可执行文件?

任何的想法?

谢谢!

terraform

17
推荐指数
6
解决办法
3万
查看次数

当 REGIONAL 处于活动状态时,无法为 EDGE 导入证书

我正在尝试将eu-central-1颁发的证书用于我的 apigateway,它是区域性的并且在同一区域工作。

我的地形代码如下:

//ACM Certificate

provider "aws" {
  region = "eu-central-1"
  alias = "eu-central-1"
}

resource "aws_acm_certificate" "certificate" {
  provider = "aws.eu-central-1"
  domain_name       = "*.kumite.xyz"
  validation_method = "EMAIL"
}

//Apigateway

resource "aws_api_gateway_rest_api" "kumite_writer_api" {
  name = "kumite_writer_api"
  endpoint_configuration {
    types = ["REGIONAL"]
  }
}

resource "aws_api_gateway_domain_name" "domain_name" {
  certificate_arn = aws_acm_certificate.certificate.arn
  domain_name     = "recorder.kumite.xyz"
  endpoint_configuration {
    types = ["REGIONAL"]
  }
}

Run Code Online (Sandbox Code Playgroud)

不幸的是,我不断收到此错误:

错误:创建 API 网关域名时出错:BadRequestException:无法在 REGIONAL 处于活动状态时为 EDGE 导入证书。

我在这里缺少什么?我认为我的 ApiGateway 不是 EDGE 而是 REGIONAL,所以找不到错误的意义......

terraform aws-api-gateway terraform-provider-aws

17
推荐指数
1
解决办法
3163
查看次数

基于变量的可选块

我正在为 编写某种包装模块azurerm_storage_account

azurerm_storage_account有可选块

static_website {
  index_document = string
  error_404_document = string
}
Run Code Online (Sandbox Code Playgroud)

我想根据变量设置它,但我不太确定该怎么做?条件运算符实际上不适用于块(例如static_website = var.disable ? null : { .. }

或者块是否以这样的方式工作,如果我设置index_documenterror_404_document,它与完全不设置块null相同?static_website

azurerm@2.x

TF@0.12.x

terraform terraform-provider-azure

17
推荐指数
1
解决办法
1万
查看次数