我想识别terraform执行环境的公共IP 并将其添加到aws安全组入站以防止从其他环境访问。
目前,我手动编辑variables.tf文件中的值。
variables.tf
variable public_ip_address {
default = "xx"
}
我想执行" curl ifconfig.co"命令在本地主机上,并根据结果自动设置安全组
有没有办法做这些事情?
我可以通过将local-exec的结果放在某个变量中来实现 但我不知道该怎么做。
感谢您阅读我的问题。
答案 0 :(得分:15)
没有任何脚本,这是一种更简单的方法。诀窍是拥有一个诸如icanhazip.com
之类的网站来检索您的IP,因此请将其在terraform文件中设置为data
:
data "http" "myip" {
url = "http://ipv4.icanhazip.com"
}
每当要放置IP时,只需使用data.http.myip.body
,例如:
ingress {
from_port = 5432
to_port = 5432
protocol = "tcp"
cidr_blocks = ["${chomp(data.http.myip.body)}/32"]
}
请注意,我使用terraform chomp()
方法删除了body附带的任何尾随空格或换行。
您可以将ipv6与http://ipv6.icanhazip.com一起使用。只需使用http://icanhazip.com即可,因为它可以检索ipv4或ipv6
答案 1 :(得分:1)
我能提出的最优雅的解决方案是使用"外部数据源"供应商。 https://www.terraform.io/docs/providers/external/data_source.html
这是为了这些目的编写的,人们将local-exec,null-resource和vars结合起来在本地注入一些东西。
无论如何,我确信你可以不用写一个小脚本就可以做到这一点。事情是"外部数据源"期望阅读JSON。所以在我的例子中,我只是在程序中构建了一个JSON字符串,然后调用该程序。我确定这可以使用echo或jq在一个班轮中完成......
这是我的main.tf文件:
data "external" "example" {
program = ["sh", "test.sh" ]
}
output "commandout" {
value = "${data.external.example.result}"
}
这是我的shell脚本(test.sh):
#!/bin/bash
echo {\"ip\":\""`hostname -I`"\"}
从技术上讲,一旦遇到这种情况,您可以使用:
${data.external.example.result}
作为你的var输入。
以下是我使用terraform输出的工作示例。
data.external.example: Refreshing state...
Apply complete! Resources: 0 added, 0 changed, 0 destroyed.
Outputs:
commandout = {
ip = 10.0.2.15
}
请注意,hostname -I
如果您只有一个网卡就可以了:)否则请使用替代命令或剪切输出以获得所需结果。
答案 2 :(得分:1)
在Terraform 0.12及更高版本中,您可以使用本机jsondecode和jsonencode以获得更好的可靠性和长期可重复性,而不必依赖于字符串操作。作为参考,此实现已在Terraform 0.12.16上进行了测试。
下面是使用最新的Terraform方法获取公共IP地址的示例实现。添加了输出块,以提供视觉验证其是否按预期工作。
git update-index --assume-unchanged [<file>...]
如果要在网络入口规则中使用此功能,可以执行以下操作(示例中用于测试性的icmp,无需在盲目复制和粘贴的情况下不必打开端口):
data "http" "my_public_ip" {
url = "https://ifconfig.co/json"
request_headers = {
Accept = "application/json"
}
}
locals {
ifconfig_co_json = jsondecode(data.http.my_public_ip.body)
}
output "my_ip_addr" {
value = local.ifconfig_co_json.ip
}
请注意,所引用的服务速率限制为每分钟〜1个请求,因此,如果您的需求超出此范围,您可能最终想自己托管该服务;或者如果您需要更多有保证的可用性。 echoip服务是容器化的,因此可以托管在几乎任何地方。