Назад | Перейти на главную страницу

ansible: почему я не могу использовать {{ansible_facts ['ansible_distribution_release']}} в playbook

У меня есть доступная задача, запущенная на локальном хосте, например

  - name: add docker repository
    apt_repository:
      repo: "deb [arch=amd64] https://download.docker.com/linux/debian {{ ansible_facts['ansible_distribution_release'] }} stable"
      state: present
      filename: docker-ce

Я хочу использовать переменную ansible_facts['ansible_distribution_release'] чтобы получить имя дистрибутива ОС, в моем случае это должно быть buster. Но он сталкивается с такой ошибкой

"Задача включает параметр с неопределенной переменной. Ошибка заключалась в следующем: 'dict object' не имеет атрибута 'ansible_distribution_release'

Я пытался использовать {{ ansible_distribution_release }} напрямую, и это работает

repo: "deb [arch=amd64] https://download.docker.com/linux/debian {{ ansible_distribution_release }} stable"

Затем я подумал, что мне нужно обращаться только к фактам напрямую, а не к ним как к ключу переменной ansible_facts, но затем я прочитал официальный документ и увидел такие варианты использования, как

{{ ansible_facts['devices']['xvda']['model'] }}

Это заставляет меня подозревать, что я что-то не так понимаю в доступных переменных.

Я старался не цитировать ansible_distribution_release в [], т.е. ansible_facts[ansible_distribution_release], но без удачи

Я запускаю команду ниже

$ ansible localhost -m setup -a "filter=ansible_distribution_release"

localhost | SUCCESS => {
    "ansible_facts": {
        "ansible_distribution_release": "buster"
    },
    "changed": false
}

таким образом доказано, что атрибут с именем ansible_distribution_release под ansible_facts.

Любая помощь будет оценена по достоинству


udpate: я использую инструкции, показанные ниже

- name: debug                                                                                                                                                                                                      
  block:                                                                                                                                                                                                           
    - debug:                                                                                                                                                                                                       
        var: distribution_release                                                                                                                                                                        

    - debug:                                                                                                                                                                                                       
        var: ansible_distribution_release                                                                                                                                                                          

    - debug:                                                                                                                                                                                                       
        var: "{{ ansible_facts.keys() }}"                                                                                                                                                                          
  tags: show       

и узнать distribution_release не определен, ansible_distribution_release можно получить напрямую, но нет такого ключа, как ansible_distribution_release в ansible_facts, но там есть ключ с именем distribution_release. это отличие от выхода из

ansible localhost -m setup

в документах говорится

INJECT_FACTS_AS_VARS

Факты доступны внутри переменной ansible_facts, этот параметр также подталкивает их как свои собственные переменные в основном пространстве имен. В отличие от словаря ansible_facts, они будут иметь префикс ansible_.

Кажется, я могу получить доступ к фактам в основном пространстве без префикса ansible_

Взгляните на все переменные, доступные хосту (в данном случае localhost)

- hosts: localhost
  tasks:
    - debug:
        var: hostvars.localhost

Приведенные ниже задачи отладки эквивалентны

    - debug:
        msg: "{{ ansible_facts['distribution_release'] }}"
    - debug:
        msg: "{{ ansible_distribution_release }}"

Видеть Факты кеширования