2016-12-14 9 views
1

Я интегрирую Ansible с Python и MySQL DB. Часть моего варианта использования заключается в том, что, учитывая имя группы для Ansible, отправьте это имя группы на python, который читает db, и возвращает список IP-адресов, соответствующих этому имени группы. Для теста я хочу выполнить ping возвращенные IP-адреса.Динамическое присвоение атрибута hosts в Ansible from Python

Вот мой сборник пьесы для достижения того же:

name: run a cmd 
hosts: localhost 
connection: local 
tasks: 
    name: runs a python script with a parameter 
     shell: python /pythonScripts/AnsibleDBRead.py <someGroupName> 
     register: py_ret 
    - set_fact: 
     ip_list: "{{py_ret.stdout}}" 
    - debug: var=hostvars['localhost']['ip_list'] # option to set messages here as well but not both together 


name: png the hosts returned 
hosts: hostvars['localhost']['ip_list'] #this does not work 
#hosts: [ "127.0.0.1", "54.147.177.9"] #this works same value but hardcoded 
tasks: 
    - debug: var=hostvars['localhost']['ip_list'] # able to print the value 

Я пытаюсь установить значение, хранящееся в ip_list как hosts: для второй игры, но без какого-либо успеха. Ошибка, которую я получаю, не соответствует хостам. Вот результат, который прогоняется с компиляцией с жесткой кодировкой. Игнорируйте форматирование скрипта.

PLAY [run a cmd] *************************************************************** 

TASK [setup] ******************************************************************* 
ok: [localhost] 

TASK [runs a python script with a parameter] *********************************** 
changed: [localhost] 

TASK [set_fact] **************************************************************** 
ok: [localhost] 

TASK [debug] ******************************************************************* 
ok: [localhost] => { 
    "hostvars['localhost']['ip_list']": [ 
     "127.0.0.1", 
     "54.147.177.9" 
    ] 
} 

PLAY [png the hosts returned] ************************************************** 
skipping: no hosts matched 

PLAY RECAP ********************************************************************* 
localhost     : ok=4 changed=1 unreachable=0 failed=0 

от того, что я прочитал, я должен быть в состоянии получить доступ к переменной, объявленной в одной игре в другой игре, используя hostvars. Любая помощь приветствуется.

ответ

1

После некоторого тестирования проб и ошибок, я думаю, что это должно работать для вас:

- name: ping the hosts returned 
    hosts: "{{ hostvars['localhost']['ip_list'] | join(',') }}" 
    tasks: 
    - debug: 

И, кажется, это известная проблема: pass array as "hosts" in playbook #16051 и обходной путь.

+0

Спасибо! это сработало для меня. Не могли бы вы объяснить значение «join», поскольку значение, возвращаемое с python, уже было разделено запятой? – shshnk

+0

Вход 'ip_list' был разделен запятой, но был преобразован в объект списка, поэтому' ip_list' является объектом списка, 'ip_list ' join (',') 'преобразует его в строку. – techraf

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

  • Нет связанных вопросов^_^