Terraform: ใช้ไฟล์ tf เพียงไฟล์เดียว


17

ฉันมีกลุ่มความปลอดภัยในsecuritygroup.tfไฟล์

ใน dir เดียวกันมีคำอธิบายทรัพยากรอื่น ๆ มากมาย (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

หากคุณจัดระเบียบโค้ดตามโมดูลคุณสามารถใช้ Terraform เฉพาะกับโมดูลเช่น:

# 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 Apply กับเป้าหมายและโมดูลทั้งหมดในไฟล์เดียว:

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

แก้ไข: คำสั่ง sed สันนิษฐานว่าทรัพยากรและโมดูลมีการจัดรูปแบบตามterraform fmt:

resource "aws_eip" "my_public_ip" {
}

resource "aws_instance" "my_server" {
}

module "my_module" {
}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.