Example #1
0
    def get_play_prereqs_2_4(self, options):
        loader = DataLoader()

        if self.vault_pass:
            loader.set_vault_secrets([
                ('default', VaultSecret(_bytes=to_bytes(self.vault_pass)))
            ])

        # create the inventory, and filter it based on the subset specified (if any)
        inventory = InventoryManager(loader=loader, sources=options.inventory)

        # create the variable manager, which will be shared throughout
        # the code, ensuring a consistent view of global variables
        try:
            # Ansible 2.8
            variable_manager = VariableManager(
                loader=loader,
                inventory=inventory,
                version_info=self.version_info(ansible_version))
            variable_manager._extra_vars = self.extra_vars
        except TypeError:
            variable_manager = VariableManager(loader=loader,
                                               inventory=inventory)
            variable_manager.extra_vars = self.extra_vars
            variable_manager.options_vars = {
                'ansible_version': self.version_info(ansible_version)
            }

        return loader, inventory, variable_manager
Example #2
0
    def test_variable_manager_options_vars(self):
        fake_loader = DictDataLoader({})

        options_vars = dict(a=1, b=2, c=3)
        mock_inventory = MagicMock()
        v = VariableManager(loader=fake_loader, inventory=mock_inventory)

        # override internal options_vars loading
        v._extra_vars = options_vars

        myvars = v.get_vars(use_cache=False)
        for (key, val) in iteritems(options_vars):
            self.assertEqual(myvars.get(key), val)
Example #3
0
    def execute(self, playbook_source, hosts_source, extra_vars=None, tags=[]):
        context.CLIARGS = ImmutableDict(
            tags=tags,
            listtags=False,
            listtasks=False,
            listhosts=False,
            syntax=False,
            connection='ssh',
            module_path=None,
            forks=100,
            remote_user='******',
            private_key_file=None,
            ssh_common_args=None,
            ssh_extra_args=None,
            sftp_extra_args=None,
            scp_extra_args=None,
            become=False,
            become_method='sudo',
            become_user='******',
            verbosity=True,
            check=False,
            start_at_task=None,
        )
        with NamedTemporaryFile(mode='w') as hosts_file:
            hosts_file.write(hosts_source)
            hosts_file.seek(0)
            inventory = InventoryManager(loader=self.loader,
                                         sources=(hosts_file.name, ))

        variable_manager = VariableManager(
            loader=self.loader,
            inventory=inventory,
            version_info=CLI.version_info(gitinfo=False))
        if extra_vars:
            variable_manager._extra_vars = extra_vars

        playbook = os.path.abspath("playbooks/" + playbook_source)
        pbex = PlaybookExecutor(playbooks=[playbook],
                                inventory=inventory,
                                variable_manager=variable_manager,
                                loader=self.loader,
                                passwords={})
        result_callback = ResultCallback()
        pbex._tqm._stdout_callback = result_callback
        result_code = pbex.run()

        # Remove ansible tmpdir
        shutil.rmtree(constants.DEFAULT_LOCAL_TMP, True)

        return result_code, result_callback
Example #4
0
def _run_ansible(playbook: str, variables: dict = None):
    if variables is None:
        variables = {}
    from ansible import context
    from ansible.cli import CLI
    from ansible.module_utils.common.collections import ImmutableDict
    from ansible.executor.playbook_executor import PlaybookExecutor
    from ansible.parsing.dataloader import DataLoader
    from ansible.inventory.manager import InventoryManager
    from ansible.vars.manager import VariableManager

    loader = DataLoader()
    context.CLIARGS = ImmutableDict(
        tags={},
        listtags=False,
        listtasks=False,
        listhosts=False,
        syntax=False,
        connection="ssh",
        module_path=None,
        forks=100,
        remote_user="******",
        private_key_file=None,
        ssh_common_args=None,
        ssh_extra_args=None,
        sftp_extra_args=None,
        scp_extra_args=None,
        become=True,
        become_method="sudo",
        become_user="******",
        verbosity=True,
        check=False,
        start_at_task=None,
    )
    inventory = InventoryManager(loader=loader, sources=())
    variable_manager = VariableManager(
        loader=loader,
        inventory=inventory,
        version_info=CLI.version_info(gitinfo=False))
    variable_manager._extra_vars = variables
    pbex = PlaybookExecutor(
        playbooks=[os.path.join(SETUP_DIR, "ansible", playbook)],
        inventory=inventory,
        variable_manager=variable_manager,
        loader=loader,
        passwords={},
    )
    return pbex.run()
