def test_play_iterator(self): fake_loader = DictDataLoader({ "test_play.yml": """ - hosts: all gather_facts: false roles: - test_role pre_tasks: - debug: msg="this is a pre_task" tasks: - debug: msg="this is a regular task" post_tasks: - debug: msg="this is a post_task" """, '/etc/ansible/roles/test_role/tasks/main.yml': """ - debug: msg="this is a role task" """, }) p = Playbook.load('test_play.yml', loader=fake_loader) hosts = [] for i in range(0, 10): host = MagicMock() host.get_name.return_value = 'host%02d' % i hosts.append(host) inventory = MagicMock() inventory.get_hosts.return_value = hosts inventory.filter_hosts.return_value = hosts connection_info = ConnectionInformation(play=p._entries[0]) itr = PlayIterator( inventory=inventory, play=p._entries[0], connection_info=connection_info, all_vars=dict(), ) (host_state, task) = itr.get_next_task_for_host(hosts[0]) print(task) self.assertIsNotNone(task) (host_state, task) = itr.get_next_task_for_host(hosts[0]) print(task) self.assertIsNotNone(task) (host_state, task) = itr.get_next_task_for_host(hosts[0]) print(task) self.assertIsNotNone(task) (host_state, task) = itr.get_next_task_for_host(hosts[0]) print(task) self.assertIsNotNone(task) (host_state, task) = itr.get_next_task_for_host(hosts[0]) print(task) self.assertIsNone(task)
def run(self, play): ''' Iterates over the roles/tasks in a play, using the given (or default) strategy for queueing tasks. The default is the linear strategy, which operates like classic Ansible by keeping all hosts in lock-step with a given task (meaning no hosts move on to the next task until all hosts are done with the current task). ''' all_vars = self._variable_manager.get_vars(loader=self._loader, play=play) templar = Templar(loader=self._loader, variables=all_vars, fail_on_undefined=False) new_play = play.copy() new_play.post_validate(templar) connection_info = ConnectionInformation(new_play, self._options, self.passwords) for callback_plugin in self._callback_plugins: if hasattr(callback_plugin, 'set_connection_info'): callback_plugin.set_connection_info(connection_info) self.send_callback('v2_playbook_on_play_start', new_play) # initialize the shared dictionary containing the notified handlers self._initialize_notified_handlers(new_play.handlers) # load the specified strategy (or the default linear one) strategy = strategy_loader.get(new_play.strategy, self) if strategy is None: raise AnsibleError("Invalid play strategy specified: %s" % new_play.strategy, obj=play._ds) # build the iterator iterator = PlayIterator(inventory=self._inventory, play=new_play, connection_info=connection_info, all_vars=all_vars) # and run the play using the strategy return strategy.run(iterator, connection_info)
def run(self, play): ''' Iterates over the roles/tasks in a play, using the given (or default) strategy for queueing tasks. The default is the linear strategy, which operates like classic Ansible by keeping all hosts in lock-step with a given task (meaning no hosts move on to the next task until all hosts are done with the current task). ''' connection_info = ConnectionInformation(play, self._options) self._callback.set_connection_info(connection_info) # run final validation on the play now, to make sure fields are templated # FIXME: is this even required? Everything is validated and merged at the # task level, so else in the play needs to be templated #all_vars = self._vmw.get_vars(loader=self._dlw, play=play) #all_vars = self._vmw.get_vars(loader=self._loader, play=play) #play.post_validate(all_vars=all_vars) self._callback.playbook_on_play_start(play.name) # initialize the shared dictionary containing the notified handlers self._initialize_notified_handlers(play.handlers) # load the specified strategy (or the default linear one) strategy = strategy_loader.get(play.strategy, self) if strategy is None: raise AnsibleError("Invalid play strategy specified: %s" % play.strategy, obj=play._ds) # build the iterator iterator = PlayIterator(inventory=self._inventory, play=play) # and run the play using the strategy return strategy.run(iterator, connection_info)
debug("starting") cur_worker = 0 pending_results = 0 var_manager = VariableManager() debug("loading inventory") inventory = Inventory(host_list='/tmp/med_inventory', loader=loader, variable_manager=var_manager) hosts = inventory.get_hosts()[:] debug("done loading inventory") ci = ConnectionInformation() ci.connection = 'local' for i in range(NUM_TASKS): #for j in range(NUM_HOSTS): for h in hosts: debug("queuing %s %d" % (h, i)) #h = Host(name="host%06d" % j) t = Task().load( dict(name="task %d" % (i, ), debug="msg='hello from %s, %d'" % (h, i))) #t = Task().load(dict(name="task %d" % (i,), ping="")) #task_vars = var_manager.get_vars(loader=loader, host=h, task=t) task_vars = dict() new_t = t.copy() new_t.post_validate(task_vars)
def setUp(self): self.conn_info = ConnectionInformation() self.in_stream = StringIO()
def run(self, play): ''' Iterates over the roles/tasks in a play, using the given (or default) strategy for queueing tasks. The default is the linear strategy, which operates like classic Ansible by keeping all hosts in lock-step with a given task (meaning no hosts move on to the next task until all hosts are done with the current task). ''' if not self._callbacks_loaded: self.load_callbacks() if play.vars_prompt: for var in play.vars_prompt: if 'name' not in var: raise AnsibleError("'vars_prompt' item is missing 'name:'", obj=play._ds) vname = var['name'] prompt = var.get("prompt", vname) default = var.get("default", None) private = var.get("private", True) confirm = var.get("confirm", False) encrypt = var.get("encrypt", None) salt_size = var.get("salt_size", None) salt = var.get("salt", None) if vname not in play.vars: self.send_callback('v2_playbook_on_vars_prompt', vname, private, prompt, encrypt, confirm, salt_size, salt, default) play.vars[vname] = self._do_var_prompt( vname, private, prompt, encrypt, confirm, salt_size, salt, default) all_vars = self._variable_manager.get_vars(loader=self._loader, play=play) templar = Templar(loader=self._loader, variables=all_vars) new_play = play.copy() new_play.post_validate(templar) connection_info = ConnectionInformation(new_play, self._options, self.passwords) for callback_plugin in self._callback_plugins: if hasattr(callback_plugin, 'set_connection_info'): callback_plugin.set_connection_info(connection_info) self.send_callback('v2_playbook_on_play_start', new_play) # initialize the shared dictionary containing the notified handlers self._initialize_notified_handlers(new_play.handlers) # load the specified strategy (or the default linear one) strategy = strategy_loader.get(new_play.strategy, self) if strategy is None: raise AnsibleError("Invalid play strategy specified: %s" % new_play.strategy, obj=play._ds) # build the iterator iterator = PlayIterator(inventory=self._inventory, play=new_play, connection_info=connection_info, all_vars=all_vars) # and run the play using the strategy return strategy.run(iterator, connection_info)
def test_connection_info(self): (options, args) = self._parser.parse_args(['-vv', '--check']) conn_info = ConnectionInformation(options=options) self.assertEqual(conn_info.connection, 'smart') self.assertEqual(conn_info.remote_addr, None) self.assertEqual(conn_info.remote_user, pwd.getpwuid(os.geteuid())[0]) self.assertEqual(conn_info.password, '') self.assertEqual(conn_info.port, None) self.assertEqual(conn_info.private_key_file, C.DEFAULT_PRIVATE_KEY_FILE) self.assertEqual(conn_info.timeout, C.DEFAULT_TIMEOUT) self.assertEqual(conn_info.shell, None) self.assertEqual(conn_info.verbosity, 2) self.assertEqual(conn_info.check_mode, True) self.assertEqual(conn_info.no_log, False) mock_play = MagicMock() mock_play.connection = 'mock' mock_play.remote_user = '******' mock_play.port = 1234 mock_play.become = True mock_play.become_method = 'mock' mock_play.become_user = '******' mock_play.no_log = True mock_play.environment = dict(mock='mockenv') conn_info = ConnectionInformation(play=mock_play, options=options) self.assertEqual(conn_info.connection, 'mock') self.assertEqual(conn_info.remote_user, 'mock') self.assertEqual(conn_info.password, '') self.assertEqual(conn_info.port, 1234) self.assertEqual(conn_info.no_log, True) self.assertEqual(conn_info.environment, dict(mock="mockenv")) self.assertEqual(conn_info.become, True) self.assertEqual(conn_info.become_method, "mock") self.assertEqual(conn_info.become_user, "mockroot") mock_task = MagicMock() mock_task.connection = 'mocktask' mock_task.remote_user = '******' mock_task.become = True mock_task.become_method = 'mocktask' mock_task.become_user = '******' mock_task.become_pass = '******' mock_task.no_log = False mock_task.environment = dict(mock='mocktaskenv') mock_host = MagicMock() mock_host.get_vars.return_value = dict( ansible_connection = 'mock_inventory', ansible_ssh_port = 4321, ) conn_info = ConnectionInformation(play=mock_play, options=options) conn_info = conn_info.set_task_and_host_override(task=mock_task, host=mock_host) self.assertEqual(conn_info.connection, 'mock_inventory') self.assertEqual(conn_info.remote_user, 'mocktask') self.assertEqual(conn_info.port, 4321) self.assertEqual(conn_info.no_log, False) self.assertEqual(conn_info.environment, dict(mock="mocktaskenv")) self.assertEqual(conn_info.become, True) self.assertEqual(conn_info.become_method, "mocktask") self.assertEqual(conn_info.become_user, "mocktaskroot") self.assertEqual(conn_info.become_pass, "mocktaskpass")
def test_connection_info_make_become_cmd(self): (options, args) = self._parser.parse_args([]) conn_info = ConnectionInformation(options=options) default_cmd = "/bin/foo" default_exe = "/bin/bash" sudo_exe = C.DEFAULT_SUDO_EXE sudo_flags = C.DEFAULT_SUDO_FLAGS su_exe = C.DEFAULT_SU_EXE su_flags = C.DEFAULT_SU_FLAGS pbrun_exe = 'pbrun' pbrun_flags = '' (cmd, prompt, key) = conn_info.make_become_cmd(cmd=default_cmd, executable=default_exe) self.assertEqual(cmd, default_cmd) conn_info.become = True conn_info.become_user = '******' conn_info.become_method = 'sudo' (cmd, prompt, key) = conn_info.make_become_cmd(cmd=default_cmd, executable="/bin/bash") self.assertEqual(cmd, """%s -c '%s -k && %s %s -S -p "%s" -u %s %s -c '"'"'echo %s; %s'"'"''""" % (default_exe, sudo_exe, sudo_exe, sudo_flags, prompt, conn_info.become_user, default_exe, key, default_cmd)) conn_info.become_method = 'su' (cmd, prompt, key) = conn_info.make_become_cmd(cmd=default_cmd, executable="/bin/bash") self.assertEqual(cmd, """%s -c '%s %s -c "%s -c '"'"'echo %s; %s'"'"'"'""" % (default_exe, su_exe, conn_info.become_user, default_exe, key, default_cmd)) conn_info.become_method = 'pbrun' (cmd, prompt, key) = conn_info.make_become_cmd(cmd=default_cmd, executable="/bin/bash") self.assertEqual(cmd, """%s -c '%s -b -l %s -u %s '"'"'echo %s; %s'"'"''""" % (default_exe, pbrun_exe, pbrun_flags, conn_info.become_user, key, default_cmd)) conn_info.become_method = 'pfexec' (cmd, prompt, key) = conn_info.make_become_cmd(cmd=default_cmd, executable="/bin/bash") self.assertEqual(cmd, """%s -c '%s %s "'"'"'echo %s; %s'"'"'"'""" % (default_exe, pbrun_exe, pbrun_flags, key, default_cmd)) conn_info.become_method = 'bad' self.assertRaises(AnsibleError, conn_info.make_become_cmd, cmd=default_cmd, executable="/bin/bash")
time.sleep(0.01) debug("starting") cur_worker = 0 pending_results = 0 var_manager = VariableManager() debug("loading inventory") inventory = Inventory(host_list='/tmp/med_inventory', loader=loader, variable_manager=var_manager) hosts = inventory.get_hosts()[:] debug("done loading inventory") ci = ConnectionInformation() ci.connection = 'local' for i in range(NUM_TASKS): #for j in range(NUM_HOSTS): for h in hosts: debug("queuing %s %d" % (h, i)) #h = Host(name="host%06d" % j) t = Task().load(dict(name="task %d" % (i,), debug="msg='hello from %s, %d'" % (h,i))) #t = Task().load(dict(name="task %d" % (i,), ping="")) #task_vars = var_manager.get_vars(loader=loader, host=h, task=t) task_vars = dict() new_t = t.copy() new_t.post_validate(task_vars) send_data((h, t, task_vars, ci)) debug("done queuing %s %d" % (h, i))
def setUp(self): self.conn_info = ConnectionInformation()