运行Ansible 'debug' ad-hoc时,变量未定义

3
您能解释一下以下行为发生的原因吗?当我尝试使用以下playbook打印远程Ansible IP时,一切都符合预期:
---
- hosts: centos1
  tasks:
    - name: Print ip address
      debug:
        msg: "ip: {{ansible_all_ipv4_addresses[0]}}"

我尝试使用即席命令,但它无法工作:

ansible -i hosts centos1 -m debug -a 'msg={{ansible_all_ipv4_addresses[0]}}'

这里是临时错误:

centos1 | 失败! => { "msg": "该任务包含一个带有未定义变量的选项。错误是:'ansible_all_ipv4_addresses'未定义。'ansible_all_ipv4_addresses' 未定义。" }

我没有发现两种方法之间的任何区别,所以我希望它们都能工作并打印远程IP地址。

2个回答

2

我没有发现两种方法之间的任何区别,所以我希望它们都能工作并打印远程IP地址。

这是因为没有收集到任何事实。通过 ansible-playbook 并根据配置,自动收集 Ansible facts;而仅通过 ansible 和 ad-hoc 命令则不行。

要执行此操作,您需要使用 setup 模块。请参见Introduction to ad hoc commands - Gathering facts

更多 Q&A

请注意变量名称


您能给出一个示例,如何使用 setup 模块和 ad-hoc 方法输出 "Your IP address is "{{ ansible_all_ipv4_addresses[0] }}"?

示例

ansible test.example.com -m setup -a 'filter=ansible_all_ipv4_addresses'
test.example.com | SUCCESS => {
    "ansible_facts": {
        "ansible_all_ipv4_addresses": [
            "192.0.2.1"
        ]
    },
    "changed": false
}

或者

ansible test.example.com -m setup -a 'filter=ansible_default_ipv4'
test.example.com | SUCCESS => {
    "ansible_facts": {
        "ansible_default_ipv4": {
            "address": "192.0.2.1",
            "alias": "eth0",
            "broadcast": "192.0.2.255",
            "gateway": "192.0.2.0",
            "interface": "eth0",
            "macaddress": "00:00:5e:12:34:56",
            "mtu": 1500,
            "netmask": "255.255.255.0",
            "network": "192.0.2.0",
            "type": "ether"
        }
    },
    "changed": false
}

建议您在不使用筛选参数的情况下查看完整输出,以便熟悉结果集和数据结构。

文档


1
我认为这个句子中有些东西丢失了。文档中另一个有用的链接/句子是:默认情况下,Ansible 在每个 play 开始时收集 facts。请参考链接:https://docs.ansible.com/ansible/latest/playbook_guide/playbooks_vars_facts.html#disabling-facts - β.εηοιτ.βε
请问你能否举例说明如何使用setup模块的adhoc方法输出“您的IP地址是{{ansible_all_ipv4_addresses[0]}}”? - verb

1
如果您首先设置了ansible缓存插件,则可以运行使用收集到的事实的即席命令。请注意,第一个debug失败了,但在运行一次setup之后,现在debug开始工作。
$ export ANSIBLE_CACHE_PLUGIN=jsonfile
$ export ANSIBLE_CACHE_PLUGIN_CONNECTION=/tmp/ansible-cache
$ mkdir /tmp/ansible-cache

$ ansible myMachine -m debug -a 'msg={{ansible_all_ipv4_addresses[0]}}'
myMachine | FAILED! => {
    "msg": "The task includes an option with an undefined variable. The error was: 'ansible_all_ipv4_addresses' is undefined. 'ansible_all_ipv4_addresses' is undefined"
}

$ ansible myMachine -m setup
myMachine | SUCCESS => {
    "ansible_facts": {
...
}

$ ansible myMachine -m debug -a 'msg={{ansible_all_ipv4_addresses[0]}}'
myMachine | SUCCESS => {
    "msg": "10.50.1.1"
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接