ฉันมีกลุ่มความปลอดภัยในsecuritygroup.tf
ไฟล์
ใน dir เดียวกันมีคำอธิบายทรัพยากรอื่น ๆ มากมาย (rds, ec2 ฯลฯ )
มีวิธีในการแสดงterraform apply --auto-approve
เฉพาะสำหรับฉันsecuritygroups.tf
หรือไม่?
ฉันมีกลุ่มความปลอดภัยในsecuritygroup.tf
ไฟล์
ใน dir เดียวกันมีคำอธิบายทรัพยากรอื่น ๆ มากมาย (rds, ec2 ฯลฯ )
มีวิธีในการแสดงterraform apply --auto-approve
เฉพาะสำหรับฉันsecuritygroups.tf
หรือไม่?
คำตอบ:
ไม่ได้จริงๆ วิธีมาตรฐานในการแก้ไขปัญหานี้คือการใช้เช่น:
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
ภายในโมดูลนี้คุณสามารถกำหนดกลุ่มความปลอดภัยทั้งหมดของคุณได้เช่นเดียวกับที่คุณมีอยู่นอกโมดูล เช่นเดียวกับความสามารถในการกำหนดเป้าหมายโดยตรงสิ่งนี้ยังทำให้คุณสามารถใช้กลุ่มความปลอดภัยชุดเดียวกันกับโครงสร้างพื้นฐานอื่นได้ง่ายขึ้นหากคุณต้องการ
หากคุณจัดระเบียบโค้ดตามโมดูลคุณสามารถใช้ Terraform เฉพาะกับโมดูลเช่น:
# securitygroup.tf
module "securitygroup" {
source = "git@github.com:user/securitygroup-terraform-module.git?ref=master"
}
$ tf apply -target=module.securitygroup
ดูเหมือนจะเป็นไปไม่ได้ นี่คือรหัสสำหรับโหลดไฟล์ปรับแต่งและโหลดไฟล์ * .tf ทั้งหมดจากไดเรกทอรีปัจจุบัน (หรือไฟล์ที่ระบุ) และไม่มีสิ่งใดที่จะ จำกัด การกำหนดค่าไว้ที่ไฟล์เดียว
โดยเฉพาะอย่างยิ่งการใช้โมดูล 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" {
}