[Документация Yandex Cloud](../../../index.md) > [Yandex Compute Cloud](../../index.md) > [Концепции](../index.md) > [Группы виртуальных машин](index.md) > Переменные в шаблоне виртуальной машины

# Переменные в шаблоне виртуальной машины

Instance Groups позволяет создать группу однотипных виртуальных машин из [шаблона](instance-template.md). Чтобы такие ВМ имели разные характеристики, используйте механизм подстановок системных и пользовательских переменных в шаблоне. Например, с помощью переменных и [тегов](policies/allocation-policy.md#tags) вы можете [создать группу ВМ с фиксированными IP-адресами](../../operations/instance-groups/create-with-fixed-ip.md).

_Системная переменная_ — значение, которое Instance Groups вычисляет во время создания ВМ и подставляет его в шаблон для дальнейшего использования.

_Пользовательская переменная_ — значение, которое Instance Groups берет из списка. Он заранее сформирован пользователем, переменные в нем описаны в формате `ключ:значение`.

## Поля, в которых поддерживаются переменные {#support-fields}

Шаблон ВМ описывается в YAML-файле с помощью ключа `instance_template`. Вы можете указать системные и пользовательские переменные вместо значений следующих полей шаблона:

* `instance_template.fqdn` — [FQDN](../../../glossary/fqdn.md) хоста.
* `instance_template.hostname` — имя хоста.
* `instance_template.metadata` — метаданные ВМ. Переменные можно использовать только в значениях ключей поля `metadata`.
* `instance_template.name` — имя ВМ.
* `instance_template.labels` — [метки](../../../resource-manager/concepts/labels.md) ВМ. Переменные можно использовать только в значениях ключей поля `labels`.
* `instance_template.boot_disk_spec.disk_id` — идентификатор загрузочного диска.
* `instance_template.boot_disk_spec.disk_spec.description` — описание загрузочного диска.
* `instance_template.boot_disk_spec.disk_spec.image_id` — идентификатор образа загрузочного диска.
* `instance_template.boot_disk_spec.disk_spec.snapshot_id` — идентификатор снимка загрузочного диска.
* `instance_template.boot_disk_spec.disk_spec.type_id` — тип загрузочного диска.
* `instance_template.network_interface_specs.primary_v4_address_spec.one_to_one_nat_spec.address` — конфигурация внешнего IP-адреса версии IPv4.
* `instance_template.network_interface_specs.primary_v6_address_spec.one_to_one_nat_spec.address` — конфигурация внешнего IP-адреса версии IPv6.
* `instance_template.placement_policy.placement_group_id` — идентификатор [группы размещения](../placement-groups.md).
* `instance_template.secondary_disk_specs.disk_id` — идентификатор дополнительного диска.
* `instance_template.secondary_disk_specs.disk_spec.description` — описание дополнительного диска.
* `instance_template.secondary_disk_specs.disk_spec.image_id` — идентификатор образа дополнительного диска.
* `instance_template.secondary_disk_specs.disk_spec.snapshot_id` — идентификатор снимка дополнительного диска.
* `instance_template.secondary_disk_specs.disk_spec.type_id` — тип дополнительного диска.

## Этапы подстановки переменных {#substitution-rules}

Instance Groups заменит системные и пользовательские переменные на значения в два этапа:

1. [Замена системных переменных на вычисленные значения](#first-stage).
1. [Замена пользовательских переменных на значения из списка](#second-stage).

Преобразование может быть составным. В этом случае значение, полученное на первом этапе, является переменной для второго этапа.

[Пример](#example) прохождения этапов подстановки описан ниже.

### Первый этап подстановки значений {#first-stage}

Instance Groups заменит на вычисленные значения только фиксированный список системных переменных:

Системная переменная | Описание | Возможные значения
--- | --- | ---
`{instance_group.id}` | Идентификатор группы ВМ. | Строковое значение, например `cl1cd2vd4ohr********`. Подробнее на странице [Получить информацию о группе ВМ](../../operations/instance-groups/get-info.md).
`{instance_group.labels.label_key}` | Значение [метки](../../../resource-manager/concepts/labels.md) группы ВМ с ключом `label_key`. | Строковое значение, например `label_value`. Подробнее на странице [Получить информацию о группе ВМ](../../operations/instance-groups/get-info.md).
`{instance.index}` | Уникальный номер ВМ в группе. | Значение от 1 до N, где N — количество ВМ в группе.  
`{instance.index_in_zone}` | Номер ВМ в зоне доступности. Уникален в рамках зоны для конкретной группы ВМ. | Значение от 1 до N, где N — количество ВМ в одной зоне доступности.
`{instance.labels.another_label_key}` | Значение метки конкретной ВМ с ключом `another_label_key`. | Строковое значение, например `another_label_value`. Подробнее на странице [Получить информацию о ВМ](../../operations/vm-info/get-info.md).
`{instance.short_id}` | Идентификатор ВМ, уникальный в рамках группы. | Строковое значение, состоящее из четырех латинских букв, например `ilum`.
`{instance.tag}` | Тег ВМ в группе внутри зоны доступности. | Значение, указанное в поле `allocation_policy.zones.instance_tags_pool`. Подробнее на странице [Политика распределения](policies/allocation-policy.md).
`{instance.zone_id}` | Идентификатор зоны доступности. | Значение, указанное в поле `allocation_policy.zones.zone_id`. Подробнее на странице [Политика распределения](policies/allocation-policy.md).

>Например, при создании группы ВМ Instance Groups присвоит группе идентификатор и подставит его вместо `{instance_group.id}` каждой ВМ.

### Второй этап подстановки значений {#second-stage}

Для того чтобы на этом этапе Instance Groups подставил значения, заранее сформируйте список пользовательских переменных в формате `ключ:значение`.

На данном этапе Instance Groups:

1. Сравнит переменные с ключами из пользовательского списка.
1. Проставит им значения, указанные в ключах.

## Преобразования переменных {#converting-rules}

Системные и пользовательские переменные указываются в качестве значений полей шаблона в фигурных скобках `{}`. Instance Groups преобразует их по указанным ниже правилам.

Значение поля в шаблоне | Значение поля</br>после преобразования | Описание преобразования
--- | --- | ---
`{заданный_ключ}` | `значение`  | Значение будет подставлено из заранее подготовленного списка.
`{неизвестный_ключ}` | `{неизвестный_ключ}` | Если указан ключ, который не поддерживается механизмом подстановок, Instance Groups не заменит его.
`{{заданный_ключ}}` | `{заданный_ключ}` | На первом этапе внутренний уровень скобок будет раскрыт.
`{{неизвестный_ключ}}` | `{{неизвестный_ключ}}` | Ключ, который не поддерживается механизмом подстановок, не изменится.

## Пример прохождения этапов подстановки {#example}

1. В шаблоне ВМ указаны:

   * Список пользовательских переменных в формате `ключ:значение` в блоке `variables`.
   * Системные и пользовательские переменные в [допустимых](#support-fields) полях:
     * в поле `instance_template.name` указаны пользовательская переменная `{short_zone_var_{instance.zone_id}}` и системная — `{instance.index}`;
     * в поле `instance_template.hostname` указана системная переменная `{instance.index}`.

   ```yaml
   ...
   variables:
     - key: short_zone_var_kz1-a
       value: rc1a
     - key: short_zone_var_kz1-b
       value: rc1b
     - key: short_zone_var_kz1-d
       value: rc1d
   instance_template:
     name: production-{short_zone_var_{instance.zone_id}}-{instance.index}
     hostname: production-{instance.index}
     platform_id: standard-v3
   ...
   ```

1. На первом этапе Instance Groups заменит [системные переменные](#first-stage) на вычисленные значения.

   ```yaml
   ...
   variables:
     - key: short_zone_var_kz1-a
       value: rc1a
     - key: short_zone_var_kz1-b
       value: rc1b
     - key: short_zone_var_kz1-d
       value: rc1d
   instance_template:
     name: production-{short_zone_var_kz1-a}-1
     hostname: production-1
     platform_id: standard-v3
   ...
   ```

   Где:

   * В поле `instance_template.name`:
     * переменная `{short_zone_var_{instance.zone_id}}` будет преобразована в переменную `{short_zone_var_kz1-a}`;
     * системная переменная `{instance.index}` будет преобразована в индекс `1`.
   * В поле `instance_template.hostname` системная переменная `{instance.index}` будет преобразована в индекс `1`.

1. На втором этапе Instance Groups преобразует полученные переменные в значения из списка в блоке `variables`:

   ```yaml
   ...
   variables:
     - key: short_zone_var_kz1-a
       value: rc1a
     - key: short_zone_var_kz1-b
       value: rc1b
     - key: short_zone_var_kz1-d
       value: rc1d
   instance_template:
     name: production-rc1a-1
     hostname: production-1
     platform_id: standard-v3
   ...
   ```

   В поле `instance_template.name`: переменная `{short_zone_var_kz1-a}` будет преобразована в значение `rc1a`.

### Полезные ссылки {#see-also}

* [Спецификация группы виртуальных машин в формате YAML](specification.md)
* [Шаблон виртуальной машины](instance-template.md)
* [Создать группу виртуальных машин с фиксированными IP-адресами](../../operations/instance-groups/create-with-fixed-ip.md)
* [Переменные в шаблоне узла Yandex Managed Service for Kubernetes](../../../managed-kubernetes/concepts/node-group/variables-in-the-template.md)