mongodb - 检索 Auto Scaling 组实例 ip 并将其提供给 ansible
问题描述
我目前正在开发 terraform 脚本和 ansible 角色,以便使用复制安装 mongodb。我正在使用自动缩放组,我需要将 ec2 实例私有 ip 作为额外的变量传递给 ansible。有什么办法吗?
当涉及到 rs.initiate() 时,是否有任何方法可以在 terraform 创建实例时将 ec2 私有 ip 添加到 mongo 集群。
解决方案
不太确定它是如何在 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
推荐阅读
- mongodb - NestJS TypeORM MongoDB 无法使用 find 或 FindOne 搜索存储库
- xamarin - Xamarin swipeview,当你再次滑动时,它会返回到最后的位置。这是什么?
- c# - Web 应用程序的可视化 UI 设计器?
- scala - Scala Slick 用户定义的密钥生成序列
- javascript - 更新对象 Javascript 中的单个字段
- javascript - JS编辑CSS像素值
- python - 如何以 Python 方式测试是否在 Python 中使用某个参数调用函数?
- html - 如何在 CSS 中定位圆形图像?
- php - 如何解决未捕获的类型错误:PHP 中不支持的操作数类型....
- reverse-engineering - 将函数符号从 symtab 导出到 dynsym