2015-05-27 2 views
2

Я пытаюсь сделать Ansible's Python API, чтобы написать тестовый API (в Python), который может программно использовать программное обеспечение и добавлять новые узлы в кластер Hadoop. Как известно, по крайней мере узел в кластере должен быть Namenode и JobTracker (MRv1). Для простоты, скажем, JobTracker и Namenode находятся в одном и том же узле (namenode_ip).Передача значений динамически в Ansible inventory - Python

Таким образом, для того, чтобы использовать Ansible, чтобы создать новый узел, и он самостоятельно зарегистрирован в Namenode я создал эту следующую Python утилиту:

from ansible.playbook import PlayBook                             
from ansible.inventory import Inventory                            
from ansible.inventory import Group                             
from ansible.inventory import Host                             
from ansible import constants as C                             
from ansible import callbacks                               
from ansible import utils                                

import os                                    
import logging                                  
import config 

def run_playbook(ipaddress, namenode_ip, playbook, keyfile):                                          
     utils.VERBOSITY = 0                                
     playbook_cb = callbacks.PlaybookCallbacks(verbose=utils.VERBOSITY)                    
     stats = callbacks.AggregateStats()                            
     runner_cb = callbacks.PlaybookRunnerCallbacks(stats, verbose=utils.VERBOSITY)                  

     host = Host(name=ipaddress)                              
     group = Group(name="new-nodes")                             
     group.add_host(host)                                
     inventory = Inventory(host_list=[], vault_password="Hello123")                    
     inventory.add_group(group)                              
     key_file = keyfile                 
     playbook_path = os.path.join(config.ANSIBLE_PLAYBOOKS, playbook)                     
     pb = PlayBook(                                 
       playbook=playbook_path,                             
       inventory = inventory,                             
       remote_user='deploy',                              
       callbacks=playbook_cb,                             
       runner_callbacks=runner_cb,                            
       stats=stats,                                
       private_key_file=key_file                             
    )                                     

     results = pb.run()                                
     print results 

Однако Ansibledocumentation для Python API очень плохо написано (не дает никаких подробностей, кроме простого примера). То, что мне было нужно, чтобы иметь подобную вещь, как:

ansible-playbook -i hadoop_config -e "namenode_ip=1.2.3.4" 

Вот именно, передать значение namenode_ip динамически в файл инвентаризации с помощью Python API. Как я могу это сделать?

ответ

1

Это должно быть так же просто, как добавление одного или несколько из этих строк в скрипт после инстанцирования вашего объекта группы и перед запуском пьес:

group.set_variable("foo", "BAR") 
Смежные вопросы