将值动态传递给Ansible清单-Python

将值动态传递给Ansible清单-Python,python,ansible,Python,Ansible,我正在尝试Ansible的pythonapi,以便编写一个测试API(在Python中),它可以通过编程方式利用剧本,并向Hadoop集群添加新节点。我们知道,集群中至少有一个节点必须是Namenode和JobTracker(MRv1)。为简单起见,假设JobTracker和Namenode位于同一个节点(Namenode\u ip) 因此,为了使用Ansible创建一个新节点,并使其在Namenode中自注册,我创建了以下Python实用程序: from ansible.playbook im

我正在尝试
Ansible的pythonapi
,以便编写一个测试API(在
Python
中),它可以通过编程方式利用剧本,并向
Hadoop
集群添加新节点。我们知道,集群中至少有一个节点必须是
Namenode
JobTracker
(MRv1)。为简单起见,假设
JobTracker
Namenode
位于同一个节点(
Namenode\u ip

因此,为了使用
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
然而,
pythonapi
Ansible
编写得非常糟糕(除了一个简单的示例外,没有给出任何细节)。我需要的是有一个类似的东西:

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

就是这样,使用
pythonapi
动态地将
namenode\u ip
的值传递给清单文件。我该怎么做

这应该很简单,只要在实例化组对象之后,在运行playbook之前,在脚本中添加一行或多行:

group.set_variable("foo", "BAR")