如何将terraform输出变量作为vars_files传递给ansible?

Dee*_*sad 6 ansible terraform

我使用terraform供应AWS基础设施和希望传递变量,如aws_subnet_idaws_security_id成使用ansible剧本vars_file(不知道是否有,虽然任何其他方式).我怎样才能做到这一点?

Joh*_*hee 11

我使用 Terraformlocal_file创建 Ansible vars_file。我tf_为变量名称添加了一个前缀,以表明它们源自 Terraform:

# Export Terraform variable values to an Ansible var_file
resource "local_file" "tf_ansible_vars_file_new" {
  content = <<-DOC
    # Ansible vars_file containing variable values from Terraform.
    # Generated by Terraform mgmt configuration.

    tf_environment: ${var.environment}
    tf_gitlab_backup_bucket_name: ${aws_s3_bucket.gitlab_backup.bucket}
    DOC
  filename = "./tf_ansible_vars_file.yml"
}
Run Code Online (Sandbox Code Playgroud)

运行terraform apply以创建tf_ansible_vars_file.yml包含 Terraform 变量值的Ansible var_file :

# Export Terraform variable values to an Ansible var_file
resource "local_file" "tf_ansible_vars_file_new" {
  content = <<-DOC
    # Ansible vars_file containing variable values from Terraform.
    # Generated by Terraform mgmt configuration.

    tf_environment: ${var.environment}
    tf_gitlab_backup_bucket_name: ${aws_s3_bucket.gitlab_backup.bucket}
    DOC
  filename = "./tf_ansible_vars_file.yml"
}
Run Code Online (Sandbox Code Playgroud)

添加tf_ansible_vars_file.yml到您的 Ansible 手册中:

# Ansible vars_file containing variable values from Terraform.
# Generated by Terraform mgmt configuration.

tf_environment: "mgmt"
tf_gitlab_backup_bucket_name: "project-mgmt-gitlab-backup"
Run Code Online (Sandbox Code Playgroud)

现在,在 Ansible 中,此文件中定义的变量将包含来自 Terraform 的值。

显然,这意味着您必须在 Ansible 之前运行 Terraform。但是对于您的所有 Ansible 用户来说,它不会那么明显。将断言添加到您的 Ansible playbook 中,以帮助用户确定在tf_缺少变量时该怎么做:

  vars_files:
    - ../terraform/mgmt/tf_ansible_vars_file.yml
Run Code Online (Sandbox Code Playgroud)

更新:此答案的早期版本使用了 Terraform 模板。经验表明,模板文件容易出错并增加了不必要的复杂性。所以我把模板文件移到contentlocal_file.


dri*_*hev 8

由于我想在带有 CI 的拉取请求中运行terraform planansible --check,所以我决定使用terraform output.

基本上这就是我现在运行 Ansible 的方式,它从 terraform 获取所有输出:

具有以下输出

// output.tf
output "tf_gh_deployment_status_token" {
  value       = var.GH_DEPLOYMENT_STATUS_TOKEN
  sensitive   = true
}
Run Code Online (Sandbox Code Playgroud)

运行一些修改terraform output后的解析jq

$ terraform output --json | jq 'with_entries(.value |= .value)'
{
  "tf_gh_deployment_status_token": "<some token>"
}
Run Code Online (Sandbox Code Playgroud)

这使得--extra-args与 Ansible 一起运行非常好:

$ ansible-playbook \
  -i ./inventory/production.yaml \
  ./playbook.yaml \
  --extra-vars "$(terraform output --json | jq 'with_entries(.value |= .value)')"
Run Code Online (Sandbox Code Playgroud)

现在我可以在我的剧本中的任何地方使用{{ tf_gh_deployment_status_token }}


Mr.*_*. E 5

terraform 输出是一个选项,或者您可以使用类似以下内容:

provisioner "local-exec" {
  command = "ANSIBLE_HOST_KEY_CHECKING=\"False\" ansible-playbook -u ${var.ssh_user} --private-key=\"~/.ssh/id_rsa\" --extra-vars='{"aws_subnet_id": ${aws_terraform_variable_here}, "aws_security_id": ${aws_terraform_variable_here} }' -i '${azurerm_public_ip.pnic.ip_address},' ansible/deploy-with-ansible.yml"
}
Run Code Online (Sandbox Code Playgroud)

或者您可以执行 sed 操作...作为本地配置程序来更新 var 文件..

或者你可以使用 terraform 输出......你的偏好......


man*_*lds 2

使用 terraform 输出 - https://www.terraform.io/intro/getting-started/outputs.html(尚不清楚您是否已经在使用它)

然后使用诸如 之类的命令terraform output ip,您可以在脚本中使用这些值来生成或填充其他文件,例如清单文件或 vars_file。

另一种选择是使用 terraform 模板并渲染文件(如 terraform 本身的库存文件),然后从 Ansible 中使用它。