在漫长的星期六之后,我终于找到了解决问题的办法。我遇到了几乎相同的问题,所以这是我的解决方案,肯定可以改进。
我分为两部分:
1.- 我将使用 local-exec 运行一个脚本,解决在负载 LoadBalancer 中等待有效 IP 的问题
2.-Terraform,使用外部数据源调用以json格式回答的“程序”。我的“程序”是一个抓取 IP 的 bash 脚本。结果,我在一个变量中有我想要的数据。
我这样做是因为我不知道如何使用 外部数据源 来调试问题,而且我遇到了“奇怪的事情”
首先我运行代码以等待有效的 IP。 Terraform 调用 local-exec
provisioner "local-exec" {
command = "./public-ip.sh"
interpreter = ["/bin/bash", "-c"]
}
这是我用过的脚本
#!/bin/bash
#public-ip.sh
#!/bin/bash
# Exit if any of the intermediate steps fail
set -e
function valid_ip()
{
local ip=$1
local stat=1
if [[ $ip =~ ^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$ ]]; then
OIFS=$IFS
IFS='.'
ip=($ip)
IFS=$OIFS
[[ ${ip[0]} -le 255 && ${ip[1]} -le 255 \
&& ${ip[2]} -le 255 && ${ip[3]} -le 255 ]]
stat=$?
fi
return $stat
}
########################
# Grab the Public IP #
#######################
WaitingTime=0
HaveIP=NO
echo "Let's check that LoadBalancer IP..."
MyPublicIP=$(kubectl get services --all-namespaces| grep LoadBalancer | awk '{print $5}')
valid_ip $MyPublicIP && HaveIP="OK"
until [ "$HaveIP" = "OK" -o "$WaitingTime" -ge 30 ]; do
echo "sleeeping...."
sleep 10
echo "Play it again Sam..."
MyPublicIP=$(kubectl get services --all-namespaces| grep LoadBalancer | awk '{print $5}')
#if valid_ip $MyPublicIP; then echo "We got the IP"; HaveIP=YES ;else stat='Still without IP'; fi
#if valid_ip $MyPublicIP; then HaveIP="OK" ; fi
valid_ip $MyPublicIP && HaveIP="OK"
#if valid_ip $MyPublicIP; then HaveIP="OK" ; fi
WaitingTime=$((WaitingTime+1))
echo $WaitingTime
done
if [ "$HaveIP" = "OK" ]; then echo An the public IP is... $MyPublicIP; else echo "WT_ has happened now!!!"; fi
在我知道我已经准备好 IP 之后。我只需要抓住它。请注意 depends_on 控制,一旦我的资源 (google_container_cluster.tests) 创建,我将获取我的数据,而不是在他想要的时候。测试一下。这很棘手......
data "external" "insights-public-ip" {
program = ["sh", "test-jq.sh" ]
depends_on = ["google_container_cluster.tests"]
}
output "insights-public-ip" {
value = "${data.external.insights-public-ip.result}"
}
这是 test-jq.sh(测试原因是我第一次使用 :S),我调用的脚本以 json 格式打印数据。
#!/bin/bash
#test-jq.sh
set -e
MyPublicIP=$(kubectl get services --all-namespaces | grep insights | grep LoadBalancer | awk '{print $5}')
jq -n --arg foobaz "$MyPublicIP" '{"extvar":$foobaz}'
希望对您有所帮助。至少我已经解决了我的问题。