我尝试使用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}"]
}
答案 0 :(得分:0)
您的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
命令只是简单地操作状态文件而不会破坏事物,因此您只需编辑状态文件即可包含资源。