Изменить Исправлен синтаксис для команды curl
Я пытаюсь использовать доступный список IP-адресов Googlebot в моей конфигурации Terraform.
https://developers.google.com/static/search/apis/ipranges/googlebot.json
Вот ошибка, которую я вижу.
! terraform plan
data.external.get_googlebot_ips_using_shell: Reading...
╷
│ Error: Unexpected External Program Results
│
│ with data.external.get_googlebot_ips_using_shell,
│ on main.tf line 18, in data "external" "get_googlebot_ips_using_shell":
│ 18: program = ["bash","./get_googlebot_ips.sh"]
│
│ The data source received unexpected results after executing the program.
│
│ Program output must be a JSON encoded map of string keys and string values.
│
│ If the error is unclear, the output can be viewed by enabling Terraform's logging at TRACE level. Terraform documentation on logging: https://www.terraform.io/internals/debugging
│
│ Program: /usr/local/bin/bash
│ Result Error: invalid character '{' after top-level value
Вот мой main.tf
data "external" "get_googlebot_ips_using_shell" {
program = ["bash","./get_googlebot_ips.sh"]
}
output "get_googlebot_ips_using_shell" {
value = data.external.get_googlebot_ips_using_shell.result.ipv4Prefix
}
Вот что содержит get-googlebot-bot-ips.sh
curl https://developers.google.com/static/search/apis/ipranges/googlebot.json \
| jq '.prefixes[] | {ipv6Prefix,ipv4Prefix} | with_entries( select( .value != null ) )'
Как мне отформатировать возвращенный JSON, чтобы я мог использовать эту информацию в Terraform?
Я пытался форматировать данные, которые я возвращаю в jq
, разными способами, но я не могу получить правильный формат для того, что ищет Terraform.
Спасибо за выборочную проверку. Мне не хватало закрывающего ")" в команде curl. Теперь это должно работать.
Вы можете рассмотреть возможность использования http-источника данных Terraform. Это выполнит запрос за вас и красиво поместит ответ JSON в удобный для Terraform источник данных. См. этот пример:
data "http" "googlebot" {
url = "https://developers.google.com/static/search/apis/ipranges/googlebot.json"
request_headers = {
Accept = "application/json"
}
}
output googlebot_ip_prefixes { value = data.http.googlebot.body }
Это пример того, что вы можете воспроизвести то, что вы сделали в сценарии оболочки, преобразовав в HCL:
data "http" "example" {
url = "https://developers.google.com/static/search/apis/ipranges/googlebot.json"
# Optional request headers
request_headers = {
Accept = "application/json"
}
}
output "test" {
# value = jsondecode(data.http.example.response_body).prefixes
value = {
"ipv4Prefix" = compact([for i in jsondecode(data.http.example.response_body).prefixes : try(i.ipv4Prefix, "")])
"ipv6Prefix" = compact([for i in jsondecode(data.http.example.response_body).prefixes : try(i.ipv6Prefix, "")])
}
}
Использованная литература:
Ваш
curl
работает вручную, без ТФ? Мне не кажется, что это правильный код для начала.