azure - Terraform local-exec Provisioner 在多个 Azure 虚拟机上运行
问题描述
我有一个有效的 TF 设置来在 Azure 中启动多个 Linux VM。我在 null_resource 中运行 local-exec 配置程序来执行 Ansible 剧本。我正在从 TF 状态文件中提取私有 IP 地址。状态文件存储在本地。
我最近配置了 Azure 后端,现在状态文件存储在存储帐户中。
我已经修改了本地配置器,并试图获取所有私有 IP 地址来运行 Ansible 剧本,如下所示:
resource "null_resource" "Ansible4Ubuntu" {
provisioner "local-exec" {
command = "sleep 20;ansible-playbook -i '${element(azurerm_network_interface.unic.*.private_ip_address, count.index)}', vmlinux-playbook.yml"
我也试过:
resource "null_resource" "Ansible4Ubuntu" {
provisioner "local-exec" {
command = "sleep 20;ansible-playbook -i '${azurerm_network_interface.unic.private_ip_address}', vmlinux-playbook.yml"
它们都只适用于第一个 VM,而忽略了其余部分。我也尝试过count.index+1 and self.private_ip_address
,但没有运气。
实际结果:TF 仅将第一个 VM 的私有 IP 提供给 Ansible。
预期结果:TF 向 Ansible 提供所有私有 IP 的列表,以便它可以针对所有这些运行 playbook。
PS:我也在考虑使用 TF 的 remote_state 数据结构,但状态文件似乎也包含以前构建的 IP,因此很难提取适合当前构建的 IP。
我将不胜感激任何帮助。
谢谢阿斯加尔
解决方案
正如马特所说,null_resource 只运行一次,所以它在第一个虚拟机上工作得很好,而忽略了其余的。您需要使用 NIC 列表为 null_resource 配置触发器,以使其多次运行。示例代码如下:
resource "null_resource" "Ansible4Ubuntu" {
triggers = {
network_interface_ids = "${join(",", azurerm_network_interface.unic.*.id)}"
}
provisioner "local-exec" {
command = "sleep 20;ansible-playbook -i '${join(" ", azurerm_network_interface.unic.*.private_ip_address)}, vmlinux-playbook.yml"
}
}
您可以根据需要更改其中的某些内容。有关信息,请参阅null_resource。
推荐阅读
- java - 如何在 Java 中验证从 Azure AD B2C 生成的 JWT 令牌?
- javascript - 如何使用 vanilla JS 向页面上的项目添加“加载更多”功能?
- ssl - 是否建议禁用 ssl 验证而不是在生产中提供 ca 证书?
- centos7 - 为转发的邮件重写外发邮件的标题
- mips - 在 MIPS 中交换字节
- android - 防止同时执行两个挂起函数的一部分
- python - 使用 Kivy 向小部件添加触摸事件/单击功能时出现问题
- javascript - 我在 Visual Studio Code 中遇到 javascript 格式问题
- python - 通过 Matplotlib 遇到分段错误错误
- r - 查找内存泄漏(不断增加的价值)