Рано или поздно все хотят шаблонов.
Появляется структура каталогов, файлов, модулей.
Пишутся свои и переипользуются чужие.
Иногда приходим к подобным структурам(это лишь пример, это не бест практис):
infrastructure/
├── terragrunt.hcl
├── modules/
│ ├── networking/
│ ├── database/
│ ├── kubernetes/
│ ├── monitoring/
│ ├── security/
│ ├── storage/
│ ├── compute/
│ ├── iam/
│ ├── logging/
│ └── dns/
└── environments/
├── dev/
│ ├── terragrunt.hcl
│ ├── networking/
│ │ └── terragrunt.hcl
│ ├── database/
│ │ └── terragrunt.hcl
│ ├── kubernetes/
│ │ └── terragrunt.hcl
│ └── ...
├── staging/
│ ├── terragrunt.hcl
│ ├── networking/
│ │ └── terragrunt.hcl
│ ├── database/
│ │ └── terragrunt.hcl
│ └── ...
└── prod/
├── terragrunt.hcl
├── networking/
│ └── terragrunt.hcl
├── database/
│ └── terragrunt.hcl
└── ...
При работе с такой структурой все красиво, удобно и замечательно происходит кроме одной вещи.
Неиспользование кеша провайдеров.
При запуске
terragrunt plan в каждой из директорий по сути качает в эту директорию и провайдер и копию модуля.При запуске
terragrunt run-all и вовсе может занять десятки минут и сожрать много места на вашем диске( у меня однажды было порядка 200 гигабайт).На помощь нам приходит простая переменная.
export TF_PLUGIN_CACHE_DIR="$HOME/.terraform.d/plugin-cache"
mkdir -p $HOME/.terraform.d/plugin-cache
У меня это просто в башрс лежит
>cat ~/.bashrc |grep -i terra
export TF_PLUGIN_CACHE_DIR="$HOME/.terraform.d/plugin-cache"
В этом случае у нас идёт пере использование бинарного файла.
В кратких тезисах это работает внутри:
- в директории
~/.terraform.d/plugin-cache хранятся только бинарные файлы провайдеров- в
.terragrunt-cache хранится рабочая копия нашего кода (модулей Terraform)- "тяжелые" бинари в
.terragrunt-cache имеют симлинк в ~/.terraform.d/plugin-cacheПример
environments/dev/networking/
├── terragrunt.hcl
└── .terragrunt-cache/
└── AbCdEfGh12345/
└── XyZaBcDe67890/ # хеш-директория
├── main.tf # копия нашего модуля терраформа
├── variables.tf
├── outputs.tf
├── .terraform/
│ └── providers/
│ └── registry.terraform.io/
│ └── hashicorp/
│ └── aws/
│ └── 4.67.0/
│ └── linux_amd64 -> ~/.terraform.d/plugin-cache/registry.terraform.io/hashicorp/aws/4.67.0/linux_amd64 # симлинк на провайдер в директории с кешем
└── ...
Насколько мне известно нельзя полностью перетащить файлы модуля терраформа к бинарям, так как
- разные модули могут требовать разные версии одного и того же кода
- при параллельном выполнении, например
terragrunt run-all нужны изолированные рабочие каталогиИспользование этой переменной нам дадут:
- многократное снижение утилизации диска по размеру
- быстрый старт при первом клонировании репозитории и запуска террагранта
* Эта переменная НЕ избавит вас полностью от создания директории
.terragrunt-cache/ ибо это невозможно насколько мне известно.** Так же рекомендую добавить эту директорию в gitignore, для работа гита она не нужна.
>cat .gitignore |grep -i terra
.terragrunt-cache/
#terragrunt #terraform