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

时间:2014-10-07 23:51:02

标签: yaml jinja2 ansible ansible-playbook

我遇到了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时我无法获得每个主机的'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"
}

要点:

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

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

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

1 个答案:

答案 0 :(得分:0)

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

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

没有理解你的第二个问题,你的库存工作正常。