Назад | Перейти на главную страницу

Зависимость Terraform от шаблона

У меня есть файл шаблона, который используется для создания файла конфигурации, который затем используется для подготовки экземпляра.

Если файл шаблона изменяется, я хочу, чтобы "terraform apply" запускала регенерацию файла конфигурации, а затем, когда файл конфигурации изменяется, я хочу, чтобы это запускало регенерацию экземпляра.

Есть ли способ сделать это с помощью terraform?

data "template_file" "instance_config" {
  template = "${file("${path.module}/instance_config.tpl")}"
  vars {
    private_cidr_block = "${var.private_cidr_block}"
  }
}

resource "null_resource" "export_instance_config" {
  provisioner "local-exec" {
    command = "cat >instance_config.json <<EOL\n${data.template_file.instance_config.rendered}\nEOL"
  }
}

resource "aws_instance" "vpn" {
  ami           = "${data.aws_ami.my_ami.id}"
  instance_type = "t2.micro"
  key_name = "mykey"
  subnet_id = "${var.subnet_id}"
  associate_public_ip_address = true
  security_groups = ["${aws_security_group.instance_sg.id}"]

  connection {
    type = "ssh"
    user = "myuser"
    private_key = "${file("mykey.pem")}"
    agent = false
  }

  provisioner "file" {
    source = "instance_config.json"
    destination = "/home/myuser/instance_config.json"
  }

  provisioner "remote-exec" {
    inline = [
      "sudo /usr/bin/configure_instance /home/myuser/instance_config.json"
    ]
  }
}

Вы можете уменьшить сложность и исправить цепочку зависимостей, используя описанную функцию провайдеров. Вот.

В частности, я думаю, вы можете удалить null_resource Provider и вместо этого сделайте следующее:

data "template_file" "instance_config" {
  template = "${file("${path.module}/instance_config.tpl")}"

  vars {
    private_cidr_block = "${var.private_cidr_block}"
  }
}

resource "aws_instance" "vpn" {
  ami           = "${data.aws_ami.my_ami.id}"
  instance_type = "t2.micro"
  key_name      = "mykey"
  subnet_id     = "${var.subnet_id}"

  associate_public_ip_address = true

  security_groups = ["${aws_security_group.instance_sg.id}"]

  connection {
    type        = "ssh"
    user        = "myuser"
    private_key = "${file("mykey.pem")}"
    agent       = false
  }

  provisioner "file" {
    content     = "${data.template_file.instance_config.rendered}"
    destination = "/home/myuser/instance_config.json"
  }

  provisioner "remote-exec" {
    inline = [
      "sudo /usr/bin/configure_instance /home/myuser/instance_config.json"
    ]
  }
}