tôi đã nhận thấy terraform đó sẽ chỉ chạy "tập tin", "xa-exec" hoặc "địa phương-exec" trên nguồn lực một lần. Khi một tài nguyên được cung cấp nếu các lệnh trong một "remote-exec" được thay đổi hoặc một tập tin từ "file" cung cấp được thay đổi thì terraform sẽ không thực hiện bất kỳ thay đổi nào đối với cá thể đó. Vì vậy, làm thế nào để tôi có được terraform để chạy provisioner "tập tin", "từ xa-exec" hoặc "local-exec" mỗi khi tôi chạy một terraform áp dụng?Terraform: Làm thế nào để chạy từ xa-exec nhiều hơn một lần?
Để biết thêm chi tiết:
Thường thì tôi đã có một nguồn tài nguyên được cung cấp một phần do lỗi từ "xa-exec" gây terraform để stop (chủ yếu là do tôi nhập vào các lệnh sai trong khi tôi đang viết kịch bản của tôi). Chạy lại terraform sau khi điều này sẽ khiến tài nguyên được tạo trước đây bị hủy và buộc phải tạo một tài nguyên mới từ đầu. Đây cũng là cách duy nhất tôi có thể chạy "remote-exec" hai lần trên một tài nguyên ... bằng cách tạo nó từ đầu.
Đây thực sự là một nhược điểm để terraform như trái ngược với ansible, có thể thực hiện công việc chính xác giống như terraform ngoại trừ việc nó là hoàn toàn idempotent. Khi sử dụng Ansible với các tác vụ như "ec2", "shell" và "copy", tôi có thể thực hiện các tác vụ tương tự như terraform chỉ mỗi tác vụ đó sẽ là idempotent. Ansible sẽ tự động nhận ra khi nó không cần phải thực hiện thay đổi, nơi nó làm và vì điều này nó có thể nhận nơi một vở kịch không an toàn-play-off rời khỏi mà không phá hủy tất cả mọi thứ và bắt đầu từ đầu. Terraform thiếu tính năng này.
Để tham khảo ở đây là một khối tài nguyên terraform đơn giản cho một thể hiện EC2 sử dụng cả "xa-exec" và "tập tin" provisioners:
resource "aws_instance" "test" {
count = ${var.amt}
ami = "ami-2d39803a"
instance_type = "t2.micro"
key_name = "ansible_aws"
tags {
name = "test${count.index}"
}
#creates ssh connection to consul servers
connection {
user = "ubuntu"
private_key="${file("/home/ubuntu/.ssh/id_rsa")}"
agent = true
timeout = "3m"
}
provisioner "remote-exec" {
inline = [<<EOF
sudo apt-get update
sudo apt-get install curl unzip
echo hi
EOF
]
}
#copying a file over
provisioner "file" {
source = "scripts/test.txt"
destination = "/path/to/file/test.txt"
}
}
ý tưởng thực sự tuyệt vời –