468просмотров
4 августа 2025 г.
Score: 515
Оч долго строил мостики между terraform и ansible путем отрисовки шаблона инвентаря из terraform. Наконец-то решил опробовать cloud.terraform - коллекция плагинов, которая умеет парсить tfstate файлы и собирать инвентарь динамически. Работаю я с Yandex.Cloud и из коробки, очевидно, оно не поддерживается. Документация... не полная. Компенсируется тем, что исходники понятные. Примерный сетап: ansible.cfg:
[defaults]
inventory = ./inventory/terraform_state.yml
private_key_file = ../internal/ctf_master_key
host_key_checking = False [ssh_connection]
ssh_args = -F ./ssh_config inventory/terraform_state.yml:
plugin: cloud.terraform.terraform_state
backend_type: local
backend_config: path: /home/ne_bknn/absolute/path/to/terraform/terraform.tfstate
search_child_modules: true
strict: true
hostnames: - name
compose: ansible_host: >- network_interface[0].nat_ip_address if (network_interface is defined and network_interface|length > 0 and network_interface[0].nat_ip_address) else network_interface[0].ip_address
provider_mapping: - provider_name: "registry.terraform.io/yandex-cloud/yandex" types: - yandex_compute_instance
keyed_groups: - key: labels["type"] Используем cloud.terraform.terraform_state - там еще есть cloud.terraform.terraform_provider, но для него нужно в терраформ-сущности впихивать ansible_host/ansible_group. Путь до tfstate абсолютный, strict режим лучше не выключать (будете ловить баги на протяжении получаса и не понимать, почему). compose - композитные переменные из переменных, которые terraform сохранил в tfstate, описываемые как jinja2-экспрешны. keyed_groups позволяют делать ансибловые группы. Название файла должно матчится .*terraform_state.ya?ml, иначе плагин его проскипает. labels["type"] - лейблы ресурса yandex_compute_instance. После часика бодания свою задачу выполняет. Минус вижу один - ну пипяо долго работает: ❯ time ansible-inventory --graph @all: |--@ungrouped: |--@_group1: | |--jump | |--vm1_internal |--@_group2: | |--vm2_internal | |--vm3_internal
ansible-inventory --graph 1.51s user 0.52s system 17% cpu 11.485 total К тому же результаты не кешируются. Пока не знаю, лучше ли, чем рендерить YAML-инвентарь.