使用另一个Terraform来利用Terraform的输出
Terraform 0.4.0已在4/2发布,新增了许多功能,包括Docker、OpenStack等提供者的添加。(CHANGELOG.md)
本次我们将尝试使用新添加的功能之一,即通过资源terraform_remote_state来从其他Terraform中使用Terraform的输出。
简要说明
从版本0.3.5开始,Terraform允许将状态保存在一份名为terraform.tfstate的本地文件中。而且,还可以选择将状态保存在Consul或Atlas等远程后端中,而不是本地保存。
在0.4.0版本中,我们可以使用terraform_remote_state资源来引用在远程储存中保存的状态,并在另一个Terraform中进行使用。
测试环境
远程状态可以使用http、consul和Atlas作为后端,但在此示例中,我们将使用简单易于安装和配置,并且可以轻松查看Terraform设置的值的UI,作为consul的例子。
我会为您准备安装以下环境。
-
- Terraform (0.4.0以降)
-
- Consul (0.5.0以降)
- Consul UI (0.5.0以降)
以下是IDCF云的Vagrantfile。
https://github.com/atsaki/vagrant-examples/tree/master/terraform-remote
用法
创建存储库
首先,创建一个名为「第一个仓库」的存储库。将想要传递给另一个Terraform的值作为输出进行编写。(目前只能传递已输出的值。)
$ mkdir -p ~/terraform-remote/repo1
$ cd ~/terraform-remote/repo1
$ cat << EOS > repo1.tf
output "repo1_output" {
value = "Output from repo1"
}
EOS
启用远程状态
为了将状态保存在领事馆中,执行以下命令。
$ terraform remote config -backend consul -backend-config="path=repo1"
Initialized blank state with remote state enabled!
Remote state configured and pulled.
当查看Consul的用户界面时,可以确认指定路径下保存了空状态。
将Terraform的状态保存到远程位置
当启用远程状态后,运行terraform apply,更新的信息将自动保存到Consul中。
$ terraform apply
Apply complete! Resources: 0 added, 0 changed, 0 destroyed.
Outputs:
repo1_output = Output from repo1
当查看Consul的用户界面时,可以确认“outputs”中已经有值。
查询远程Terraform的状态
既然可以将状态保存在远程上,那么我们可以创建一个新的仓库并尝试引用它。
可以使用terraform_remote_state资源来获取远程状态。在config中填写由repo1指定的信息。
引用资源的方法与其他资源相同。这次只是简单地通过输出输出。
$ mkdir -p ~/terraform-remote/repo2
$ cd ~/terraform-remote/repo2
$ cat << EOS > repo2.tf
resource "terraform_remote_state" "repo1" {
backend = "consul"
config {
path = "repo1"
}
}
output "repo1_output" {
value = "\${terraform_remote_state.repo1.output.repo1_output}"
}
EOS
执行terraform apply后,将输出repo1中设置的消息。
$ terraform apply
terraform_remote_state.repo1: Creating...
backend: "" => "consul"
config.#: "" => "1"
config.path: "" => "repo1"
output.#: "" => "<computed>"
terraform_remote_state.repo1: Creation complete
Apply complete! Resources: 1 added, 0 changed, 0 destroyed.
The state of your infrastructure has been saved to the path
below. This state is required to modify and destroy your
infrastructure, so keep it safe. To inspect the complete state
use the `terraform show` command.
State path: terraform.tfstate
Outputs:
repo1_output = Output from repo1
更改参照原始项
在修改repo1时,确认repo2的输出也会发生变化。
首先修改repo1的设置,然后通过terraform apply来实施变更。
$ cd ~/terraform-remote/repo1
$ cat << EOS > repo1.tf
output "repo1_output" {
value = "Modified output from repo1"
}
EOS
$ terraform apply
Apply complete! Resources: 0 added, 0 changed, 0 destroyed.
Outputs:
repo1_output = Modified output from repo1
当在repo2中重新执行terraform apply时,消息的更改会得到反映。
$ cd ~/terraform-remote/repo2
$ terraform apply
terraform_remote_state.repo1: Refreshing state... (ID: 2015-04-04 10:34:03.745421914 +0000 UTC)
Apply complete! Resources: 0 added, 0 changed, 0 destroyed.
Outputs:
repo1_output = Modified output from repo1
最终
通过使用terraform_remote_state,确认可以引用不同存储库中的Terraform值。在实际使用中,通过引用想要传递的资源值并在output中进行输出。(据提供的博客所示,最好事先创建一个专用于output的文件。)
仅提供一种汉语的版本:
参考文献
- http://bobtfish.github.io/blog/2015/04/03/terraform-0-dot-4-0