Тераформа: застосуйте лише один файл tf


17

Я маю свої групи безпеки у securitygroup.tfфайлі.

У цьому ж режимі є багато інших описів ресурсів (rds, ec2 тощо).

Чи є спосіб виконати terraform apply --auto-approve єдиний для мене securitygroups.tf?

Відповіді:


19

Не зовсім. Типовий спосіб подолати це, наприклад, використовувати:

terraform apply -target=aws_security_group.my_sg

але це застосовуватиметься лише одна група безпеки одночасно, тому ви будете нудною, якщо їх буде багато. Однак можна націлити кілька ресурсів в одній команді:

terraform apply -target=aws_security_group.my_sg -target=aws_security_group.my_2nd_sg

Однак, можливо, існує декілька способів вирішення:

  • -targetПараметр поважає залежності.

    Це означає, якби ви були, наприклад. -target=aws_instance.my_serverі цей екземпляр мав, скажімо, п'ять груп безпеки, приєднаних до нього за допомогою інтерполяції, зміни до цих груп безпеки повинні бути включені в план (я не ретельно перевіряв це, але я вважаю, що це працює).

    Це трохи безладно, оскільки, напевно, ви не хочете торкатися екземпляра. Більш безпечною альтернативою може бути використання чогось типу a, null_resourceщоб вказати ціль для груп безпеки, але я знову не намагався цього (можливо, є ще один "безпечний" ресурс, на який можна покластися?).

  • Створіть модуль.

    Ви можете орієнтуватися на модуль так само, як і на звичайний ресурс:

    terraform apply -target=module.my_security_groups
    

    Всередині цього модуля ви можете визначити всі ваші групи безпеки - так само, як і у вас поза модулем. Окрім того, що ви можете націлити його безпосередньо, це також полегшує повторне використання того ж набору груп безпеки для іншої інфраструктури, якщо вам це буде потрібно.


2

Якщо ви впорядковуєте свій код за модулями, ви можете застосовувати тераформу лише на модулі, наприклад:

# securitygroup.tf
module "securitygroup" {
  source = "git@github.com:user/securitygroup-terraform-module.git?ref=master"
}

$ tf apply -target=module.securitygroup

1

Не схоже, що це можливо. Ось код для завантаження конфігураційних файлів, і він завантажує всі * .tf файли з поточного каталогу (або вказаного), і немає нічого, що обмежує конфігурацію одним файлом.


0

Використання модуля Terraform є кращим, але якщо вам дійсно потрібно запустити terraform застосувати до одного файлу, я створив цей скрипт bash для створення команди Terraform застосовувати проти всіх цілей і модулів в одному файлі:

#!/usr/bin/env bash
if [[ -z "$@" ]]; then
  echo "Missing file input arguments"
  exit 1
fi

echo "terraform apply \\"
for FILE in "$@"
do
  RESOURCE=$(sed -n 's/resource "\([^"]*\)" "\([^"]*\)".*/-target=\1.\2 \\/gp' $FILE)
  MODULE=$(sed -n 's/module "\([^"]*\)".*/-target=module.\1 \\/gp' $FILE)
  if [[ -z "$RESOURCE" ]] && [[ -z "$MODULE" ]]; then
    echo "Cannot detect terraform resource and module in $FILE"
    exit 1
  fi

  if [[ ! -z "$RESOURCE" ]]; then
    echo -e $"$RESOURCE"
  fi
  if [[ ! -z "$MODULE" ]]; then
    echo -e $"$MODULE"
  fi
done
echo "-refresh=true"

Я насправді не баш експерт, але це було тестовано для роботи на Mac.

EDIT: Команда sed передбачає, що ресурси та модулі добре відформатовані відповідно до terraform fmt:

resource "aws_eip" "my_public_ip" {
}

resource "aws_instance" "my_server" {
}

module "my_module" {
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.