Example #5
0
def ansible_runner_24x(playbook_path,
                       extra_vars,
                       options,
                       inventory_src='localhost',
                       console=True):

    loader = DataLoader()
    variable_manager = VariableManager(loader=loader)
    variable_manager._extra_vars = extra_vars
    inventory = Inventory(loader=loader, sources=[inventory_src])
    variable_manager.set_inventory(inventory)
    passwords = {}

    pbex = PlaybookExecutor([playbook_path], inventory, variable_manager,
                            loader, options, passwords)
    return pbex
Example #6
0
    def run_playbook(self, request_id, connection_type, inventory_path,
                     playbook_path, lifecycle, all_properties):
        Options = namedtuple('Options', [
            'connection', 'forks', 'become', 'become_method', 'become_user',
            'listhosts', 'listtasks', 'listtags', 'syntax', 'module_path',
            'check', 'diff'
        ])
        # initialize needed objects
        loader = DataLoader()

        context.CLIARGS = ImmutableDict(connection=connection_type,
                                        module_path=None,
                                        forks=20,
                                        become=None,
                                        become_method='sudo',
                                        become_user='******',
                                        check=False,
                                        diff=False,
                                        listhosts=None,
                                        listtasks=None,
                                        listtags=None,
                                        syntax=None,
                                        start_at_task=None,
                                        verbosity=1)

        passwords = {'become_pass': ''}

        # create inventory and pass to var manager
        inventory = InventoryManager(loader=loader, sources=inventory_path)
        variable_manager = VariableManager(loader=loader, inventory=inventory)
        variable_manager._extra_vars = all_properties
        # Setup playbook executor, but don't run until run() called
        pbex = PlaybookExecutor(playbooks=[playbook_path],
                                inventory=inventory,
                                variable_manager=variable_manager,
                                loader=loader,
                                passwords=passwords)

        callback = ResultCallback(self.ansible_properties, request_id,
                                  lifecycle, self.event_logger)
        pbex._tqm._stdout_callback = callback

        pbex.run()
        logger.debug(f'Playbook finished {playbook_path}')

        return callback
Example #7
0
def ansible_run(loader, inventory, playbook_path, extra_vars):
    frame_info = getframeinfo(currentframe())
    print(f"Start [{frame_info.function}]!")

    variable_manager = VariableManager(loader=loader, inventory=inventory, version_info=CLI.version_info(gitinfo=False))

    if extra_vars.items():
        print(f"[{frame_info.function}] extra_vars.items() is empty")
    else:
        variable_manager._extra_vars = extra_vars

    pbex = PlaybookExecutor(playbooks=[playbook_path], inventory=inventory, 
                            variable_manager=variable_manager, loader=loader, passwords={})

    callback = SampleCallback()

    pbex._tqm._stdout_callback = callback
    return_code = pbex.run()
    results = callback.results

    return return_code, results
Example #8
0
from ansible.parsing.dataloader import DataLoader
from ansible.inventory.manager import InventoryManager
from ansible.vars.manager import VariableManager

loader = DataLoader()
inventory = InventoryManager(loader=loader, sources='hosts')
variable_manager = VariableManager(loader=loader, inventory=inventory)
host = inventory.get_host('192.168.10.150')
# get_vars() # 查看变量
print(variable_manager.get_vars(host=host))
# set_host_variable() # 修改指定主机的变量信息
variable_manager.set_host_variable(host=host,
                                   varname="ansible_ssh_pass",
                                   value="1111111")
