我使用terraform配置AWS基础架构,并希望使用aws_subnet_id
将aws_security_id
和vars_file
等变量传递到ansible playbook中(不知道是否还有其他方法) 。我怎么能这样做?
答案 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)
我强烈推荐这个脚本。它运行良好并由思科维护,将为您提供更大的灵活性。
答案 4 :(得分:0)
由于我想在带有 CI 的拉取请求中同时运行 terraform plan
和 ansible --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 }}
。