-1

我正在创建一个 terraform 文件,这样我就可以在 GCP 中设置一些虚拟机来构建我自己的 Kubernetes 平台(是的,谷歌有自己的引擎,但我想使用一些自定义项)。我已经能够创建 .tf 文件来创建整个堆栈,就像 Kubespray 项目中的其他设置一样。就像您在 AWS 上对虚拟机进行地形改造一样。

我需要自动化的最后一部分是为 Ansible 创建主机文件。

我使用名为的资源创建 Masters 和 Worker,该资源google_compute_region_instance_group将每个实例放置在 GCP 中的不同 AZ 中。现在我需要获取这些实例的主机名和 IP。我遇到的问题是它们是动态创建的资源。因此,为了提取这些信息,我使用数据源来获取信息。

这就是我现在所拥有的。

data.google_compute_region_instance_group.data_masters.instances
[
  {
    "instance" = "https://www.googleapis.com/compute/v1/projects/appportablityphase2/zones/us-east1-c/instances/k8-masters-4r2f"
    "named_ports" = []
    "status" = "RUNNING"
  },
  {
    "instance" = "https://www.googleapis.com/compute/v1/projects/appportablityphase2/zones/us-east1-d/instances/k8-masters-qh64"
    "named_ports" = []
    "status" = "RUNNING"
  },
  {
    "instance" = "https://www.googleapis.com/compute/v1/projects/appportablityphase2/zones/us-east1-b/instances/k8-masters-w9c8"
    "named_ports" = []
    "status" = "RUNNING"
  },
]

如您所见,输出是列表和地图的混合。我可以通过这条线获得实例自我 url。

lookup(data.google_compute_region_instance_group.data_masters.instances[0], "instance")

https://www.googleapis.com/compute/v1/projects/appportablityphase2/zones/us-east1-c/instances/k8-masters-4r2f

然后我可以拆分并获取实例名称。这是我无法用 Terraform 弄清楚的难点。在上面的行中我必须使用[0]来调用实例信息。然后我需要遍历所有可能超过 3 或 3 个的实例。

我找不到使用这种数据源类型的方法。我试过 count.index 但它只支持资源类型而不是数据源。我也尝试过 splat 语法,但没有奏效。

4

1 回答 1

0

我不认为手动生成库存是正确的方法,尽管它是可能的。

您可以尝试 GCP Dynamic Inventory,它根据网络标签从正在运行的实例生成清单。

例如,实例 A 有标签 foo,实例 B 有标签 foo 和 bar,生成的库存将是:

[tag_foo]
A
B

[tag_bar]
B

脚本可在此地址获得:https ://github.com/ansible/ansible/blob/devel/contrib/inventory/gce.py

此处的配置文件:https ://github.com/ansible/ansible/blob/devel/contrib/inventory/gce.ini

用法是ansible-playbook -i gce.py site.yml

于 2018-09-13T14:16:50.977 回答