print(variable_manager.get_vars(host=host))
print(variable_manager.__dict__)
# _extra_vars={} # 添加指定对象的扩展变量,全局有效
variable_manager._extra_vars = {'mysite': "ys.blog.com"}
print(variable_manager.get_vars(host=host))
Example #9
0
loader = DataLoader()
loader.set_vault_secrets([('default', VaultSecret(_bytes=to_bytes('123456')))])

context.CLIARGS = ImmutableDict(tags={},
                                listtags=False,
                                listtasks=False,
                                listhosts=False,
                                syntax=False,
                                module_path=None,
                                forks=100,
                                private_key_file=None,
                                start_at_task=None)

inventory = InventoryManager(loader=loader,
                             sources=[code_path + '/ansible/inventory'])

variable_manager = VariableManager(
    loader=loader,
    inventory=inventory,
    version_info=CLI.version_info(gitinfo=False))
variable_manager._extra_vars = {'firstvar': False}

pbex = PlaybookExecutor(playbooks=[code_path + '/ansible/variables.yml'],
                        inventory=inventory,
                        variable_manager=variable_manager,
                        loader=loader,
                        passwords={})

results = pbex.run()

print(results)
Example #10
0
def run_ansible_playbook(details):

    # initialize needed objects
    passwords = {} 

    # Instantiate our ResultCallback for handling results as they come in. Ansible expects this to be one of its main display outlets
    results_callback = ResultCallback()
    ansible_connect = ansible_play()
    if details['incident']:
        ansible_connect.incident_number = details['incident_number']
    loader = DataLoader()
    # get the Inventory details
    inventory = ansible_connect.get_inventory()
    extra_var = {}
    variable_manager = VariableManager(loader=loader, inventory=inventory)
    if details['type'] == "service":
        play_source=service_play_source(details)
        extra_var = {f'service_name={details["service"]}'}
    if details['type'] == "usr_acc_creation":
        play_source=AD_user_accountCreation(details)
        extra_var = {f'f_name={details["f_name"]} , uname={details["uname"]}, l_name={details["l_name"]}, g_name={details["g_name"]}'}
        details['description'] = "User Account has been Created"
        details['description_failure'] = "Issue in Creating User account on Active Directory"
    if details['type'] == "group_addtion":
        details['description'] = "Group has been added to the user account"
        details['description_failure'] = "Issue in adding user account to Group "
        play_source = group_addtion_touser(details)

    context.CLIARGS = ImmutableDict(listtags=False, listtasks=False, listhosts=False, forks=100,private_key_file=None, ssh_common_args=None, ssh_extra_args=None, sftp_extra_args=None, scp_extra_args=None, become=False, become_method='sudo', become_user='******', verbosity=0, check=False, diff=False, extra_vars=extra_var,  module_path='run_ansible_playbook.py', syntax=False, connection='ssh')
    variable_manager._extra_vars=load_extra_vars(loader=loader)
    # create data structure that represents our play, including tasks, this is basically what our YAML loader does internally.
    
    # Create play object, playbook objects use .load instead of init or new methods,
    # this will also automatically create the task objects from the info provided in play_source
    play = Play().load(play_source, variable_manager=variable_manager, loader=loader)

    # Run it - instantiate task queue manager, which takes care of forking and setting up all objects to iterate over host list and tasks
    tqm = None
    try:
        tqm = TaskQueueManager(
                  inventory=inventory,
                  variable_manager=variable_manager,
                  loader=loader,
                  passwords=passwords,
                  stdout_callback=results_callback,  # Use our custom callback instead of the ``default`` callback plugin, which prints to stdout
              )
        result = tqm.run(play) # most interesting data for a play is actually sent to the callback's methods
        if result == 0 and details['incident']:
           update_incident(details,6, results_callback.output)
        if result == 0 and  details['request']:
            update_ritm(details,3, results_callback.output)
        if result != 0 and details['incident']:
           update_incident(details,2, results_callback.output)
        if result != 0 and  details['request']:
            update_ritm(details,2, results_callback.output)
    finally:
        # we always need to cleanup child procs and the structures we use to communicate with them
        if tqm is not None:
            tqm.cleanup()

        # Remove ansible tmpdir
        shutil.rmtree(C.DEFAULT_LOCAL_TMP, True)