Как использовать команды Bash в переменных файла шаблона Terraform?

Я использую Terraform для настройки Auto Scaling Gitlab Runner. У меня возникают проблемы при перезаписи файла конфигурации бегуна (для которого я использую шаблоны Terraform), потому что для файла требуется уникальный токен бегуна, который создается после регистрации.

Файл конфигурации выглядит так:

concurrent = 1
check_interval = 60

[[runners]]
    name = "POC Group Runner"
    url = "https://gitlab.com/"
    token = "ABCD"
    executor = "docker+machine"
    limit = 1 # max number of docker machines to be created

Я хочу прочитать этот маркер бегуна (который называется «ABCD») из этого файла, чтобы я мог использовать его в шаблоне Terraform для перезаписи конфигураций.

В terraform единственная функция "чтения", которая у меня есть, - это "файл", которая читает весь контент, а затем получение из него только токена становится уродливым процессом:

trimspace(replace(split("executor", split("token =", file("/etc/gitlab-runner/config.toml"))[1])[0], "\"", ""))

Можно ли использовать сценарии Bash для создания переменных для шаблонов?

Например, я мог бы использовать следующую команду для чтения токена:

cat /etc/gitlab-runner/config.toml | grep "token =" | awk '//{print $3}' | sed 's/"//g'

Но как мне передать это в шаблон?

Могу я сделать что-то подобное? :

Data "template_file" "runner-config" {
    template = "${file("runner-config.toml")"
    vars = {
        runner_token = "`cat /etc/gitlab-runner/config.toml | grep "token =" | awk '//{print $3}' | sed 's/"//g'`"
    }

Есть ли у кого-нибудь лучший способ прочитать что-то конкретное из файла или знает, как использовать сценарии bash в шаблонах?


person Codious-JR    schedule 15.07.2019    source источник


Ответы (1)


У вас аналогичная проблема: Терраформировать внешние данные в metadata_startup_script.

как насчет использования внешнего ресурса данных? https://www.terraform.io/docs/providers/external/data_source.html

get_token.sh

#!/bin/bash
token=$(cat /etc/gitlab-runner/config.toml | grep "token =" | awk '//{print $3}' | sed 's/"//g')
jq -n --arg token $token '{token:$token}'

или вы можете использовать echo вместо jq,

...
echo -n "{\"token\":\"${token}\"}"

а также

data "external" "get_token" {
  program = ["/bin/sh", "${path.module}/get-token.sh"]
}

data "template_file" "runner-config" {
    template = "${file("runner-config.toml")"
    vars = {
        runner_token = "${lookup(data.external.get_token.result, "token")}"
    }
person RyanKim    schedule 15.07.2019
comment
Спасибо за ответ. Внешний источник данных выглядит как идеальное решение моей проблемы. У меня вопрос, потому что я не совсем понимаю логику выполнения в terraform. Выполняется ли программа во внешнем источнике данных при обращении к результату или выполняется раньше? Это может привести к ошибке, если программа будет запущена до настройки бегуна gitlab, и поэтому файл конфигурации не будет присутствовать. - person Codious-JR; 15.07.2019
comment
learn.hashicorp.com/terraform/getting- start / Terraform устанавливает порядок зависимостей автоматически, и вы не беспокоитесь об этом. или вы можете использовать depends_on, явную зависимость между ресурсами. - person RyanKim; 15.07.2019