在这篇文章中,我们将学习什么是供应者以及如何在terraform配置文件中使用它。
什么是供应者?
terraform中的供应者允许在本地或远程服务器上执行特定操作。我们可以直接向任何资源添加供应者。
通用供应者是独立于任何云提供商的供应者,可以在没有他们的情况下使用。它们有三种类型:
- 文件
- 本地执行器
- 远程执行
文件供应者
文件类型允许传输或复制文件或目录到远程主机。这个配置器支持ssh或winrm连接,以支持在远程服务器上传输文件。
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的系统上调用脚本或命令,而不是在创建的资源上调用。这个配置器不需要ssh或winrm连接,因为它在本地系统上运行。
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中使用的三种类型的通用供应者,并举出了每一种的例子。