mirror of https://github.com/ansible/ansible.git
You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
91 lines
3.1 KiB
Python
91 lines
3.1 KiB
Python
# Copyright: (c) 2015, Ansible Inc,
|
|
# GNU General Public License v3.0+ (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt)
|
|
|
|
from __future__ import absolute_import, division, print_function
|
|
|
|
__metaclass__ = type
|
|
|
|
import copy
|
|
|
|
from ansible.errors import AnsibleError
|
|
from ansible.plugins.action import ActionBase
|
|
from ansible.utils.display import Display
|
|
|
|
display = Display()
|
|
|
|
|
|
class ActionModule(ActionBase):
|
|
def run(self, tmp=None, task_vars=None):
|
|
del tmp # tmp no longer has any effect
|
|
|
|
result = {}
|
|
play_context = copy.deepcopy(self._play_context)
|
|
play_context.network_os = self._get_network_os(task_vars)
|
|
new_task = self._task.copy()
|
|
|
|
module = self._get_implementation_module(
|
|
play_context.network_os, self._task.action
|
|
)
|
|
if not module:
|
|
if self._task.args["fail_on_missing_module"]:
|
|
result["failed"] = True
|
|
else:
|
|
result["failed"] = False
|
|
|
|
result["msg"] = (
|
|
"Could not find implementation module %s for %s"
|
|
% (self._task.action, play_context.network_os)
|
|
)
|
|
return result
|
|
|
|
new_task.action = module
|
|
|
|
action = self._shared_loader_obj.action_loader.get(
|
|
play_context.network_os,
|
|
task=new_task,
|
|
connection=self._connection,
|
|
play_context=play_context,
|
|
loader=self._loader,
|
|
templar=self._templar,
|
|
shared_loader_obj=self._shared_loader_obj,
|
|
)
|
|
display.vvvv("Running implementation module %s" % module)
|
|
return action.run(task_vars=task_vars)
|
|
|
|
def _get_network_os(self, task_vars):
|
|
if "network_os" in self._task.args and self._task.args["network_os"]:
|
|
display.vvvv("Getting network OS from task argument")
|
|
network_os = self._task.args["network_os"]
|
|
elif self._play_context.network_os:
|
|
display.vvvv("Getting network OS from inventory")
|
|
network_os = self._play_context.network_os
|
|
elif (
|
|
"network_os" in task_vars.get("ansible_facts", {})
|
|
and task_vars["ansible_facts"]["network_os"]
|
|
):
|
|
display.vvvv("Getting network OS from fact")
|
|
network_os = task_vars["ansible_facts"]["network_os"]
|
|
else:
|
|
raise AnsibleError(
|
|
"ansible_network_os must be specified on this host to use platform agnostic modules"
|
|
)
|
|
|
|
return network_os
|
|
|
|
def _get_implementation_module(self, network_os, platform_agnostic_module):
|
|
module_name = (
|
|
network_os.split(".")[-1]
|
|
+ "_"
|
|
+ platform_agnostic_module.partition("_")[2]
|
|
)
|
|
if "." in network_os:
|
|
fqcn_module = ".".join(network_os.split(".")[0:-1])
|
|
implementation_module = fqcn_module + "." + module_name
|
|
else:
|
|
implementation_module = module_name
|
|
|
|
if implementation_module not in self._shared_loader_obj.module_loader:
|
|
implementation_module = None
|
|
|
|
return implementation_module
|