【问题标题】:How do you output variables to Ansible? [duplicate]如何将变量输出到 Ansible? [复制]
【发布时间】:2020-05-08 19:20:51
【问题描述】:

我在question 中关注了这里的答案,并且 我创建了一个template 文件tf_ansible_vars_file.yml.tpl,如下所示

tf_share_location: "${share_location}"

还有一个terra_render.tf,如下所示

# Define an Ansible var_file containing Terraform variable values
data "template_file" "tf_ansible_vars_file" {
  template = "${file("/home/deployment_root/app4/tf_ansible_vars_file.yml.tpl")}"
  vars = {
    share_location = var.share_location
    # gitlab_backup_bucket_name = aws_s3_bucket.gitlab_backup.bucket
  }
}

# Render the Ansible var_file containing Terrarorm variable values
resource "local_file" "tf_ansible_vars_file" {
  content  = data.template_file.tf_ansible_vars_file.rendered
  filename = "/home/deployment_root/app4/tf_ansible_vars_file.yml"
}

我已经有一个 variables.tf 文件,我在其中声明了该变量

variable "share_location" {
    type = string

}

terraform.tfvars 中给出的值为null

share_location = null

当我运行terraform apply 时出现以下错误

Error: failed to render : <template_file>:1,23-37: Unknown variable; There is no variable named "share_location".

  on terra_render.tf line 2, in data "template_file" "tf_ansible_vars_file":
   2: data "template_file" "tf_ansible_vars_file" {

我的理解是它会创建该答案中提到的文件,但它不起作用。

如何将变量输出到 Ansible?

【问题讨论】:

  • 您将null 类型指定为变量的值,因此除非在渲染过程中发生一些不寻常的类型转换,否则这是行不通的。如果您不想使用该变量,则可以将其从模板中删除。
  • 这很令人困惑,如果我删除该值,它会要求一个值,我不是要求 terraform 为我生成一个值吗?

标签: ansible terraform


【解决方案1】:

如果要生成 YAML 等受支持的格式,则不需要模板文件。

您可以直接从 Terraform 数据结构生成 YAML,如下所示:

resource "local_file" "tf_ansible_vars_file" {
  content  = yamlencode(
    {
      tf_share_location = var.share_location
      # gitlab_backup_bucket_name = aws_s3_bucket.gitlab_backup.
    }
  )
  filename = var.ansible_vars_filename
}

variable "ansible_vars_filename" {
    type = string
    default = "/home/deployment_root/app4/tf_ansible_vars_file.yml"
}

-var="share_location=example_location" 应用它会产生一个像这样的文件:

"tf_share_location": "example_location"

引用配置变量名称是否重要取决于 Ansible。它不应该,因为它仍然是有效的 YAML。 Terraform 的 yamlencode 引用了那些不管是否需要,这是令人遗憾的。

我已将 ansible_vars_filename 提取到一个变量中,因为您可能希望使其可配置。

我还留下了注释掉的 gitlab_backup_bucket_name,因为将其添加到 YAML 文件就像取消注释一样简单。

您可以在此处了解有关 yamlencode 的更多信息:

https://www.terraform.io/docs/configuration/functions/yamlencode.html

【讨论】:

    【解决方案2】:

    在下面的代码中,我需要给出我在 terraform 中使用的变量,而不是 var.share_location ${data.azurerm_storage_account.new.name}/sharename 之后我可以从variables.tfterraform.tfvars 中删除它,因为我正在获取生成的值。谢谢

    旧代码:

    data "template_file" "tf_ansible_vars_file" {
      template = "${file("/home/deployment_root/app4/tf_ansible_vars_file.yml.tpl")}"
      vars = {
        share_location = var.share_location
        # gitlab_backup_bucket_name = aws_s3_bucket.gitlab_backup.bucket
      }
    }
    

    新代码:

    # Define an Ansible var_file containing Terraform variable values
    data "template_file" "tf_ansible_vars_file" {
      template = "${file("/home/deployment_root/app4/tf_ansible_vars_file.yml.tpl")}"
      vars = {
        share_location = "${data.azurerm_storage_account.new.name}/sharename"
        # gitlab_backup_bucket_name = aws_s3_bucket.gitlab_backup.bucket
      }
    }
    

    【讨论】:

    • 即使它对你有用,我还是不赞成,因为你的回答会让其他人感到困惑。请修改。
    • @doc_noob 嗨,你在 variables.tf 中声明了 var.share_location 吗?
    猜你喜欢
    • 2012-09-04
    • 1970-01-01
    • 2022-09-23
    • 1970-01-01
    • 2021-05-18
    • 1970-01-01
    • 2011-02-03
    • 2018-05-03
    • 1970-01-01
    相关资源
    最近更新 更多