我有这样的本地主机上运行的 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_release
ansible_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 }}"
看缓存事实