示例#1
0
    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)
示例#4
0

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)
示例#5
0
 def setUp(self):
     self.conn_info = ConnectionInformation()
     self.in_stream = StringIO()
示例#6
0
    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)
示例#7
0
    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")
示例#8
0
    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")
示例#9
0
      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))
示例#10
0
 def setUp(self):
     self.conn_info = ConnectionInformation()