Terraform 创建后在所有EC2实例上运行本地exec provisioner

Terraform 创建后在所有EC2实例上运行本地exec provisioner,terraform,Terraform,我目前有一个Terraform文件,用于在AWS上创建EC2实例,如下所示: resource "aws_instance" "influxdata" { count = "${var.ec2-count-influx-data}" ami = "${module.amis.rhel73_id}" instance_type = "${var.ec2-type-influx-data}" vpc_security_group_ids = ["${

我目前有一个Terraform文件,用于在AWS上创建EC2实例,如下所示:

resource "aws_instance" "influxdata" {
  count      = "${var.ec2-count-influx-data}"

  ami           = "${module.amis.rhel73_id}"
  instance_type = "${var.ec2-type-influx-data}"

  vpc_security_group_ids = ["${var.sg-ids}"]
  subnet_id              = "${element(module.infra.subnet,count.index)}"
  key_name               = "${var.KeyName}"
  iam_instance_profile   = "Custom-role"

  tags {
    Name               = "influx-data-node"
    ASV                = "${module.infra.ASV}"
    CMDBEnvironment    = "${module.infra.CMDBEnvironment}"
    OwnerContact       = "${module.infra.OwnerContact}"
    custodian_downtime = "off"
    OwnerEid           = "${var.OwnerEid}"
  }


  ebs_block_device {
    device_name = "/dev/sdg"
    volume_size = 500
    volume_type = "io1"
    iops = 2000
    encrypted = true
    delete_on_termination = true
  }

  user_data = "${file("terraform/attach_ebs.sh")}"

  connection {
    private_key = "${file("/Users/usr111/Downloads/usr111_CD.pem")}"
    user        = "ec2-user"
  }

  provisioner "remote-exec" {
    inline = ["echo just checking for ssh. ttyl. bye."]
  }

  provisioner "local-exec" {
    command = <<EOF
ansible-playbook base-data.yml --key-file=/Users/usr111/Downloads/usr111_CD.pem --user=ec2-user -b -i "${self.private_ip},"
    EOF
  }
}

resource "aws_route53_record" "influx-data-route" {

  count = "${var.ec2-count-influx-data}"
  zone_id = "${var.r53-zone}"
  name = "influx-data-0${count.index}"
  type = "A"
  ttl = "300"
  // matches up record N to instance N
  records = ["${element(aws_instance.influxdata.*.private_ip, count.index)}"]
}

resource "local_file" "inventory-meta" {
  filename = "inventory"

  content = <<-EOF
[meta]
${join("\n",aws_instance.influxmeta.*.private_ip)}

[data]
${join("\n",aws_instance.influxdata.*.private_ip)}
  EOF
}
provisioner "local-exec" {
   command = "ansible-playbook -i ec2.py playbook.yml --limit ${self.public_ip}" }
provisioner "local-exec" {
   command = "ansible-playbook -i ec2.py playbook.yml --limit ${self.public_ip}" --extra-vars 'ip=${self.public_ip}'}
资源“aws\u实例”“扩展数据”{
count=“${var.ec2-count-influx-data}”
ami=“${module.amis.rhel73_id}”
实例_type=“${var.ec2-type-influx-data}”
专有网络安全组ID=[“${var.sg-ids}”]
subnet_id=“${element(module.infra.subnet,count.index)}”
key_name=“${var.KeyName}”
iam_实例_profile=“自定义角色”
标签{
Name=“流入数据节点”
ASV=“${module.infra.ASV}”
CMDBEnvironment=“${module.infra.CMDBEnvironment}”
OwnerContact=“${module.infra.OwnerContact}”
托管人停机时间=“关闭”
OwnerEid=“${var.OwnerEid}”
}
ebs_块_设备{
设备名称=“/dev/sdg”
体积大小=500
卷类型=“io1”
iops=2000
加密=真
在\终止时删除\=真
}
用户_data=“${file(“terraform/attach_ebs.sh”)}”
联系{
private_key=“${file(“/Users/usr111/Downloads/usr111_CD.pem”)}”
user=“ec2用户”
}
供应器“远程执行”{
inline=[“echo正在检查ssh.ttyl.bye。”]
}
供应人“本地执行官”{

command=由于您使用的是AWS,您可以尝试使用该脚本,您的Provisionier可能如下所示:

resource "aws_instance" "influxdata" {
  count      = "${var.ec2-count-influx-data}"

  ami           = "${module.amis.rhel73_id}"
  instance_type = "${var.ec2-type-influx-data}"

  vpc_security_group_ids = ["${var.sg-ids}"]
  subnet_id              = "${element(module.infra.subnet,count.index)}"
  key_name               = "${var.KeyName}"
  iam_instance_profile   = "Custom-role"

  tags {
    Name               = "influx-data-node"
    ASV                = "${module.infra.ASV}"
    CMDBEnvironment    = "${module.infra.CMDBEnvironment}"
    OwnerContact       = "${module.infra.OwnerContact}"
    custodian_downtime = "off"
    OwnerEid           = "${var.OwnerEid}"
  }


  ebs_block_device {
    device_name = "/dev/sdg"
    volume_size = 500
    volume_type = "io1"
    iops = 2000
    encrypted = true
    delete_on_termination = true
  }

  user_data = "${file("terraform/attach_ebs.sh")}"

  connection {
    private_key = "${file("/Users/usr111/Downloads/usr111_CD.pem")}"
    user        = "ec2-user"
  }

  provisioner "remote-exec" {
    inline = ["echo just checking for ssh. ttyl. bye."]
  }

  provisioner "local-exec" {
    command = <<EOF
ansible-playbook base-data.yml --key-file=/Users/usr111/Downloads/usr111_CD.pem --user=ec2-user -b -i "${self.private_ip},"
    EOF
  }
}

resource "aws_route53_record" "influx-data-route" {

  count = "${var.ec2-count-influx-data}"
  zone_id = "${var.r53-zone}"
  name = "influx-data-0${count.index}"
  type = "A"
  ttl = "300"
  // matches up record N to instance N
  records = ["${element(aws_instance.influxdata.*.private_ip, count.index)}"]
}

resource "local_file" "inventory-meta" {
  filename = "inventory"

  content = <<-EOF
[meta]
${join("\n",aws_instance.influxmeta.*.private_ip)}

[data]
${join("\n",aws_instance.influxdata.*.private_ip)}
  EOF
}
provisioner "local-exec" {
   command = "ansible-playbook -i ec2.py playbook.yml --limit ${self.public_ip}" }
provisioner "local-exec" {
   command = "ansible-playbook -i ec2.py playbook.yml --limit ${self.public_ip}" --extra-vars 'ip=${self.public_ip}'}
在您的剧本中,您需要等待SSH可用,因为Ansible正在建立连接,而不是Terraform

- name: wait for ssh
  hosts: localhost
  gather_facts: no

  tasks:
    - local_action: wait_for port=22 host="{{ ip }}" search_regex=OpenSSH delay=10
因此,该命令应如下所示:

resource "aws_instance" "influxdata" {
  count      = "${var.ec2-count-influx-data}"

  ami           = "${module.amis.rhel73_id}"
  instance_type = "${var.ec2-type-influx-data}"

  vpc_security_group_ids = ["${var.sg-ids}"]
  subnet_id              = "${element(module.infra.subnet,count.index)}"
  key_name               = "${var.KeyName}"
  iam_instance_profile   = "Custom-role"

  tags {
    Name               = "influx-data-node"
    ASV                = "${module.infra.ASV}"
    CMDBEnvironment    = "${module.infra.CMDBEnvironment}"
    OwnerContact       = "${module.infra.OwnerContact}"
    custodian_downtime = "off"
    OwnerEid           = "${var.OwnerEid}"
  }


  ebs_block_device {
    device_name = "/dev/sdg"
    volume_size = 500
    volume_type = "io1"
    iops = 2000
    encrypted = true
    delete_on_termination = true
  }

  user_data = "${file("terraform/attach_ebs.sh")}"

  connection {
    private_key = "${file("/Users/usr111/Downloads/usr111_CD.pem")}"
    user        = "ec2-user"
  }

  provisioner "remote-exec" {
    inline = ["echo just checking for ssh. ttyl. bye."]
  }

  provisioner "local-exec" {
    command = <<EOF
ansible-playbook base-data.yml --key-file=/Users/usr111/Downloads/usr111_CD.pem --user=ec2-user -b -i "${self.private_ip},"
    EOF
  }
}

resource "aws_route53_record" "influx-data-route" {

  count = "${var.ec2-count-influx-data}"
  zone_id = "${var.r53-zone}"
  name = "influx-data-0${count.index}"
  type = "A"
  ttl = "300"
  // matches up record N to instance N
  records = ["${element(aws_instance.influxdata.*.private_ip, count.index)}"]
}

resource "local_file" "inventory-meta" {
  filename = "inventory"

  content = <<-EOF
[meta]
${join("\n",aws_instance.influxmeta.*.private_ip)}

[data]
${join("\n",aws_instance.influxdata.*.private_ip)}
  EOF
}
provisioner "local-exec" {
   command = "ansible-playbook -i ec2.py playbook.yml --limit ${self.public_ip}" }
provisioner "local-exec" {
   command = "ansible-playbook -i ec2.py playbook.yml --limit ${self.public_ip}" --extra-vars 'ip=${self.public_ip}'}

您也可以使用“文件供应器”将剧本复制到主机,安装ansible并使用“remote exec”在本地运行剧本,但这取决于您。

是否尝试使用取决于某些方法?