Как в terraform, используя поставщика платформы Google, я могу получить информацию об экземпляре из экземпляра, созданного с помощью google_compute_region_instance_group? - PullRequest
0 голосов
/ 30 мая 2018

Я создаю файл terraform, чтобы я мог настроить некоторые виртуальные машины в GCP для создания своей собственной платформы Kubernetes (да, у Google есть свой собственный движок, но я хочу использовать некоторые пользовательские элементы).Я смог создать файл .tf, чтобы создать весь стек, как и другие настройки в проекте Kubespray.Что-то вроде того, что вы делаете для терраформирования виртуальных машин в AWS.

Последняя часть, которую мне нужно автоматизировать, - это создание файла хоста для Ansible.

Я создаю мастеров и рабочих, используя ресурс под названиемgoogle_compute_region_instance_group, который помещает каждый экземпляр в другой AZ в GCP.Теперь мне нужно получить имя хоста и 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, но он поддерживается только в типе ресурса, а не источника данных.Я также пробовал синтаксис сплат, и он не работал.

1 Ответ

0 голосов
/ 13 сентября 2018

Я не думаю, что создание инвентаризации вручную является правильным подходом, хотя это возможно.

Вы можете попробовать 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

...