Я хочу получить полный список объектов, управляемых terraform, и их идентификаторы.
Я знаю, что могу бежать terraform state list
, чтобы получить все ресурсы штата.
Я также знаю, что могу запустить terraform state show <resource>
, чтобы получить подробную информацию о нем, включая его идентификатор.
Поэтому, естественно, я создал следующий скрипт:
for resource in $(terraform state list); do ID=$(terraform state show $resource | grep -E " id\s* = " | head -n 1 | awk -F " = " '{print $2}'); echo "$resource $ID"; done
Который запускается на всех ресурсах из state list
и добавляет им их идентификатор.
Моя проблема в том, что для больших конфигураций, состоящих из более чем 100 ресурсов, выполнение этого сценария займет много времени.
Есть ли способ ускорить это? Или, может быть, мой подход не самый лучший, и есть более эффективный способ добиться того, что я ищу?
Благодаря Паоло мне удалось собрать все ресурсы в одной команде.
Альтернативное решение с grep+awk вместо jq таково:
terraform show | grep -e '^ id ' -e '^# ' | awk '/^# / { gsub(/^# /, "", $0); gsub(/:$/, "", $0); printf "%s ", $0; getline; print $3 }'
Сначала я не поверил этому способу, но после того, как Паоло помог мне получить результат с помощью jq
, я сравнил его и увидел, что он тоже работает terraform show | grep -e '^ id ' -e '^# ' | awk '/^# / { gsub(/^# /, "", $0); gsub(/:$/, "", $0); printf "%s ", $0; getline; print $3 }'
Это должно дать вам желаемый результат:
$ terraform show -json | jq -r '[try .values.root_module.resources[], try .values.root_module.child_modules[].resources[]][] | [.address, .values.id] | @tsv'
Спасибо! Мне пришлось разобраться со случаем, когда «ресурсы» не могли быть массивом terraform show -json | jq -r '.values[].resources | .[]? | [(.address), (.values.id)] | @tsv'
. Но, к сожалению, это дает лишь частичный результат, используя только прямые ресурсы. И все ресурсы, определенные из модулей, пропущены.
@GlebNebolyubov при каком сценарии resources
не является массивом?
Меня это тоже смутило, но я заметил, что это немного по-другому - для output
есть values
, но нет resources
, поэтому вместо этого возвращается null
@GlebNebolyubov Я тебя понял. Проверьте обновленный ответ.
Спасибо!! В моем случае я заметил, что некоторые модули вложены, но это вернуло полный список: terraform show -json | jq -r '[try .values.root_module.resources[], try .values.root_module.child_modules[]?.resources[], try .values.root_module.child_modules[]?.child_modules[]?.resources[]][] | [.address, .values.id] | @tsv'
Вы также можете разработать код для непосредственного анализа файла состояния и извлечения значений из карты/хеша/словаря. Вероятно, это будет значительно быстрее, чем многократное выполнение Terraform.