使用 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 命令只是让操作状态文件变得更容易而不会破坏任何东西,因此您只需编辑状态文件以包含资源即可。