如何使用Ansible playbook在MongoDB数据库中使用动态库存访问主机的变量?

时间:2017-02-21 04:48:23

标签: mongodb ansible ansible-inventory

我正在尝试使用MongoDB中存储的信息生成初始配置。我正在使用Ansible的动态库存功能。后端是一个简单的mongodb数据库。手动运行function todoList() { var item = document.getElementById('todoInput').value; var text = document.createTextNode(item); var checkbox = document.createElement('input'); checkbox.type = "checkbox"; checkbox.name = "name"; checkbox.value = "value"; var newItem = document.createElement("div"); newItem.appendChild(checkbox); newItem.appendChild(text); document.getElementById("todoList").appendChild(newItem) }时,它会根据Ansible的要求以JSON形式返回组及其变量/子项。使用<!DOCTYPE html> <html> <body> <form id="todoForm"> <h1>To Do List:<h1> <input id="todoInput"> <button type="button" onclick="todoList()">Add Item</button> </form> <div id="todoList"> </div> </body> </html>参数也可以毫无问题地返回主机及其变量。但是,在尝试访问Ansible playbook中的变量(例如ansible_fetch_mongodb.py --list--host <hostname>)时,会出错并告诉我item.hostname未定义。我正在使用item.var2命令来运行它。我已经在这个问题上工作了几个小时,非常感谢任何有关从动态源访问变量的正确语法的帮助。

这是剧本:

item.hostname

以下是MongoDB中表示的主机:

ansible-playbook build_configs.yml -v -i ansible_fetch_mongodb.py

以下是MongoDB中表示的组:

- 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

这是错误:

  

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

     

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

1 个答案:

答案 0 :(得分:1)

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

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

- debug:
    var: hostvars[item].data1_svi_ip
  with_inventory_hostnames: all