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

时间:2016-11-01 03:17:52

标签: ansible terraform

我使用terraform配置AWS基础架构,并希望使用aws_subnet_idaws_security_idvars_file等变量传递到ansible playbook中(不知道是否还有其他方法) 。我怎么能这样做?

5 个答案:

答案 0 :(得分:5)

我使用Terraform local_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"
}

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

# 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"

tf_ansible_vars_file.yml添加到您的Ansible剧本:

  vars_files:
    - ../terraform/mgmt/tf_ansible_vars_file.yml

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

显然,这意味着您必须在Ansible之前运行Terraform。但是对于您所有的Ansible用户而言,它并不是那么明显。在您的Ansible剧本中添加断言,以帮助用户弄清楚如果缺少tf_变量该怎么办:

- name: Check mandatory variables imported from Terraform
  assert:
    that:
      - tf_environment is defined
      - tf_gitlab_backup_bucket_name is defined
    fail_msg: "tf_* variable usually defined in '../terraform/mgmt/tf_ansible_vars_file.yml' is missing"

更新:此答案的较早版本使用Terraform模板。经验表明,模板文件容易出错,并不必要地增加了复杂性。因此,我将模板文件移至content的{​​{1}}。

答案 1 :(得分:2)

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"
}

或者你可以做一个sed的东西......作为更新var文件的本地配置器..

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

答案 2 :(得分:1)

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

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

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

答案 3 :(得分:1)

我强烈推荐这个脚本。它运行良好并由思科维护,将为您提供更大的灵活性。

https://github.com/CiscoCloud/terraform.py

答案 4 :(得分:0)

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

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

具有以下输出

// output.tf
output "tf_gh_deployment_status_token" {
  value       = var.GH_DEPLOYMENT_STATUS_TOKEN
  sensitive   = true
}

运行稍加修改的 terraform output 解析为 jq :

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

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

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

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