ansible:为什么我不能在剧本中使用 {{ ansible_facts['ansible_distribution_release'] }}

ansible:为什么我不能在剧本中使用 {{ ansible_facts['ansible_distribution_release'] }}

我有这样的本地主机上运行的 ansible 任务

  - 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 变量的理解有问题

我尝试过不引用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

任何帮助将不胜感激


更新:我使用下面的说明

- 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_releaseansible_facts 中那样的键,但有一个名为的键distribution_release。这与来自的输出不同

ansible localhost -m setup

文件称

注入事实_AS_VARS

事实在 ansible_facts 变量中可用,此设置还将它们作为自己的变量推送到主命名空间中。与 ansible_facts 字典不同,它们将具有 ansible_ 前缀。

看来我可以在不使用 ansible_ 前缀的情况下访问主空间中的事实

答案1

查看主机可用的所有变量(本例中为 localhost)

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

以下调试任务是等效的

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

缓存事实

相关内容