如何在Terraform配置文件中使用供应者?

491 阅读3分钟

在这篇文章中,我们将学习什么是供应者以及如何在terraform配置文件中使用它。

什么是供应者?

terraform中的供应者允许在本地或远程服务器上执行特定操作。我们可以直接向任何资源添加供应者。
通用供应者是独立于任何云提供商的供应者,可以在没有他们的情况下使用。它们有三种类型:

  • 文件
  • 本地执行器
  • 远程执行

文件供应者

文件类型允许传输或复制文件或目录到远程主机。这个配置器支持sshwinrm连接,以支持在远程服务器上传输文件。

resource "aws_instance" "ssh-ec2" {
  ami           ="ami-2757f631"
  instance_type = "t2.micro"
    key_name= "aws_key"
    subnet_id = "${aws_subnet.subnet.id}"
    vpc_security_group_ids = [aws_security_group.ssh.id]

provisioner "file" {
    source      = "/home/knoldus/Downloads/spring-boot-example-main/target/hello-0.0.1-SNAPSHOT.jar"
    destination = "/home/ubuntu/file"
} 
connection {
    type        = "ssh"
    host        = self.public_ip
    user        = "ubuntu"
    private_key = file("/home/knoldus/Downloads/aws_key.pem")
}
  tags = {
    Name = "Instance-provisioner"
  }
}

resource "aws_security_group" "ssh" {
  vpc_id = "${aws_vpc.vpc.id}"
  egress = [
    {
      cidr_blocks      = [ "0.0.0.0/0"]
      description      = ""
      from_port        = 0
      ipv6_cidr_blocks = []
      prefix_list_ids  = []
      protocol         = "-1"
      security_groups  = []
      self             = false
      to_port          = 0
    }
  ]
 ingress                = [
   {
     cidr_blocks      = [ "0.0.0.0/0"]
     description      = ""
     from_port        = 22
     ipv6_cidr_blocks = []
     prefix_list_ids  = []
     protocol         = "tcp"
     security_groups  = []
     self             = false
     to_port          = 22
  }
  ]
}

在上面的代码中,我们通过使用aws密钥对创建了一个带有ssh连接的ec2实例,然后使用 "文件 "类型的供应者。我们用它将一个jar文件从本地传输到远程系统。源是用来定义需要上传到远程实例的文件,目的是定义需要上传到实例上的目标文件夹。

Remote-exec供应器

Remote-exec是一个允许在远程服务器上执行命令/脚本的配置器。我们可以在远程实例创建后在其上运行我们想运行的脚本。例如,我们将在实例上上传我们应用程序的jar文件,并使用 "remote-exec "来执行命令,在远程系统,即ec2实例上运行该文件。

resource "aws_instance" "ssh-ec2" {
  ami           ="ami-2757f631"
  instance_type = "t2.micro"
    key_name= "aws_key"
    subnet_id = "${aws_subnet.subnet.id}"
    vpc_security_group_ids = [aws_security_group.ssh.id]

provisioner "file" {
    source      = "/home/knoldus/Downloads/spring-boot-example-main/target/hello-0.0.1-SNAPSHOT.jar"
    destination = "/home/ubuntu/file.jar"
} 
connection {
    type        = "ssh"
    host        = self.public_ip
    user        = "ubuntu"
    private_key = file("/home/knoldus/Downloads/aws_key.pem")
}

provisioner "remote-exec" {
  inline = [
    "sudo apt-get update",
    "sudo apt-get install openjdk-8-jdk -y",
    "sudo java -jar file.jar",
  ]
}

  tags = {
    Name = "Instance-provisioner"
  }
}

resource "aws_security_group" "ssh" {
  vpc_id = "${aws_vpc.vpc.id}"
  egress = [
    {
      cidr_blocks      = [ "0.0.0.0/0"]
      description      = ""
      from_port        = 0
      ipv6_cidr_blocks = []
      prefix_list_ids  = []
      protocol         = "-1"
      security_groups  = []
      self             = false
      to_port          = 0
    }
  ]
 ingress                = [
   {
     cidr_blocks      = [ "0.0.0.0/0"]
     description      = ""
     from_port        = 22
     ipv6_cidr_blocks = []
     prefix_list_ids  = []
     protocol         = "tcp"
     security_groups  = []
     self             = false
     to_port          = 22
  }
  ]
}

在上面的代码中,我们使用了与 "文件 "供应者类似的例子,在其扩展中,我们添加了 "远程-执行 "供应者块。在这里,我们使用命令在创建的实例中安装java,然后运行我们使用'file'供应器传输的jar文件。下面是我们在上述配置文件上使用'terraform apply'命令时将得到的输出截图。这表明jar文件正在创建的实例上有效运行。

Local-exec Provisioner

正如名字 "local-exec "所暗示的,它允许在本地系统上执行命令/脚本。这在运行terraform的系统上调用脚本或命令,而不是在创建的资源上调用。这个配置器不需要sshwinrm连接,因为它在本地系统上运行。

resource "aws_instance" "ssh-ec2" {
  ami           ="ami-2757f631"
  instance_type = "t2.micro"

  tags = {
    Name = "Instance-Provisioner"
  }

  provisioner "local-exec" {
    command = "echo ${self.private_ip} >> local-exec_IPs.txt"
  }
}

在上面的代码中,我们创建了一个ec2实例,然后使用 "local-exec"。我们用它来存储上面创建的实例的私有IP。它将把它存储在本地系统的terraform目录下一个名为local-exec_IPs.txt的文件中。我们可以用 "命令 "参数来使用这个配置器,也可以用其他各种参数,如 "环境 "或 "解释器"。

下面的截图显示了在terraform目录下创建的文本文件,并显示了创建的实例的IP。

总结

所以,我们已经涵盖了我们在terraform中使用的三种类型的通用供应者,并举出了每一种的例子。