راهحل سریع
نصب Terraform (ترافرم) در ایران دو مرحله دارد. اول، خود Terraform را از مخزن داخلی dacker نصب کنید (روی Ubuntu 24.04؛ برای توزیعهای دیگر صفحهٔ Terraform · Packer · Vault را ببینید):
Terraform · Packer · Vault1.16.4
- Ubuntu 24.04
- 236.8 MB
- امضا و بررسیشده
-
۱کلید امضای dacker
# 1) Add the dacker signing keysudo curl -fsSL https://repo.dacker.ir/dacker.gpg -o /usr/share/keyrings/dacker.gpg -
۲افزودن مخزن
# 2) Add the repositorysudo curl -fsSL https://repo.dacker.ir/apt/sources/dacker-hashicorp.sources -o /etc/apt/sources.list.d/dacker-hashicorp.sources -
۳نصب
# 3) Installsudo apt updatesudo apt install terraform -
۴بررسی نصب
# 4) Check the installationterraform version
بهجای فایل .sources، یک خط .list میخواهید؟
-
جایگزین مرحلهٔ ۲
echo "deb [arch=amd64 signed-by=/usr/share/keyrings/dacker.gpg] https://repo.dacker.ir/apt/hashicorp noble main" | sudo tee /etc/apt/sources.list.d/dacker-hashicorp.list
دوم، چون terraform init providerها را از registry خود HashiCorp میگیرد که آن هم از ایران در دسترس نیست، یک provider mirror محلی بسازید. توضیحش در بخش «دیوار دوم» آمده است و فقط یک بار برای هر پروژه لازم است.
متن خطاها
اضافه کردن مخزن رسمی HashiCorp روی Ubuntu از ایران به این خطا میخورد:
Err:4 https://apt.releases.hashicorp.com noble InRelease 403 Forbidden [IP: … 443]E: Failed to fetch https://apt.releases.hashicorp.com/dists/noble/InRelease 403 Forbidden [IP: … 443]و روی AlmaLinux یا Rocky:
Errors during downloading metadata for repository 'hashicorp': - Status code: 403 for https://rpm.releases.hashicorp.com/RHEL/9/x86_64/stable/repodata/repomd.xml (IP: …)Error: Failed to download metadata for repo 'hashicorp': Cannot download repomd.xml: Cannot download repodata/repomd.xml: All mirrors were triedوقتی Terraform نصب باشد، terraform init در پروژهای که provider دارد چیزی شبیه این میگوید (متن دقیق در نسخههای مختلف Terraform کمی فرق میکند):
╷│ Error: Failed to query available provider packages││ Could not retrieve the list of available versions for provider hashicorp/aws: could not connect to registry.terraform.io: failed to request discovery document: 403 Forbidden╵چرا HashiCorp ایران را بلاک میکند
HashiCorp مثل Docker و بعضی شرکتهای دیگر، درخواستهای IP ایران را به دلیل قوانین صادراتی رد میکند. این شامل مخزنهای apt و dnf، سایت دانلود releases.hashicorp.com و registry عمومی Terraform (registry.terraform.io) است. برای همین نصب Terraform در ایران دو دیوار دارد: یکی برای خود ابزار، یکی برای providerها.
AlmaLinux / Rocky / RHEL 9
روی EL کلید امضای خود HashiCorp وارد میشود و dnf امضای هر بسته را با آن بررسی میکند.
Terraform · Packer · Vault1.16.4
- AlmaLinux / Rocky / RHEL 9
- 236.9 MB
- امضا و بررسیشده
-
۱کلید امضای سازنده
# 1) Import the vendor signing keysudo rpm --import https://repo.dacker.ir/el/keys/hashicorp.asc -
۲افزودن مخزن
# 2) Add the repositorysudo curl -fsSL https://repo.dacker.ir/el/repos/dacker-hashicorp.repo -o /etc/yum.repos.d/dacker-hashicorp.repo -
۳نصب
# 3) Installsudo dnf install terraform -
۴بررسی نصب
# 4) Check the installationterraform version
Packer و Vault هم در همین مخزناند و با همان فایل مخزن نصب میشوند: sudo apt install packer vault یا sudo dnf install packer vault.
دیوار دوم: providerها در terraform init
Terraform خودش تقریباً هیچ کاری نمیکند؛ کار اصلی را providerها انجام میدهند (مثلاً hashicorp/aws یا hashicorp/kubernetes) که terraform init آنها را از registry دانلود میکند. راه پایدار این است که providerهای موردنیاز پروژه را یک بار روی سیستمی که به registry دسترسی دارد (مثلاً یک سرور خارج از ایران یا CI) دانلود کنید و روی سرور بهعنوان mirror محلی بگذارید.
۱. روی سیستمی با دسترسی، providerها را جمع کنید
در پوشهٔ پروژهٔ Terraform (همانجا که فایلهای .tf هست):
terraform providers mirror -platform=linux_amd64 ./terraform-providersاین دستور همهٔ providerهایی را که پروژه لازم دارد، دقیقاً با نسخههایی که پروژه میخواهد و برای لینوکس ۶۴بیتی، در پوشهٔ terraform-providers میریزد. اگر لپتاپ شما macOS است، -platform را برای هر سیستمی که Terraform رویش اجرا میشود تکرار کنید.
۲. پوشه را به سرور منتقل کنید
مثلاً با scp یا rsync به /opt/terraform/providers روی سرور. پوشه فقط فایل zip providerها و چند فایل JSON است و چیز دیگری لازم ندارد.
۳. Terraform را به mirror محلی بفرستید
فایل ~/.terraformrc را روی سرور بسازید:
provider_installation { filesystem_mirror { path = "/opt/terraform/providers" include = ["registry.terraform.io/*/*"] } direct { exclude = ["registry.terraform.io/*/*"] }}حالا terraform init providerها را از همین پوشه برمیدارد و سراغ اینترنت نمیرود. بخش direct با exclude جلوی تلاش بیهوده برای وصل شدن به registry را میگیرد.
برای یک تیم: mirror شبکهای
اگر چند نفر یا چند سرور با Terraform کار میکنند، همان پوشهٔ مرحلهٔ ۱ را میتوانید روی یک وبسرور داخلی با HTTPS منتشر کنید؛ خروجی terraform providers mirror همان فایلهای JSON را دارد که پروتکل mirror شبکهای لازم دارد. بعد در ~/.terraformrc هر کاربر بهجای filesystem_mirror از network_mirror استفاده کنید:
provider_installation { network_mirror { url = "https://terraform-mirror.example.ir/" }}cache محلی برای سرعت بیشتر
برای اینکه هر پروژه providerها را دوباره کپی نکند، یک پوشهٔ cache مشترک تعریف کنید. این خط را هم به ~/.terraformrc اضافه کنید و پوشه را بسازید:
plugin_cache_dir = "/home/deploy/.terraform.d/plugin-cache"Packer و Vault
packer init هم pluginها را دانلود میکند، معمولاً از GitHub. اگر آن هم در دسترس نبود، plugin را روی سیستمی با دسترسی بگیرید و روی سرور با packer plugins install --path از فایل نصب کنید. Vault به دانلود جداگانهای نیاز ندارد؛ بعد از نصب، vault version باید نسخه را نشان بدهد و برای آزمایش سریع vault server -dev یک سرور موقت در حافظه بالا میآورد.
خطاهای رایج
ناسازگاری checksum با فایل قفل
Error: Failed to install providerError while installing hashicorp/aws v…: the local package for registry.terraform.io/hashicorp/aws … doesn't match any of the checksums previously recorded in the dependency lock fileفایل .terraform.lock.hcl پروژه فقط hash پلتفرمی را دارد که اولین بار روی آن init شده (مثلاً macOS). روی همان سیستمی که به registry دسترسی دارد، hash لینوکس را هم اضافه کنید و فایل قفل را commit کنید:
terraform providers lock -platform=linux_amd64 -platform=darwin_arm64provider تازهای به پروژه اضافه شد و init دوباره خطا میدهد
mirror محلی فقط providerهایی را دارد که موقع ساختنش لازم بودهاند. مرحلههای ۱ و ۲ را برای نسخهٔ تازهٔ پروژه تکرار کنید. در CI، ساختن mirror را یک مرحلهٔ خودکار کنید تا همیشه با فایلهای پروژه هماهنگ بماند.
terraform: command not found بعد از نصب
بستهٔ terraform فایل اجرایی را در /usr/bin/terraform میگذارد. اگر پیدا نشد، احتمالاً نصب کامل نشده؛ خروجی دستور نصب را دوباره ببینید و با apt-cache policy terraform یا dnf info terraform مطمئن شوید بسته از repo.dacker.ir شناخته میشود.
روی CentOS 7
HashiCorp برای EL7 مخزن منتشر نمیکند، پس dacker هم آن را ندارد. از AlmaLinux یا Rocky 8 و 9 استفاده کنید.
دربارهٔ مجوز
Terraform، Packer و Vault با مجوز BUSL-1.1 منتشر میشوند. این مجوز source-available است، نه متنباز به تعریف OSI؛ پیش از استفادهٔ تجاری، بهخصوص اگر محصولی رقیب HashiCorp میسازید، شرایطش را بخوانید.