Terraform: chỉ áp dụng một tệp tf


16

Tôi có các nhóm bảo mật của tôi trong một securitygroup.tftập tin.

Trong cùng một thư mục có rất nhiều mô tả tài nguyên khác (rds, ec2, v.v.).

Có cách nào để thực hiện terraform apply --auto-approve chỉ cho tôi securitygroups.tf?

Câu trả lời:


18

Không hẳn vậy. Cách tiêu chuẩn để giải quyết vấn đề này là sử dụng, ví dụ:

terraform apply -target=aws_security_group.my_sg

nhưng điều đó sẽ chỉ áp dụng một nhóm bảo mật tại một thời điểm, vì vậy sẽ trở nên tẻ nhạt nếu bạn có nhiều nhóm. Tuy nhiên, bạn có thể nhắm mục tiêu nhiều tài nguyên trong một lệnh:

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

Tuy nhiên, có khả năng một vài cách giải quyết:

  • Các -targettham số tôn trọng phụ thuộc.

    Điều này có nghĩa là nếu bạn đã ví dụ. -target=aws_instance.my_servervà ví dụ đó, có năm nhóm bảo mật được đính kèm thông qua nội suy, những thay đổi đối với các nhóm bảo mật đó sẽ được đưa vào kế hoạch (Tôi chưa kiểm tra kỹ điều này, nhưng tôi tin rằng đây là cách nó hoạt động).

    Đó là một chút lộn xộn, vì bạn có thể không muốn chạm vào một ví dụ. Một giải pháp thay thế an toàn hơn có thể là sử dụng thứ gì đó như null_resourceđể cung cấp mục tiêu cho các nhóm bảo mật, nhưng một lần nữa tôi đã không thử điều này (có thể có một tài nguyên 'an toàn' khác mà bạn có thể dựa vào?).

  • Tạo một mô-đun.

    Bạn có thể nhắm mục tiêu một mô-đun giống như bạn có thể nhắm mục tiêu tài nguyên đơn giản:

    terraform apply -target=module.my_security_groups
    

    Trong mô-đun này, bạn có thể xác định tất cả các nhóm bảo mật của mình - giống như bạn sẽ có bên ngoài mô-đun. Ngoài việc có thể nhắm mục tiêu trực tiếp vào nó, điều này cũng giúp bạn dễ dàng sử dụng lại cùng một nhóm các nhóm bảo mật cho cơ sở hạ tầng khác, nếu bạn cần.


2

Nếu bạn sắp xếp mã theo các mô-đun, bạn chỉ có thể áp dụng terraform trên một mô-đun, ví dụ:

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

$ tf apply -target=module.securitygroup

1

Không giống như nó có thể. Đây là mã để tải các tệp cấu hình và nó tải tất cả các tệp * .tf từ thư mục hiện tại (hoặc một tệp được chỉ định) và không có gì ở đó để giới hạn cấu hình trong một tệp.


0

Sử dụng mô-đun terraform được ưu tiên, nhưng nếu bạn thực sự phải chạy terraform áp dụng cho một tệp duy nhất, tôi đã tạo tập lệnh bash này để tạo lệnh áp dụng terraform đối với tất cả các mục tiêu và mô-đun trong một tệp:

#!/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"

Tôi không thực sự là chuyên gia bash, nhưng nó đã được thử nghiệm để hoạt động trên Mac.

EDIT: Lệnh sed giả định rằng các tài nguyên và mô-đun được định dạng độc đáo theo terraform fmt, như vậy:

resource "aws_eip" "my_public_ip" {
}

resource "aws_instance" "my_server" {
}

module "my_module" {
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.