1

我知道访问 Ansible 事实有据可查,但我无法让这段代码正常工作。

# site.yml
---
- name: get fact
  hosts: webservers

  tasks:
    - debug: msg="{{ hostvars['web01.example.com']['ansible_all_ipv4_addresses'] }}"
    - fail:

当我运行它时,我得到这个错误:

fatal: [web01.example.com] => One or more undefined variables: 'dict object' has no attribute 'ansible_all_ipv4_addresses'

然而,当我运行命令“ansible -i inventory -m setup”时,我确实看到了字典键:

web01.example.com | success >> {
    "ansible_facts": {
        "ansible_all_ipv4_addresses": [
            "<ip_address>"
        ],
        (other objects...)
    }
}

这是我的库存文件:

# inventory
[webservers]
web01.example.com ansible_host=<ip_address>

我也尝试了以下 hostvars 设置,但我得到了同样的错误:

hostvars['web01.example.com']['ansible_facts']['ansible_all_ipv4_addresses']

我在这里做错了什么?看起来这应该很容易。

4

2 回答 2

3

这与 ansible 有点混淆,但您只需使用(没有ansible_facts中间):

hostvars['web01.example.com']['ansible_all_ipv4_addresses']

或者正如@oley 发布的那样

hostvars[inventory_hostname]['ansible_all_ipv4_addresses']

对于任务中的相应主机

在您发布的文档中,它也总是没有ansible_facts在中间,但很容易忽略:)

于 2016-03-25T09:33:57.317 回答
0

这应该可以解决问题:

- debug: msg="{{ hostvars[inventory_hostname]['ansible_all_ipv4_addresses'] }}"
于 2016-03-24T22:53:28.777 回答