From 9ee7222a0d550a7a835b62cfaed9864aea3d7ce5 Mon Sep 17 00:00:00 2001 From: Pavel Tishkov Date: Mon, 6 Jul 2026 10:00:59 +0300 Subject: [PATCH] fix(vm): read ansible-inventory host vars from the vars. annotation prefix The d8 v ansible-inventory command read host variables from the bare provisioning.virtualization.deckhouse.io/ prefix, while the virtualization-provisioner module reads them from the separate vars.provisioning.virtualization.deckhouse.io/ prefix. The same VM annotations produced different inventories depending on the tool. Read host variables from the vars. prefix to match the module. Groups still come from provisioning.virtualization.deckhouse.io/groups. Update the command help, usage examples and the ansible-inventory FAQ. Signed-off-by: Pavel Tishkov --- docs/FAQ.md | 2 +- docs/FAQ.ru.md | 2 +- .../cmd/ansibleinventory/ansibleinventory.go | 34 +++++++++---------- 3 files changed, 19 insertions(+), 19 deletions(-) diff --git a/docs/FAQ.md b/docs/FAQ.md index 90a1ba21e0..8bf6146ed5 100644 --- a/docs/FAQ.md +++ b/docs/FAQ.md @@ -808,7 +808,7 @@ The command includes only virtual machines with assigned IP addresses in the `Ru 1. Optionally set host variables via annotations (for example, the SSH user): ```bash - d8 k -n demo-app annotate vm frontend provisioning.virtualization.deckhouse.io/ansible_user="cloud" + d8 k -n demo-app annotate vm frontend vars.provisioning.virtualization.deckhouse.io/ansible_user="cloud" ``` 1. Run Ansible with a dynamically generated inventory: diff --git a/docs/FAQ.ru.md b/docs/FAQ.ru.md index fc9efdd69b..aa84fb823f 100644 --- a/docs/FAQ.ru.md +++ b/docs/FAQ.ru.md @@ -808,7 +808,7 @@ ansible -m shell -a "uptime" \ 1. При необходимости задайте переменные хоста через аннотации (например, пользователя для SSH): ```bash - d8 k -n demo-app annotate vm frontend provisioning.virtualization.deckhouse.io/ansible_user="cloud" + d8 k -n demo-app annotate vm frontend vars.provisioning.virtualization.deckhouse.io/ansible_user="cloud" ``` 1. Запустите Ansible с динамически сформированным инвентарём: diff --git a/src/cli/internal/cmd/ansibleinventory/ansibleinventory.go b/src/cli/internal/cmd/ansibleinventory/ansibleinventory.go index c9f51d270a..0f06faaa8e 100644 --- a/src/cli/internal/cmd/ansibleinventory/ansibleinventory.go +++ b/src/cli/internal/cmd/ansibleinventory/ansibleinventory.go @@ -36,6 +36,7 @@ import ( const ( annotationPrefix = "provisioning.virtualization.deckhouse.io/" groupsAnnotationKey = annotationPrefix + "groups" + varsAnnotationPrefix = "vars.provisioning.virtualization.deckhouse.io/" ansibleSSHCommonArgs = `-o ProxyCommand='d8 v port-forward --stdio=true %h %p'` ansibleSSHCommonArgsKey = "ansible_ssh_common_args" ) @@ -89,7 +90,7 @@ Arguments: Host names format: . (e.g., myvm.default) VM annotations: - - Annotations with prefix 'provisioning.virtualization.deckhouse.io/' are included + - Annotations with prefix 'vars.provisioning.virtualization.deckhouse.io/' are included as host variables (prefix is stripped from variable name) - Use 'provisioning.virtualization.deckhouse.io/groups' annotation to add VMs to groups (comma-separated list of group names) @@ -353,20 +354,19 @@ func (a *AnsibleInventory) getHostName(vm v1alpha2.VirtualMachine) string { func (a *AnsibleInventory) getHostVars(vm v1alpha2.VirtualMachine) map[string]string { hostVars := make(map[string]string) - // Add annotations as host variables - // Only process annotations with prefix provisioning.virtualization.deckhouse.io/ - if len(vm.Annotations) > 0 { - for key, value := range vm.Annotations { - if !strings.HasPrefix(key, annotationPrefix) { - continue - } - if key == groupsAnnotationKey { - continue - } - varName := strings.TrimPrefix(key, annotationPrefix) - if varName != "" { - hostVars[varName] = value - } + // Add annotations as host variables. + // Only annotations with the vars.provisioning.virtualization.deckhouse.io/ + // prefix become host variables; the prefix is stripped from the variable + // name. This matches the annotation scheme used by the virtualization-provisioner + // module, where groups live under provisioning.virtualization.deckhouse.io/groups + // and host variables live under the separate vars. prefix. + for key, value := range vm.Annotations { + if !strings.HasPrefix(key, varsAnnotationPrefix) { + continue + } + varName := strings.TrimPrefix(key, varsAnnotationPrefix) + if varName != "" { + hostVars[varName] = value } } @@ -464,8 +464,8 @@ func usage() string { # Add VM to groups (comma-separated): # kubectl annotate vm myvm provisioning.virtualization.deckhouse.io/groups="web,production" -n default # - # Add custom host variable: - # kubectl annotate vm myvm provisioning.virtualization.deckhouse.io/ansible_user="admin" -n default + # Add custom host variable (note the 'vars.' prefix): + # kubectl annotate vm myvm vars.provisioning.virtualization.deckhouse.io/ansible_user="admin" -n default # # This will be available as 'ansible_user' variable in Ansible # # Note: Only VMs with assigned IP addresses are included in the inventory.