我目前正在开发terraform脚本和ansible角色,以便通过复制安装mongodb。我正在使用自动缩放组,我需要将ec2实例私有ip作为额外的变量传递给ansible。有什么办法吗?
谈到rs.initiate()时,有什么方法可以在Terraform创建实例时将ec2私有IP添加到mongo集群中。
答案 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