我使用terraform供应AWS基础设施和希望传递变量,如aws_subnet_id
和aws_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 模板。经验表明,模板文件容易出错并增加了不必要的复杂性。所以我把模板文件移到content
了local_file
.
由于我想在带有 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
}
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 }}
。
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 输出......你的偏好......
使用 terraform 输出 - https://www.terraform.io/intro/getting-started/outputs.html(尚不清楚您是否已经在使用它)
然后使用诸如 之类的命令terraform output ip
,您可以在脚本中使用这些值来生成或填充其他文件,例如清单文件或 vars_file。
另一种选择是使用 terraform 模板并渲染文件(如 terraform 本身的库存文件),然后从 Ansible 中使用它。
归档时间: |
|
查看次数: |
7702 次 |
最近记录: |