使用Terraform将OpenStack安全组添加到不受Terraform管理的实例

时间:2016-11-03 14:14:59

标签: openstack 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}"]
}

1 个答案:

答案 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命令只是简单地操作状态文件而不会破坏事物,因此您只需编辑状态文件即可包含资源。