Yaml 如何以正确的方式将一个变量分配给Ansible中的另一个变量?

Yaml 如何以正确的方式将一个变量分配给Ansible中的另一个变量?,yaml,jinja2,ansible,ansible-playbook,Yaml,Jinja2,Ansible,Ansible Playbook,我在Ansible方面遇到了一个意想不到的问题。下面是一个简化的例子 我在groups\u vars/all文件中定义了一些全局变量,如下所示: --- node01: {ipv4_address: '10.10.10.1', some_info: data} 并在库存文件中这样使用: [physical-hosts] phyn01 node="{{ node01 }}" ansible_ssh_host="{{ node.ipv4_address }}" 有趣的是Ansible可以在每台主

我在Ansible方面遇到了一个意想不到的问题。下面是一个简化的例子

我在groups\u 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时,我无法获得每个主机的'node'变量的值(我在那里有额外的数据)

工作示例:

- 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"
}
它报告了以下错误答案:

- 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"
}
总结:

  • 我需要访问组中每个主机的“一些_数据”,而无需为每个主机单独重新定义相同的变量(大量代码重复=>大量错误)
  • 正如你们从例子中看到的,我希望它工作的方式似乎很清楚。当我们连接到主机(ansible_ssh_主机正确解析)并且单个“var=node”也正确解析时,它就会工作。事实当然会被传递
  • 只有当我尝试获取整个组的数据时,这种方法才起作用,而且似乎我使用了一些错误的语法 因此,问题是:

  • 如何为每个主机获取“一些数据”?
  • 如何正确定义host=hostN?我需要使用与node相同的结构。每个主机都有一些数据,每次我都必须定义ansible\u ssh\u host,因为相同的主机可能位于不同的组中(具有不同的数据)
  • 谢谢关注


    upd:我是凭记忆写的,所以有很多打字错误。现在,对于第3点或您的第一个问题,输出和输入错误是真实和固定的:为了访问组中的主机数据,您可以使用hostvars,首先必须为所有主机或感兴趣的组创建一个任务。例如,一个简单的内部角色可以在所有主机上做一些琐碎的事情。然后,此角色强制收集所有主机上的事实,并将每个主机添加到hostvars组。请记住启用“收集事实”,而不是限制您的剧本运行或未完成此角色/任务的标记。此外,如果您的变量不是简单的变量,比如列表或dict,那么最好将它们放在宿主变量文件中

    在列表中已经讨论过:

    我不明白你的第二个问题,你的库存很好