【发布时间】:2014-12-02 12:50:54
【问题描述】:
我在使用 Ansible 时遇到了一个意想不到的问题。这是简化的示例。
我在 groups_vars/all 文件中定义了一些全局变量,如下所示:
---
node01: {ipv4_address: '10.10.10.1', some_info: data}
并在库存文件中像这样使用它:
[physical-hosts]
phyn01 node="{{ node01 }}" ansible_ssh_host="{{ node.ipv4_address }}"
有趣的是,Ansible 可以在每个主机上 ssh 并获取事实。但是在执行 playbook 时我无法获取每个主机的“节点”变量的值(我那里有其他数据)。
工作示例:
- hosts: physical-hosts
tasks:
- name: get node variable for current host
debug: var=node
这种情况下的输出是:
TASK: [get node variable for current host] ************************************
ok: [phyn01] => {
"node": {
"ipv4_address": "10.10.10.1",
"some_info": "data"
}
}
但如果我使用以下内容,我将无法获得相同的结果:
- hosts: physical-hosts
tasks:
- debug: var=hostvars.{{item}}.node
with_items: groups['physical-hosts']
它报告以下错误答案:
TASK: [debug var=hostvars.{{item}}.node] **************************************
ok: [phyn01] => (item=phyn01) => {
"hostvars.phyn01.node": "{{ node01 }}",
"item": "phyn01"
}
总结:
- 我需要访问组中每个主机的“some_data”,而无需为每个主机单独重新定义相同的变量(大量代码重复 => 大量错误)
- 从示例中可以看出,我希望它工作的方式似乎很明确。当我们连接到主机时它会起作用(ansible_ssh_host 正确解析)并且单个 'var=node' 也正确解析。事实当然会传达。
- 只有当我尝试获取整个组的这些数据并且似乎我使用了一些错误的语法时,这种方式才有效。
所以问题是:
- 如何获取每个主机的“some_data”?
- 如何以正确的方式定义 host=hostN? 我需要为每个主机使用与 node.some_data 相同的结构,并且我必须每次都定义 ansible_ssh_host 因为相同的主机可能在不同的组中(使用不同的数据)。
感谢关注
upd:我是凭记忆写的,所以有很多错字。现在输出和错别字是真实且固定的
【问题讨论】:
标签: yaml jinja2 ansible ansible-playbook