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
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)
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
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()
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
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
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
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))
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)
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)