Size: a a a

2020 May 08

I

Igor in terraform_ru
подскажите пожалуйста, как можно прокинуть в провайдер набор хостов:

provider "docker" {
 host = "ssh://${var.user}@${var.host}:${var.port}"
}


variable "host" {
 type    = list(string)
 default = ["192.168.100.129"]
}

Error: Incorrect attribute value type

 on main.tf line 33, in resource "null_resource" "nexus":
 33:     host     = var.host

Inappropriate value for attribute "host": string required.
источник

I

Igor in terraform_ru
он ожидает от меня лишь одну запись, а я хочу чтобы он выполнил это на нескольких хостах
источник

I

Igor in terraform_ru
а, походу это только алисами можно решить плодив кучу провайдеров
источник

VM

Viktor Mikalayeu in terraform_ru
Или null рессурс, которому ты передашь список хостов и  все логику выполнишь сам
источник

VM

Viktor Mikalayeu in terraform_ru
Без ssh провайдера
источник

V

Viacheslav in terraform_ru
for each?
источник
2020 May 09

M

Maksim Sharov in terraform_ru
привет! в доке провайдера https://github.com/Telmate/terraform-provider-proxmox/blob/master/docs/provider.md#argument-reference указано, что я могу использовать переменные окружения типа PM_USER, но в доке терраформа не могу найти, как их использовать в качестве переменных и явно указать в tf файлах.

да, я могу сделать
export PM_USER=myuser

и все будет работать, однако, IDE будет подсказывать для провайдера

provider "proxmox" {
 pm_tls_insecure = true
}

что The argument "pm_user" is required, but no definition was found.

как мне исправить? или это нормально, чтобы провайдер сам взял из окружения без явного упоминания
источник

AR

Alexey Remizov in terraform_ru
Maksim Sharov
привет! в доке провайдера https://github.com/Telmate/terraform-provider-proxmox/blob/master/docs/provider.md#argument-reference указано, что я могу использовать переменные окружения типа PM_USER, но в доке терраформа не могу найти, как их использовать в качестве переменных и явно указать в tf файлах.

да, я могу сделать
export PM_USER=myuser

и все будет работать, однако, IDE будет подсказывать для провайдера

provider "proxmox" {
 pm_tls_insecure = true
}

что The argument "pm_user" is required, but no definition was found.

как мне исправить? или это нормально, чтобы провайдер сам взял из окружения без явного упоминания
Провайдер сам берёт из окружения. По поводу предупреждения можно написать багу авторам плагина для IDE.
источник

M

Maksim Sharov in terraform_ru
Alexey Remizov
Провайдер сам берёт из окружения. По поводу предупреждения можно написать багу авторам плагина для IDE.
то есть нормально не упоминать в файлах терраформа, что где есть переменная окружения?
источник

AR

Alexey Remizov in terraform_ru
Maksim Sharov
то есть нормально не упоминать в файлах терраформа, что где есть переменная окружения?
Да. Вот правила игры: https://github.com/Telmate/terraform-provider-proxmox/blob/master/proxmox/provider.go#L43
Если значение не указано, вызвать функцию, которая проверит переменную окружения. И только если переменной нет, считать значение не установленным.
источник

M

Maksim Sharov in terraform_ru
Alexey Remizov
Да. Вот правила игры: https://github.com/Telmate/terraform-provider-proxmox/blob/master/proxmox/provider.go#L43
Если значение не указано, вызвать функцию, которая проверит переменную окружения. И только если переменной нет, считать значение не установленным.
спасибо. вопрос не конкретно к этому провайдеру, а к стайлгайду описания переменных окружения в терраформе.

стоит ли обозначать их наличие в файлах?

в доке терраформа переменным окружения отведет короткий раздел https://www.terraform.io/docs/configuration/variables.html#environment-variables , вкратце - нужно задавать с префиксом TF_  и все.

может их можно явно упоминать в виде?

env.PM_USER

получается, если человек откроет конфиг провайдера, как ему понять, что требуется переменная в окружении PM_USER, TF_MYVAR или что-то еще, он получается запустит терраформирование, увидит ошибку и только тогда поймет что у него неполное окружение
источник

AR

Alexey Remizov in terraform_ru
Это дока про возможность устанавливать значения переменных манифеста, т.е. объявленных как variable{} через переменные окружения. Такую систему придумали для себя авторы терраформа. Стандарта, который накладывает какие-то обязательства на авторов провайдеров, нет. Каждый именует необходимы переменные окружения как хочет. Понять, что требует провайдер, можно только прочитав его доку или исходники.
источник

M

Maksim Sharov in terraform_ru
Alexey Remizov
Это дока про возможность устанавливать значения переменных манифеста, т.е. объявленных как variable{} через переменные окружения. Такую систему придумали для себя авторы терраформа. Стандарта, который накладывает какие-то обязательства на авторов провайдеров, нет. Каждый именует необходимы переменные окружения как хочет. Понять, что требует провайдер, можно только прочитав его доку или исходники.
хорошо, а если я хочу в строке использовать значение из переменной окружения, например
locals {
 myvar = "test_${var.MY_VAR}"
}


мне достаточно будет сделать на машине
export MY_VAR = "awesome_var"

?
источник

M

Maksim Sharov in terraform_ru
возможно, пример выше выглядит слишком синтетическим, вот реальный. я накатываю машину proxmox из клауд-инит шаблона и могу задачть ssh ключ

  sshkeys = <<EOF
   ...
 EOF


автор документации вставляет строку как есть, я же хочу получать этот ключ из окружения
  sshkeys = <<EOF
   ${var.TF_TEMPLATE_SSH_KEY}
 EOF

мне просто достаточно создать переменную в окружении и терраформ поймет сам?
источник

AR

Alexey Remizov in terraform_ru
Нет. Переменные, используемые в манифесте, должны быть явно опеределены как variable{}. Нельзя просто взять и использовать произвольную переменную окружения.
источник

AR

Alexey Remizov in terraform_ru
Если переходить к конкретным примерам, такие вещи, как списки ключей SSH, лучше писать в, скажем, yaml и всасывать при помощи yamldecode(file()).
источник

M

Maksim Sharov in terraform_ru
Alexey Remizov
Если переходить к конкретным примерам, такие вещи, как списки ключей SSH, лучше писать в, скажем, yaml и всасывать при помощи yamldecode(file()).
а если переменная чувствительная и я не хочу хранить ее в репозитории? наприме, храню в gitlab variable и он в пайплайнах прокидывает ее в качестве переменной окружения
источник

M

Maksim Sharov in terraform_ru
Alexey Remizov
Нет. Переменные, используемые в манифесте, должны быть явно опеределены как variable{}. Нельзя просто взять и использовать произвольную переменную окружения.
вот, можно ли переменную окружения определить в блоке variable?
источник

AR

Alexey Remizov in terraform_ru
Объявляй как variable "sensitive_var" {}, и передавай в окружении как TF_VAR_sensitive_var. Просто нельзя хотеть использовать произвольные имена переменных окружения.
источник

M

Maksim Sharov in terraform_ru
Alexey Remizov
Объявляй как variable "sensitive_var" {}, и передавай в окружении как TF_VAR_sensitive_var. Просто нельзя хотеть использовать произвольные имена переменных окружения.
ееее, кажется я получил то, что хотел, спасибо! попробую обкатать
источник