cybertextron
cybertextron

Reputation: 10961

Passing values dynamically to an Ansible inventory - Python

I'm trying to Ansible's Python API in order to write a test API (in Python) which can take advantage of a playbook programmatically and add new nodes to a Hadoop cluster. As we know, at least node in the cluster has to be the Namenode and JobTracker (MRv1). For simplicity lets say the JobTracker and the Namenode are in the same node (namenode_ip).

Thus, in order to use Ansible to create a new node, and have it self registered with the Namenode I've created this following Python utility:

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

However, Ansible documentation for the Python API is very poorly written (doesn't give any detail, except for a simple example). What I needed was to have a similar thing as:

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

That's it, pass the value of namenode_ip dynamically to the inventory file using the Python API. How can I do that?

Upvotes: 2

Views: 809

Answers (1)

Strofcon
Strofcon

Reputation: 26

This should be as simple as adding one or more of these lines to your script after instantiating your group object and before running your playbook:

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

Upvotes: 1

Related Questions