使用 Terraform 将 OpenStack 安全组添加到不受 Terraform 管理的实例
Using Terraform to add OpenStack Security Group to instance not managed by Terraform
我正在尝试使用 Terraform 向实例添加安全组和新规则。请注意,此实例不受 Terraform 管理。我 运行 遇到的问题是,当我应用它时,它会创建一个新实例。
我的Terraform代码如下:
resource "openstack_compute_secgroup_v2" "secgroup_1" {
name = "my_secgroup"
region = "${var.region}"
description = "my security group"
rule {
from_port = 22
to_port = 22
ip_protocol = "tcp"
cidr = "x.x.x.x/x"
}
rule {
from_port = 80
to_port = 80
ip_protocol = "tcp"
cidr = "x.x.x.x/x"
}
}
resource "openstack_compute_instance_v2" "myresource" {
name = "<Name of MY Instance>"
flavor_name = "m1.medium"
region = "${var.region}"
image_id = "<Image I.D of existing instance>"
security_groups = ["${openstack_compute_secgroup_v2.secgroup_1.name}"]
}
您的 Terraform 代码旨在在您的 OpenStack 集群上创建一个新实例。要让 Terraform 管理资源,它必须包含在其 state 文件中。当您使用 Terraform 创建资源时,Terraform 会自动将其放入状态文件中,然后开始管理该资源。
自 Terraform 0.7 起,许多资源现在可以 imported 进入状态文件,如下所示:
$ terraform import aws_instance.web i-12345678
如果您有这样的 Terraform 代码(来自 aws_instance documentation):
provider "aws" {
region = "us-west-2"
}
data "aws_ami" "ubuntu" {
most_recent = true
filter {
name = "name"
values = ["ubuntu/images/hvm-ssd/ubuntu-trusty-14.04-amd64-server-*"]
}
filter {
name = "virtualization-type"
values = ["hvm"]
}
owners = ["099720109477"] # Canonical
}
resource "aws_instance" "web" {
ami = "${data.aws_ami.ubuntu.id}"
instance_type = "t2.micro"
tags {
Name = "HelloWorld"
}
}
并且已经有一个实例 ID 为 i-12345678
的预先存在的实例,然后 Terraform 会导入该实例,现在 运行 上述代码的计划应该不会显示任何更改,而不是创建web
实例。
不幸的是,OpenStack 支持似乎不如 AWS 成熟,因此(截至 0.7.7)目前不支持使用 import
命令直接导入 OpenStack 实例资源。但是,import
命令只是让操作状态文件变得更容易而不会破坏任何东西,因此您只需编辑状态文件以包含资源即可。
我正在尝试使用 Terraform 向实例添加安全组和新规则。请注意,此实例不受 Terraform 管理。我 运行 遇到的问题是,当我应用它时,它会创建一个新实例。
我的Terraform代码如下:
resource "openstack_compute_secgroup_v2" "secgroup_1" {
name = "my_secgroup"
region = "${var.region}"
description = "my security group"
rule {
from_port = 22
to_port = 22
ip_protocol = "tcp"
cidr = "x.x.x.x/x"
}
rule {
from_port = 80
to_port = 80
ip_protocol = "tcp"
cidr = "x.x.x.x/x"
}
}
resource "openstack_compute_instance_v2" "myresource" {
name = "<Name of MY Instance>"
flavor_name = "m1.medium"
region = "${var.region}"
image_id = "<Image I.D of existing instance>"
security_groups = ["${openstack_compute_secgroup_v2.secgroup_1.name}"]
}
您的 Terraform 代码旨在在您的 OpenStack 集群上创建一个新实例。要让 Terraform 管理资源,它必须包含在其 state 文件中。当您使用 Terraform 创建资源时,Terraform 会自动将其放入状态文件中,然后开始管理该资源。
自 Terraform 0.7 起,许多资源现在可以 imported 进入状态文件,如下所示:
$ terraform import aws_instance.web i-12345678
如果您有这样的 Terraform 代码(来自 aws_instance documentation):
provider "aws" {
region = "us-west-2"
}
data "aws_ami" "ubuntu" {
most_recent = true
filter {
name = "name"
values = ["ubuntu/images/hvm-ssd/ubuntu-trusty-14.04-amd64-server-*"]
}
filter {
name = "virtualization-type"
values = ["hvm"]
}
owners = ["099720109477"] # Canonical
}
resource "aws_instance" "web" {
ami = "${data.aws_ami.ubuntu.id}"
instance_type = "t2.micro"
tags {
Name = "HelloWorld"
}
}
并且已经有一个实例 ID 为 i-12345678
的预先存在的实例,然后 Terraform 会导入该实例,现在 运行 上述代码的计划应该不会显示任何更改,而不是创建web
实例。
不幸的是,OpenStack 支持似乎不如 AWS 成熟,因此(截至 0.7.7)目前不支持使用 import
命令直接导入 OpenStack 实例资源。但是,import
命令只是让操作状态文件变得更容易而不会破坏任何东西,因此您只需编辑状态文件以包含资源即可。