Hi, I am attempting to use the Ansible API to run and playbook and insert the facts into a mongodb database but I am getting two documents for each machine. I am a newbie and unfamiliar with the API. Can anyone shed my insight into why my code creates two outputs, I would greatly appreciate the help.
Here is the code: #!/usr/bin/env python import json import shutil from collections import namedtuple from ansible.parsing.dataloader import DataLoader from ansible.vars.manager import VariableManager from ansible.inventory.manager import InventoryManager from ansible.executor.playbook_executor import PlaybookExecutor from ansible.playbook.play import Play from ansible.executor.task_queue_manager import TaskQueueManager from ansible.plugins.callback import CallbackBase import ansible.constants as C import pymongo connection = pymongo.MongoClient("mongodb://<ip_address>:27017") db = connection.infrastructure servers = db.servers one_server = dict() class ResultCallback(CallbackBase): """A sample callback plugin used for performing an action as results come in If you want to collect all results into a single object for processing at the end of the execution, look into utilizing the ``json`` callback plugin or writing your own custom callback plugin """ def v2_runner_on_ok(self, result, **kwargs): """Print a json representation of the result This method could store the result in an instance attribute for retrieval later """ host = result._host #one_server = ((json.dumps({host.name: result._result}))) one_server = ({host.name: result._result}) #print(one_server) servers.insert(one_server,check_keys=False) Options = namedtuple('Options', ['connection', 'module_path', 'forks', 'become', 'become_method', 'become_user', 'check', 'diff']) # initialize needed objects loader = DataLoader() options = Options(connection='local', module_path=['/path/to/mymodules'], forks=100, become=None, become_method=None, become_user=None, check=False, diff=False) passwords = dict(vault_pass='secret') # Instantiate our ResultCallback for handling results as they come in results_callback = ResultCallback() # create inventory and pass to var manager # use path to host config file as source or hosts in a comma separated string inventory = InventoryManager(loader=loader, sources='/etc/ansible/single/playbooks/hosts') variable_manager = VariableManager(loader=loader, inventory=inventory) Options = namedtuple('Options', ['connection', 'remote_user', 'ask_sudo_pass', 'verbosity', 'ack_pass', 'module_path', 'forks', 'become', 'become_method', 'become_user', 'check', 'listhosts', 'listtasks', 'listtags', 'syntax', 'sudo_user', 'sudo', 'diff']) options = Options(connection='smart', remote_user=None, ack_pass=None, sudo_user=None, forks=5, sudo=None, ask_sudo_pass=False, verbosity=5, module_path=None, become=None, become_method=None, become_user=None, check=False, diff=False, listhosts=None, listtasks=None, listtags=None, syntax=None) pbe = PlaybookExecutor(playbooks=['/etc/ansible/single/playbooks/setup.yml'],inventory=inventory, variable_manager=variable_manager, loader=loader,options=options,passwords=passwords) results_callback = ResultCallback() pbe._tqm._stdout_callback = results_callback return_code = pbe.run() Thank you, Tom -- You received this message because you are subscribed to the Google Groups "Ansible Project" group. To unsubscribe from this group and stop receiving emails from it, send an email to ansible-project+unsubscr...@googlegroups.com. To post to this group, send email to ansible-project@googlegroups.com. To view this discussion on the web visit https://groups.google.com/d/msgid/ansible-project/036c9014-3d3c-4020-b69c-ac9b3bb1395f%40googlegroups.com. For more options, visit https://groups.google.com/d/optout.