From 207845f15acb71eb44a0c84dc18077c6378b0876 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Petazzoni?= Date: Tue, 2 Nov 2021 13:22:25 +0100 Subject: [PATCH] =?UTF-8?q?=F0=9F=A7=B9=20Obtain=20node=20addresses=20thro?= =?UTF-8?q?ugh=20an=20external=20source?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Instead of doing a local-exec to 'kubectl get nodes ... > stage2/externalips.X', we use an external provisioner. And to decouple things, the external provisioner depends on nodes being ready, and node readiness is implemented with a null resource. That way we don't need to re-execute the whole 'wait for nodes; dump node addresses' dance each time we re-run that configuration. --- prepare-tf/main.tf | 32 +++++++++++++++++++++++++------- 1 file changed, 25 insertions(+), 7 deletions(-) diff --git a/prepare-tf/main.tf b/prepare-tf/main.tf index b3846579..b8b326b0 100644 --- a/prepare-tf/main.tf +++ b/prepare-tf/main.tf @@ -41,19 +41,37 @@ resource "local_file" "externalips" { for_each = local.clusters filename = each.value.externalips_path file_permission = "0600" - content = "" + content = data.external.externalips[each.key].result.externalips +} +resource "null_resource" "wait_for_nodes" { + for_each = local.clusters provisioner "local-exec" { environment = { KUBECONFIG = local_file.kubeconfig[each.key].filename } - command = <<-EOT - kubectl get nodes --watch \ - | grep --silent --line-buffered . \ - && kubectl wait node --for=condition=Ready --all --timeout=10m \ - && kubectl get nodes \ - -o 'jsonpath={.items[*].status.addresses[?(@.type=="ExternalIP")].address}' > ${each.value.externalips_path} + set -e + kubectl get nodes --watch | grep --silent --line-buffered . + kubectl wait node --for=condition=Ready --all --timeout=10m EOT } } + +data "external" "externalips" { + for_each = local.clusters + depends_on = [ null_resource.wait_for_nodes ] + program = [ + "sh", + "-c", + <<-EOT + set -e + cat >/dev/null + export KUBECONFIG=${local_file.kubeconfig[each.key].filename} + echo -n '{"externalips": "' + kubectl get nodes \ + -o 'jsonpath={.items[*].status.addresses[?(@.type=="ExternalIP")].address}' + echo -n '"}' + EOT + ] +}