1

我正在尝试使用存储在 MongoDB 中的信息生成初始配置。我正在使用 Ansible 的动态库存功能。后端是一个简单的 mongodb 数据库。手动运行时ansible_fetch_mongodb.py --list,它会根据 Ansible 的要求以 JSON 格式返回组及其变量/子项。使用该--host <hostname>参数还可以毫无问题地返回主机及其变量。但是,当尝试访问变量时,例如item.hostname,或item.var2在 Ansible 剧本中,它会出错并告诉我item.hostname未定义。我正在使用ansible-playbook build_configs.yml -v -i ansible_fetch_mongodb.py命令来运行它。我已经在这个问题上工作了几个小时,非常感谢任何有关从动态源访问变量的正确语法的帮助。

这是剧本:

- hosts: localhost 
  tasks:
  - name: configuration generator 
    template: 
      src=roles/core_router/templates/3850.j2
      dest=/etc/ansible/generated_templates/{{ item }}.txt
    with_inventory_hostnames: all
  - debug: msg="{{ item.data1_svi_ip }}"
    with_inventory_hostnames: all

这是 MongoDB 中表示的主机:

{
    "_id": "ROUTER123",
    "hostname": "ROUTER123",
    "vars": {
        "data1_svi_ip": "10.19.83.254 255.255.254.0",
        "device_num": "01",
        "device_type": "Router",
        "floor": "04",
        "grp_ip": "10.19.93.14 255.255.255.240",
        "mgmt_net": "10.19.103.254 255.255.254.0",
        "model": "3850",
    }
}

以下是 MongoDB 中表示的组:

{
    "_id": "Router",
    "children": [],
    "hosts": [
        "Router123",
    ],
    "name": "Router",
    "vars": {}
}

这是错误:

任务[调试] ********************************************** ****************************************************** ****************************************************** **************

致命的:[本地主机]:失败!=> {"failed": true, "msg": "字段 'args' 的值无效,似乎包含一个未定义的变量。错误是:'ansible.vars.unsafe_proxy.AnsibleUnsafeText object' has no属性“data1_svi_ip”\n\n错误似乎出现在“/etc/ansible/build_configs.yml”中:第 8 行第 5 列,但可能\n在文件中的其他位置,具体取决于确切的语法问题。\n\n违规行似乎是:\n\n with_inventory_hostnames: all\n - debug: msg=\"{{ item.data1_svi_ip }}\"\n ^ here\n我们可能错了,但这个看起来可能是出现\n缺少引号的问题。总是在模板表达式括号\n开始一个值时加上引号。例如:\n\n with_items:\n - {{ foo }}\n\n应该写成:

4

1 回答 1

1

with_inventory_hostnames查找插件返回主机的名称。它们是字符串,而不是对象,因此 Ansible 报告:no attribute 'data1_svi_ip'.

要访问主机变量,您需要使用:

- debug:
    var: hostvars[item].data1_svi_ip
  with_inventory_hostnames: all
于 2017-02-21T05:32:17.497 回答