dacker

نصب Terraform در ایران وقتی HashiCorp بلاک کرده

نصب Terraform، Packer و Vault از مخزن داخلی dacker بدون خطای ۴۰۳، و گذر از دیوار دوم یعنی دانلود providerها در terraform init با provider mirror.

  • پیش‌نویس
  • آخرین بازبینی:
  • هنوز روی سرور واقعی آزموده نشده

راه‌حل سریع

نصب Terraform (ترافرم) در ایران دو مرحله دارد. اول، خود Terraform را از مخزن داخلی dacker نصب کنید (روی Ubuntu 24.04؛ برای توزیع‌های دیگر صفحهٔ Terraform · Packer · Vault را ببینید):

Terraform · Packer · Vault1.16.4

  • Ubuntu 24.04
  • 236.8 MB
  • امضا و بررسی‌شده
جزئیات ←
bash · Ubuntu 24.04
  1. ۱کلید امضای dacker
    # 1) Add the dacker signing keysudo curl -fsSL https://repo.dacker.ir/dacker.gpg -o /usr/share/keyrings/dacker.gpg
  2. ۲افزودن مخزن
    # 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. ۳نصب
    # 3) Installsudo apt updatesudo apt install terraform
  4. ۴بررسی نصب
    # 4) Check the installationterraform version
به‌جای فایل .sources، یک خط .list می‌خواهید؟
  1. جایگزین مرحلهٔ ۲
    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 از ایران به این خطا می‌خورد:

text
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:

text
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 کمی فرق می‌کند):

text
╷│ 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
  • امضا و بررسی‌شده
جزئیات ←
bash · EL 9
  1. ۱کلید امضای سازنده
    # 1) Import the vendor signing keysudo rpm --import https://repo.dacker.ir/el/keys/hashicorp.asc
  2. ۲افزودن مخزن
    # 2) Add the repositorysudo curl -fsSL https://repo.dacker.ir/el/repos/dacker-hashicorp.repo -o /etc/yum.repos.d/dacker-hashicorp.repo
  3. ۳نصب
    # 3) Installsudo dnf install terraform
  4. ۴بررسی نصب
    # 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 هست):

bash
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 را روی سرور بسازید:

hcl
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 استفاده کنید:

hcl
provider_installation {  network_mirror {    url = "https://terraform-mirror.example.ir/"  }}

cache محلی برای سرعت بیشتر

برای اینکه هر پروژه providerها را دوباره کپی نکند، یک پوشهٔ cache مشترک تعریف کنید. این خط را هم به ~/.terraformrc اضافه کنید و پوشه را بسازید:

hcl
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 با فایل قفل

text
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 کنید:

bash
terraform providers lock -platform=linux_amd64 -platform=darwin_arm64

provider تازه‌ای به پروژه اضافه شد و 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 می‌سازید، شرایطش را بخوانید.

دستور نصب برای توزیع شما

مرتبط