检索自动缩放组实例ip并将其提供给ansible

时间:2018-12-10 06:46:35

标签: mongodb ansible terraform

我目前正在开发terraform脚本和ansible角色,以便通过复制安装mongodb。我正在使用自动缩放组,我需要将ec2实例私有ip作为额外的变量传递给ansible。有什么办法吗?

谈到rs.initiate()时,有什么方法可以在Terraform创建实例时将ec2私有IP添加到mongo集群中。

1 个答案:

答案 0 :(得分:0)

不太确定它在ASG中是如何完成的,可能是用户数据和EC2元数据的组合会有所帮助。

但是,如果我们有固定数量的节点,我将按照以下步骤进行操作。发布此答案,因为它可以以某种方式对某人有所帮助。

使用EC2动态清单脚本。
参考-https://docs.ansible.com/ansible/2.5/user_guide/intro_dynamic_inventory.html

这基本上是一个python脚本,即ec2.py,它使用标签等获取实例私有IP。它带有一个名为ec2.ini的配置文件。

在TF脚本中标记您的实例(添加角色标记)-

resource "aws_instance" "ec2" {

  ....

  tags                    = "${merge(var.tags, map(
                            "description","mongodb-node",
                            "role", "mongodb-node",
                            "Environment", "${local.env}",))}"
}

output "ip" {
  value       = ["${aws_instance.ec2.private_ip}"]
}

在剧本中获取实例私有IP-

- hosts: localhost
  connection: local
  tasks:
    - debug: msg="MongoDB Node IP is - {{ hostvars[groups['tag_role_mongodb-node'][0]].inventory_hostname  }}"

现在使用TF null_resource-

运行剧本
resource null_resource "ansible_run" {

  triggers {
       ansible_file = "${sha1(file("${path.module}/${var.ansible_play}"))}"
      }
  provisioner "local-exec" {
    command = "ANSIBLE_HOST_KEY_CHECKING=False ansible-playbook -i ./ec2.py --private-key ${var.private_key} ${var.ansible_play}"
  }
}

您必须确保存在/导出与AWS相关的环境变量,以便能够获取AWS EC2元数据。另外,请确保ec2.py是可执行的。

如果要获取专用IP,请在ec2.ini-

中更改以下配置
destination_variable = private_ip_address
vpc_destination_variable = private_ip_address