我对Ansible有一个非常奇怪的问题。我的剧本有一个需要的任务
行:"主持所有postgres {{hostvars [item [' ansible_default_ipv4'] ['地址']
在lineinfile操作中。如果在没有--limit = one_host的情况下调用它,它会完美运行,但如果我指定--limit = one_host,则当它执行此任务时,该剧本会抛出错误{" msg":"该任务包括一个带有未定义变量的选项。错误是:' dict object'没有属性' ansible_default_ipv4']
另外,我可以运行:ansible -i environments / sandbox all -m setup --limit = one_host | grep -A 10 ansible_default_ipv4
并查看该剧本需要的数据结构。那么,为什么Ansible说它不存在?
杰
答案 0 :(得分:1)
ansible_default_ipv4
在事实收集阶段计算,但仅在播放目标主机上计算。通过将playbook限制为“one_host'”,不会为其他主机计算此变量,并且正如使用hostvars[item]['ansible_default_ipv4']
所建议的那样,您正尝试为其他主机访问该变量。
这是--limit
选项的缺点。
解决方案是明确使用setup
模块(事实收集中自动使用的模块),在获取此变量所需的所有主机上的循环中,与delegate_to
结合使用和delegate_facts
(您也可以使用模块的filter
选项仅计算' default_ipv4'而不是所有事实。)