Синтаксис для получения переменной с использованием другой переменной

Я пытаюсь найти UUID виртуальной машины на основе ее имени хоста. Я не уверен, чего здесь не хватает в моем синтаксисе, но я пробовал несколько разных методов. Вот образец учебника, с которым я работаю в настоящее время:

---

- name: Test taking snapshot by UUID
  hosts: tst000.company.com
  vars_files:
    - vars/credentials.yml

  tasks:
    - name: Gather all registered virtual machines
      vmware_vm_facts:
        hostname: 'vcenter.company.com'
        username: '{{ vcenter.username }}'
        password: '{{ vcenter.password }}'
        validate_certs: False
      delegate_to: localhost
      register: vmfacts

    - debug:
        var: vmfacts.virtual_machines.{{ ansible_facts['hostname'] }}.uuid

    - set_fact:
        vm_uuid: "{{ lookup('vars', 'vmfacts.virtual_machines.' + ansible_facts['hostname'] + '.uuid') }}"

Результаты следующие:

 Identity added: /opt/tmp/awx_2507_ithHYD/credential_3
 (/opt/tmp/awx_2507_ithHYD/credential_3) Vault password: 

 PLAY [Test taking snapshot by UUID]
 ********************************************


 TASK [Gathering Facts]
 ********************************************************* ok: [tst000.company.com]

 TASK [Gather all registered virtual machines]
 ********************************** ok: [tst000.company.com -> localhost]

 TASK [debug]
 ******************************************************************* ok: [tst000.company.com] => {
     "vmfacts.virtual_machines.tst000.uuid": "421d2491-8896-e52f-e4f5-5118687ce0e9" }

 TASK [set_fact]
 **************************************************************** fatal: [tst000.company.com]: FAILED! => {"msg": "The task
 includes an option with an undefined variable. The error was: No
 variable found with this name:
 vmfacts.virtual_machines.tst000.uuid\\n\\nThe error appears to
 have been in '/var/lib/awx/projects/quick-stuff/test_snapshot.yml':
 line 21, column 7, but may\\nbe elsewhere in the file depending on the
 exact syntax problem.\\n\\nThe offending line appears to be:\\n\\n\\n 
 - set_fact:\\n      ^ here\\n"}

 PLAY RECAP
 ********************************************************************* tst000.company.com : ok=3    changed=0    unreachable=0   
 failed=1

В модулях отладки и set_fact вы можете видеть, что ansible_facts ['hostname]' правильно помещает имя хоста по мере необходимости, однако он возвращает правильное значение в модуле отладки, но утверждает, что в модуле не найдена переменная с этим именем модуль set_fact. Я не уверен, что здесь не так с моим синтаксисом.


person Chris Hall    schedule 08.03.2019    source источник


Ответы (1)


Нет необходимости использовать lookup таким образом, поскольку vars и его hostvars друг фактически являются dicts:

- set_fact:
    vm_uuid: "{{ vmfacts.virtual_machines[ansible_facts['hostname']].uuid }}"
person mdaniel    schedule 08.03.2019
comment
Я тоже пробовал это форматирование. Похоже, это тоже не нравится. - person Chris Hall; 08.03.2019
comment
Можете ли вы опубликовать ошибку из этой версии, так как должно быть что-то, что я не замечаю - person mdaniel; 08.03.2019
comment
лишние одинарные кавычки были последующей попыткой получить другой результат. Без них ошибка была такая же - person Chris Hall; 14.03.2019
comment
Для любого, кто наткнется на это, ответ заключался в том, чтобы убрать ведущую ',' перед вложенной переменной в синтаксисе, как предложил Мэтью, но я пропустил. Он получил заслугу, но это важно! - person Chris Hall; 25.03.2019