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

Posted

技术标签:

【中文标题】如何以正确的方式将变量分配给 Ansible 中的另一个变量?【英文标题】:How to assign a variable to another variables in Ansible in a correct way? 【发布时间】: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:我是凭记忆写的,所以有很多错字。现在输出和错别字是真实且固定的

【问题讨论】:

【参考方案1】:

对于第 3 点,或者您的第一个问题:为了访问组中的主机数据,您可以使用 hostvars,您首先必须为所有主机或感兴趣的组创建一个任务。例如,在所有主机上简单地做琐碎事情的内部角色。然后,此角色强制收集所有主机上的事实并将每个主机添加到 hostvars 组。请记住启用收集事实,而不是限制您的剧本运行或错过此角色/任务的标记。此外,如果您的 var 不是简单的 var,例如列表或 dicts,最好将它们放入 host_vars 文件。

之前已经在列表中讨论过: https://groups.google.com/forum/#!msg/Ansible-project/f90Y4T4SJfQ/L1YomumcPEQJ

没听懂您的第二个问题,您的库存工作正常。

【讨论】:

以上是关于如何以正确的方式将变量分配给 Ansible 中的另一个变量?的主要内容,如果未能解决你的问题,请参考以下文章

为啥将列表元素分配给变量在这里以不同的方式工作?

调试器中的表达式显示正确的计算值,但分配给变量时值被四舍五入

有没有办法使用ansible将活动目录中的用户分配给多个组?

以编程方式将位置分配给android中的按钮

将 Terraform 变量中的数字传递给 Ansible Playbook

将变量分配给python文本文件中的数据集