2017-02-21 6 views
0

Я пытаюсь создать исходные конфигурации, используя информацию, хранящуюся в MongoDB. Я использую функцию динамической инвентаризации с помощью Ansible. Бэкэнд - простая база данных mongodb. При ручном запуске ansible_fetch_mongodb.py --list он возвращает группы и их переменные/дочерние элементы в JSON согласно требованиям Ansible. Использование аргумента --host <hostname> также возвращает хосты и их переменные без проблем. Однако, пытаясь получить доступ к переменным, скажем item.hostname или item.var2 в прослушиваемой книге Ansible, это приводит к ошибкам и говорит мне, что item.hostname не определен. Я использую команду ansible-playbook build_configs.yml -v -i ansible_fetch_mongodb.py, чтобы запустить все это. Я много часов работал над этой проблемой, и любая помощь с правильным синтаксисом для доступа к переменным из динамического источника очень ценится.Как получить доступ к переменным хоста с использованием динамических ресурсов в базе данных MongoDB с помощью Ansible playbook?

Вот пьес:

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

Здесь ошибка :

TASK [debug] ****************************************************************************************************************************************************************

fatal: [localhost]: FAILED! => {"failed": true, "msg": "the field 'args' has an invalid value, which appears to include a variable that is undefined. The error was: 'ansible.vars.unsafe_proxy.AnsibleUnsafeText object' has no attribute 'data1_svi_ip'\n\nThe error appears to have been in '/etc/ansible/build_configs.yml': line 8, column 5, but may\nbe elsewhere in the file depending on the exact syntax problem.\n\nThe offending line appears to be:\n\n with_inventory_hostnames: all\n - debug: msg=\"{{ item.data1_svi_ip }}\"\n ^here\nWe could be wrong, but this one looks like it might be an issue with\nmissing quotes. Always quote template expression brackets when they\nstart a value. For instance:\n\n with_items:\n - {{ foo }}\n\nShould be written as:\n\n with_items:\n - \"{{ foo }}\"\n"}

ответ

1

with_inventory_hostnames плагин lookup возвращает имена хостов. Они являются строками, а не объектами, поэтому Ansible reports: no attribute 'data1_svi_ip'.

Чтобы получить доступ к переменным хоста, вам необходимо использовать:

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

Это похоже на то, что я искал. Спасибо, techraf! –

+0

Ницца! Я еще этого не знал. Большое спасибо! –

Смежные вопросы