def save_config(module, result): result["changed"] = True if not module.check_mode: run_commands(module, "copy running-config startup-config\r") else: module.warn("Skipping command `copy running-config startup-config`" "due to check mode. Configuration not copied to " "non-volatile storage")
def main(): """ main entry point for module execution """ argument_spec = dict( commands=dict(type="list", required=True), wait_for=dict(type="list", aliases=["waitfor"]), match=dict(default="all", choices=["all", "any"]), retries=dict(default=10, type="int"), interval=dict(defult=1, type="int"), ) argument_spec.update(awplus_argument_spec) module = AnsibleModule(argument_spec=argument_spec, supports_check_mode=True) warnings = list() result = {"changed": False, "warnings": warnings} commands = parse_commands(module, warnings) wait_for = module.params["wait_for"] or list() try: conditionals = [Conditional(c) for c in wait_for] except AttributeError as exc: module.fail_json(msg=to_text(exc)) retries = module.params["retries"] interval = module.params["interval"] match = module.params["match"] while retries > 0: responses = run_commands(module, commands) for item in list(conditionals): if item(responses): if match == "any": conditionals = list() break conditionals.remove(item) if not conditionals: break time.sleep(interval) retries -= 1 if conditionals: failed_conditions = [item.raw for item in conditionals] msg = "One or more conditional statements have not been satisfied" module.fail_json(msg=msg, failed_conditions=failed_conditions) result.update({ "stdout": responses, "stdout_lines": list(to_lines(responses)) }) module.exit_json(**result)
def map_config_to_obj(module): obj = [] dest_group = ("console", "host", "monitor", "buffered", "permanent", "external") data = run_commands(module, "show log config")[0] chunks = data.split( " " ) for chunk in chunks: blocks = re.split("Statistics .+", chunk, re.M) for line in blocks: match = re.search(r"(\S+) log:", line, re.M) if "Facility:" in line: dest = "facility" haves = populate_have(line, dest) for have in haves: obj.append(have) if match: if match.group(1).lower() in dest_group: dest = match.group(1).lower() haves = populate_have(line, dest) for have in haves: obj.append(have) elif validate_ip_address(match.group(1)): dest = "host" haves = populate_have(line, dest) for have in haves: obj.append(have) else: ip_match = re.search(r"\d+\.\d+\.\d+\.\d+", match.group(1), re.M) if ip_match: dest = "host" haves = populate_have(line, dest) for have in haves: obj.append(have) return obj
def get_openflow_config(module): return run_commands(module, "show openflow config")
def main(): """ main entry point for module execution """ backup_spec = dict(filename=dict(default="awplus"), dir_path=dict(type="path", default="./backup")) argument_spec = dict( src=dict(type="path"), lines=dict(aliases=["commands"], type="list"), parents=dict(type="list"), before=dict(type="list"), after=dict(type="list"), match=dict(default="line", choices=["line", "strict", "exact", "none"]), replace=dict(default="line", choices=["line", "block"]), multiline_delimiter=dict(default="@"), running_config=dict(aliases=["config"]), intended_config=dict(), backup=dict(type="bool", default=False), backup_options=dict(type="dict", options=backup_spec), save_when=dict(choices=["always", "never", "modified", "changed"], default="never"), diff_against=dict(choices=["startup", "intended", "running"]), diff_ignore_lines=dict(type="list"), ) argument_spec.update(awplus_argument_spec) mutually_exclusive = [("lines", "src"), ("parents", "src")] required_if = [ ("match", "strict", ["lines"]), ("match", "exact", ["lines"]), ("replace", "block", ["lines"]), ("diff_against", "intended", ["intended_config"]), ] module = AnsibleModule( argument_spec=argument_spec, mutually_exclusive=mutually_exclusive, required_if=required_if, supports_check_mode=True, ) result = {"changed": False} warnings = list() check_args(module, warnings) result["warnings"] = warnings diff_ignore_lines = module.params["diff_ignore_lines"] config = None contents = None connection = get_connection(module) if module.params["backup"] or (module._diff and module.params["diff_against"] == "running"): contents = get_config(module) config = NetworkConfig(indent=1, contents=contents) if module.params["backup"]: result["__backup__"] = contents backup_options = module.params["backup_options"] if backup_options: dir_path = backup_options["dir_path"] filename = backup_options["filename"] else: dir_path = "./backup" filename = "awplus" write_backup(contents, dir_path, filename) result["filename"] = filename result["backup_path"] = dir_path if any((module.params["lines"], module.params["src"])): match = module.params["match"] replace = module.params["replace"] path = module.params["parents"] candidate = get_candidate_config(module) running = get_running_config(module, contents) try: response = connection.get_diff( candidate=candidate, running=running, diff_match=match, diff_ignore_lines=diff_ignore_lines, path=path, diff_replace=replace, ) except ConnectionError as exc: module.fail_json(msg=to_text(exc, errors="surrogate_then_replace")) config_diff = response["config_diff"] banner_diff = response["banner_diff"] if config_diff or banner_diff: commands = config_diff.split("\n") if module.params["before"]: commands[:0] = module.params["before"] if module.params["after"]: commands.extend(module.params["after"]) result["commands"] = commands result["banners"] = banner_diff # send the configuration commands to the device and merge # them with the current running config if not module.check_mode: if commands: edit_runconfig(connection, commands) if banner_diff: connection.edit_banner( candidate=json.dumps(banner_diff), multiline_delimiter=module. params["multiline_delimiter"], ) result["changed"] = True running_config = module.params["running_config"] startup_config = None if module.params["save_when"] == "always": save_config(module, result) elif module.params["save_when"] == "modified": output = run_commands(module, ["show running-config", "show startup-config"]) running_config = NetworkConfig(indent=1, contents=output[0], ignore_lines=diff_ignore_lines) startup_config = NetworkConfig(indent=1, contents=output[1], ignore_lines=diff_ignore_lines) if running_config.sha1 != startup_config.sha1: save_config(module, result) elif module.params["save_when"] == "changed" and result["changed"]: save_config(module, result) if module._diff: if not running_config: output = run_commands(module, "show running-config") contents = output[0] else: contents = running_config # recreate the object in order to process diff_ignore_lines running_config = NetworkConfig(indent=1, contents=contents, ignore_lines=diff_ignore_lines) if module.params["diff_against"] == "running": if module.check_mode: module.warn( "unable to perform diff against running-config due to check mode" ) contents = None else: contents = config.config_text elif module.params["diff_against"] == "startup": if not startup_config: output = run_commands(module, "show startup-config") contents = output[0] else: contents = startup_config.config_text elif module.params["diff_against"] == "intended": contents = module.params["intended_config"] if contents is not None: base_config = NetworkConfig(indent=1, contents=contents, ignore_lines=diff_ignore_lines) if running_config.sha1 != base_config.sha1: if module.params["diff_against"] == "intended": before = running_config after = base_config elif module.params["diff_against"] in ("startup", "running"): before = base_config after = running_config result.update({ "changed": True, "diff": { "before": str(before), "after": str(after) }, }) module.exit_json(**result)
def main(): """ main entry point for module execution """ argument_spec = dict( count=dict(type="int"), dest=dict(type="str", required=True), source=dict(type="str"), state=dict(type="str", choices=["absent", "present"], default="present"), vrf=dict(type="str"), ) argument_spec.update(awplus_argument_spec) module = AnsibleModule(argument_spec=argument_spec) count = module.params["count"] dest = module.params["dest"] source = module.params["source"] vrf = module.params["vrf"] warnings = list() results = {} if warnings: results["warnings"] = warnings results["commands"] = [build_ping(dest, count, source, vrf)] ping_results = run_commands(module, commands=results["commands"]) ping_results_list = ping_results[0].split("\n") stats = [] fail = False for i in range(len(ping_results_list)): if "transmitted" in ping_results_list[i]: if "error" in ping_results_list[i]: fail = True stats.append(ping_results_list[i]) stats.append(ping_results_list[i + 1]) break if len(stats) == 0: module.fail_json(msg=ping_results_list) loss, rx, tx, rtt = parse_ping(stats, fail) results["packet_loss"] = str(loss) + "%" results["packets_rx"] = int(rx) results["packets_tx"] = int(tx) # Convert rtt values to int if rtt is not None: rtt_dict = rtt.groupdict() for k, v in rtt_dict.items(): if rtt_dict[k] is not None: rtt_dict[k] = float(v) results["rtt"] = rtt_dict else: results["rtt"] = rtt validate_results(module, float(loss), results) module.exit_json(**results)
def run(self, cmd): return run_commands(self.module, commands=cmd, check_rc=False)
def populate(self): self.responses = run_commands( self.module, commands=self.COMMANDS, check_rc=False )