首页 > 解决方案 > 检索 Auto Scaling 组实例 ip 并将其提供给 ansible

问题描述

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

当涉及到 rs.initiate() 时,是否有任何方法可以在 terraform 创建实例时将 ec2 私有 ip 添加到 mongo 集群。

标签: mongodbansibleterraform

解决方案


不太确定它是如何在 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}"]
}

在 playbook 中获取实例私有 IP -

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

现在使用 TF 运行 playbook 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 相关的环境变量,以便 ansible 获取 AWS EC2 元数据。还要确保ec2.py是可执行的。

如果要获取私有 IP,请更改以下配置ec2.ini-

destination_variable = private_ip_address
vpc_destination_variable = private_ip_address

推荐阅读