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

标签 yaml jinja2 ansible

我在使用 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 并获取事实。但是在执行剧本时我无法获得每个主机的“节点”变量的值(我在那里有额外的数据)。

工作示例:

- 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"
}

总结:

  1. 我需要访问组中每个主机的“some_data”,而无需为每个主机分别重新定义相同的变量(大量代码重复 => 大量错误)
  2. 正如您从示例中看到的那样,我希望它工作的方式似乎很清楚。当我们连接到主机(ansible_ssh_host 正确解析)并且单个“var=node”也正确解析时,它会起作用。当然会提供事实。
  3. 只有当我尝试为整个组获取此数据时,这种方法才行不通,而且似乎我使用了一些错误的语法。

所以问题是:

  1. 如何为每个主机获取“some_data”?
  2. 如何以正确的方式定义 host=hostN?我需要为每个主机使用与 node.some_data 相同的结构,并且每次都必须定义 ansible_ssh_host,因为相同的主机可能位于不同的位置组(具有不同的数据)。

感谢关注

upd:我是凭内存写的,所以有很多打字错误。现在输出和拼写错误是真实的和固定的

最佳答案

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

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

不明白你的第二个问题,你的库存工作正常。

关于yaml - 如何以正确的方式将变量分配给 Ansible 中的另一个变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26247107/

相关文章:

testing - 适用于 odoo 的自动化测试工具

Python Flask jinja2 模板变量上下文。无法渲染变量

ansible - Ansible 模块如何返回事实

Ansible 无法识别 Shell "|&"语法

Ansible 循环遍历 glob

php - 在 Symfony2 中,validation.yml 文件可以使用导入拆分成多个文件吗?

parsing - 缩进解析器示例

python - 使用 Python 中的服务帐户创建 DfpClient

jinja2 过滤器中的正则表达式匹配(用于 saltstack)

templates - 为什么 Flask/OpenShift 下的 trim_blocks 和 lstrip_blocks 在在线测试时会产生不同的结果,而在本地测试时会产生不同的结果?