Локальный облачный туннель с поддержкой terraform

Я пытался использовать terraform без какого-либо экземпляра Cloud - только для локальной установки облачного туннеля с использованием конструкции:

          resource "null_resource" "tunell_install" {
  triggers = {
    always_run = timestamp()
  }
  provisioner "local-exec" {
    command = "/home/uzer/script/tunnel.sh"
  }
}

вместо этого что-то вроде:

      provider "google" {
  project    = var.gcp_project_id
}

но после запуска

      $ terraform apply -auto-approve

успешно создан /etc/cloudflared/cert.json с содержимым:

      {
    "AccountTag"   : "${account}",
    "TunnelID"     : "${tunnel_id}",
    "TunnelName"   : "${tunnel_name}",
    "TunnelSecret" : "${secret}"
}

но как я понял здесь должны быть значения вместо переменных? Кажется, что metadata_startup_script из instance.tf применяется только к экземпляру Google. Как можно изменить его для использования terraform с локальной установкой туннеля CF и запуском туннеля? Может быть, также нужно использовать файл шаблона, но в другом файле .tf? Текущий блок кода metadata_startup_script:

        // This is where we configure the server (aka instance). Variables like web_zone take a terraform variable and provide it to the server so that it can use them as a local variable
  metadata_startup_script = templatefile("./server.tpl",
    {
      web_zone    = var.cloudflare_zone,
      account     = var.cloudflare_account_id,
      tunnel_id   = cloudflare_argo_tunnel.auto_tunnel.id,
      tunnel_name = cloudflare_argo_tunnel.auto_tunnel.name,
      secret      = random_id.tunnel_secret.b64_std
    })

Содержимое файла server.tpl:

      # Script to install Cloudflare Tunnel 
# cloudflared configuration
cd
# The package for this OS is retrieved 
wget https://bin.equinox.io/c/VdrWdbjqyF/cloudflared-stable-linux-amd64.deb
sudo dpkg -i cloudflared-stable-linux-amd64.deb
# A local user directory is first created before we can install the tunnel as a system service 
mkdir ~/.cloudflared
touch ~/.cloudflared/cert.json
touch ~/.cloudflared/config.yml
# Another herefile is used to dynamically populate the JSON credentials file 
cat > ~/.cloudflared/cert.json << "EOF"
{
    "AccountTag"   : "${account}",
    "TunnelID"     : "${tunnel_id}",
    "TunnelName"   : "${tunnel_name}",
    "TunnelSecret" : "${secret}"
}
EOF
# Same concept with the Ingress Rules the tunnel will use 
cat > ~/.cloudflared/config.yml << "EOF"
tunnel: ${tunnel_id}
credentials-file: /etc/cloudflared/cert.json
logfile: /var/log/cloudflared.log
loglevel: info

ingress:
  - hostname: ssh.${web_zone}
    service: ssh://localhost:22
  - hostname: "*"
    service: hello-world
EOF
# Now we install the tunnel as a systemd service 
sudo cloudflared service install
# The credentials file does not get copied over so we'll do that manually 
sudo cp -via ~/.cloudflared/cert.json /etc/cloudflared/
# Now we can start the tunnel 
sudo service cloudflared start

В argo.tf есть этот код:

      data "template_file" "init" {
  template = file("server.tpl")
  vars = {
    web_zone    = var.cloudflare_zone,
    account     = var.cloudflare_account_id,
    tunnel_id   = cloudflare_argo_tunnel.auto_tunnel.id,
    tunnel_name = cloudflare_argo_tunnel.auto_tunnel.name,
    secret      = random_id.tunnel_secret.b64_std
  }
}

1 ответ

Если вы спрашиваете, как создать файл локально и заполнить значения, вот пример:

      resource "local_file" "cloudflare_tunnel_script" {
  content = templatefile("${path.module}/server.tpl",
    {
      web_zone    = "webzone"
      account     = "account"
      tunnel_id   = "id"
      tunnel_name = "name"
      secret      = "secret"
    }
  )
  filename = "${path.module}/server.sh"
}

Чтобы это работало, вам нужно будет присвоить реальные значения всем переменным шаблона, перечисленным выше. Из того, что я вижу, уже есть примеры того, как использовать переменные для этих значений. Другими словами, вместо жесткого кодирования значений переменных шаблона вы можете использовать стандартные переменные:

      resource "local_file" "cloudflare_tunnel_script" {
  content = templatefile("${path.module}/server.tpl",
    {
      web_zone    = var.cloudflare_zone
      account     = var.cloudflare_account_id
      tunnel_id   = cloudflare_argo_tunnel.auto_tunnel.id
      tunnel_name = cloudflare_argo_tunnel.auto_tunnel.name
      secret      = random_id.tunnel_secret.b64_std
    }
  )
  filename = "${path.module}/server.sh"
}

Этот код заполнит все значения и создаст server.shscript в том же каталоге, из которого вы запускаете код Terraform.

Вы можете дополнить этот код null_resourceВы хотели:

      resource "null_resource" "tunnel_install" {
  depends_on = [
    local_file.cloudflare_tunnel_script,
  ]

  triggers = {
    always_run = timestamp()
  }

  provisioner "local-exec" {
    command = "${path.module}/server.sh"
  }
}
Другие вопросы по тегам