使用terraform 0.11创建libvirt网络后注入iptables规则
我有以下场景:我使用terraform(版本0.11)使用libvirt创建多个VM。虚拟机连接到NAT虚拟网络。作为虚拟机创建的一部分,通过ssh在每个虚拟机上执行一些命令。如果虚拟机是在运行terraform的同一台机器上创建的,那么这种方法就非常有效 现在,我希望能够在我的桌面上运行terraform,并在另一台拥有更多资源的机器上创建虚拟机。我更改了qemu的uri以指向远程服务器。VM创建工作正常,但当terraform尝试从我的机器ssh到VM时,它失败了,因为默认情况下libvirt不会将VM公开给外部访问 因此,我创建了一个额外的资源来在远程机器中运行一个命令,在创建虚拟网络之后和访问虚拟机之前向iptables添加一个规则。请参阅下面的代码作为参考。请注意,它已被编辑使用terraform 0.11创建libvirt网络后注入iptables规则,terraform,iptables,libvirt,Terraform,Iptables,Libvirt,我有以下场景:我使用terraform(版本0.11)使用libvirt创建多个VM。虚拟机连接到NAT虚拟网络。作为虚拟机创建的一部分,通过ssh在每个虚拟机上执行一些命令。如果虚拟机是在运行terraform的同一台机器上创建的,那么这种方法就非常有效 现在,我希望能够在我的桌面上运行terraform,并在另一台拥有更多资源的机器上创建虚拟机。我更改了qemu的uri以指向远程服务器。VM创建工作正常,但当terraform尝试从我的机器ssh到VM时,它失败了,因为默认情况下libvir
resource "libvirt_network" "network" {
name = "${var.stack_name}-network"
mode = "${var.network_mode}" <-- this is NAT
domain = "${var.dns_domain}"
dns = {
enabled = true
}
addresses = ["${var.network_cidr}"] <- 10.17.0.0/22
}
resource "null_resource" "iptables" {
depends_on = ["libvirt_network.network"]
connection {
host = <remote server>
password = "******"
user = <ssh user>
type = "ssh"
}
provisioner "remote-exec" {
inline = [
"sudo iptables -I FORWARD 1 -d ${var.network_cidr} -p tcp --dport 22 -j ACCEPT",
]
}
}
resource "libvirt_domain" "vm" {
depends_on = ["null_resource.iptables"]
count = "${vars.vms}"
...
}
resource "null_resource" "config" {
depends_on = ["libvirt_domain.vm"]
connection {
host = "${element(libvirt_domain.vm.*.network_interface.0.addresses.0, count.index)}"
...
}
provisioner "remote-exec" { <-- this is the remote exec on vm
}
}
我不明白的是,如果iptables命令是在网络创建之后、到Vms的ssh执行之前(我已经在terraform输出中检查了这一点),那么为什么iptables规则是在libvirt注入规则之后创建的呢,但我可以告诉你实现同样目标的另一种方法。Libvirt有一个“hooks”的概念,它是在Libvirt的某些关键点上运行的管理员定义的脚本: 这里有一个使用钩子进行端口转发的示例:
1 ACCEPT all -- 0.0.0.0/0 10.17.0.0/22 ctstate RELATED,ESTABLISHED
2 ACCEPT all -- 10.17.0.0/22 0.0.0.0/0
3 ACCEPT all -- 0.0.0.0/0 0.0.0.0/0
4 REJECT all -- 0.0.0.0/0 0.0.0.0/0 reject-with icmp-port-unreachable
5 REJECT all -- 0.0.0.0/0 0.0.0.0/0 reject-with icmp-port-unreachable
6 ACCEPT tcp -- 0.0.0.0/0 10.17.0.0/22 tcp dpt:22