mirror of
https://github.com/ansible-collections/community.general.git
synced 2025-06-04 23:39:09 -07:00
parent
2f33c1a1a1
commit
5553b20828
206 changed files with 1853 additions and 1870 deletions
|
@ -20,25 +20,26 @@
|
||||||
from __future__ import (absolute_import, division, print_function)
|
from __future__ import (absolute_import, division, print_function)
|
||||||
__metaclass__ = type
|
__metaclass__ = type
|
||||||
|
|
||||||
|
import getpass
|
||||||
import operator
|
import operator
|
||||||
import optparse
|
import optparse
|
||||||
import os
|
import os
|
||||||
|
import subprocess
|
||||||
|
import re
|
||||||
import sys
|
import sys
|
||||||
import time
|
import time
|
||||||
import yaml
|
import yaml
|
||||||
import re
|
|
||||||
import getpass
|
|
||||||
import subprocess
|
|
||||||
from abc import ABCMeta, abstractmethod
|
from abc import ABCMeta, abstractmethod
|
||||||
|
|
||||||
import ansible
|
import ansible
|
||||||
from ansible.release import __version__
|
|
||||||
from ansible import constants as C
|
from ansible import constants as C
|
||||||
from ansible.errors import AnsibleError, AnsibleOptionsError
|
from ansible.errors import AnsibleError, AnsibleOptionsError
|
||||||
from ansible.inventory.manager import InventoryManager
|
from ansible.inventory.manager import InventoryManager
|
||||||
from ansible.module_utils.six import with_metaclass, string_types
|
from ansible.module_utils.six import with_metaclass, string_types
|
||||||
from ansible.module_utils._text import to_bytes, to_text
|
from ansible.module_utils._text import to_bytes, to_text
|
||||||
from ansible.parsing.dataloader import DataLoader
|
from ansible.parsing.dataloader import DataLoader
|
||||||
|
from ansible.release import __version__
|
||||||
from ansible.utils.path import unfrackpath
|
from ansible.utils.path import unfrackpath
|
||||||
from ansible.utils.vars import load_extra_vars, load_options_vars
|
from ansible.utils.vars import load_extra_vars, load_options_vars
|
||||||
from ansible.vars.manager import VariableManager
|
from ansible.vars.manager import VariableManager
|
||||||
|
@ -93,6 +94,7 @@ class InvalidOptsParser(SortedOptParser):
|
||||||
except optparse.BadOptionError:
|
except optparse.BadOptionError:
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
|
||||||
class CLI(with_metaclass(ABCMeta, object)):
|
class CLI(with_metaclass(ABCMeta, object)):
|
||||||
''' code behind bin/ansible* programs '''
|
''' code behind bin/ansible* programs '''
|
||||||
|
|
||||||
|
@ -298,7 +300,8 @@ class CLI(with_metaclass(ABCMeta, object)):
|
||||||
|
|
||||||
if inventory_opts:
|
if inventory_opts:
|
||||||
parser.add_option('-i', '--inventory', '--inventory-file', dest='inventory', action="append",
|
parser.add_option('-i', '--inventory', '--inventory-file', dest='inventory', action="append",
|
||||||
help="specify inventory host path (default=[%s]) or comma separated host list. --inventory-file is deprecated" % C.DEFAULT_HOST_LIST)
|
help="specify inventory host path (default=[%s]) or comma separated host list. "
|
||||||
|
"--inventory-file is deprecated" % C.DEFAULT_HOST_LIST)
|
||||||
parser.add_option('--list-hosts', dest='listhosts', action='store_true',
|
parser.add_option('--list-hosts', dest='listhosts', action='store_true',
|
||||||
help='outputs a list of matching hosts; does not execute anything else')
|
help='outputs a list of matching hosts; does not execute anything else')
|
||||||
parser.add_option('-l', '--limit', default=C.DEFAULT_SUBSET, dest='subset',
|
parser.add_option('-l', '--limit', default=C.DEFAULT_SUBSET, dest='subset',
|
||||||
|
@ -380,7 +383,8 @@ class CLI(with_metaclass(ABCMeta, object)):
|
||||||
runas_group.add_option("-b", "--become", default=C.DEFAULT_BECOME, action="store_true", dest='become',
|
runas_group.add_option("-b", "--become", default=C.DEFAULT_BECOME, action="store_true", dest='become',
|
||||||
help="run operations with become (does not imply password prompting)")
|
help="run operations with become (does not imply password prompting)")
|
||||||
runas_group.add_option('--become-method', dest='become_method', default=C.DEFAULT_BECOME_METHOD, type='choice', choices=C.BECOME_METHODS,
|
runas_group.add_option('--become-method', dest='become_method', default=C.DEFAULT_BECOME_METHOD, type='choice', choices=C.BECOME_METHODS,
|
||||||
help="privilege escalation method to use (default=%s), valid choices: [ %s ]" % (C.DEFAULT_BECOME_METHOD, ' | '.join(C.BECOME_METHODS)))
|
help="privilege escalation method to use (default=%s), valid choices: [ %s ]" %
|
||||||
|
(C.DEFAULT_BECOME_METHOD, ' | '.join(C.BECOME_METHODS)))
|
||||||
runas_group.add_option('--become-user', default=None, dest='become_user', type='string',
|
runas_group.add_option('--become-user', default=None, dest='become_user', type='string',
|
||||||
help='run operations as this user (default=%s)' % C.DEFAULT_BECOME_USER)
|
help='run operations as this user (default=%s)' % C.DEFAULT_BECOME_USER)
|
||||||
|
|
||||||
|
@ -576,8 +580,7 @@ class CLI(with_metaclass(ABCMeta, object)):
|
||||||
offset = time.timezone
|
offset = time.timezone
|
||||||
else:
|
else:
|
||||||
offset = time.altzone
|
offset = time.altzone
|
||||||
result = "({0} {1}) last updated {2} (GMT {3:+04d})".format(branch, commit,
|
result = "({0} {1}) last updated {2} (GMT {3:+04d})".format(branch, commit, time.strftime("%Y/%m/%d %H:%M:%S", date), int(offset / -36))
|
||||||
time.strftime("%Y/%m/%d %H:%M:%S", date), int(offset / -36))
|
|
||||||
else:
|
else:
|
||||||
result = ''
|
result = ''
|
||||||
return result
|
return result
|
||||||
|
@ -705,4 +708,3 @@ class CLI(with_metaclass(ABCMeta, object)):
|
||||||
variable_manager.options_vars = load_options_vars(options, CLI.version_info(gitinfo=False))
|
variable_manager.options_vars = load_options_vars(options, CLI.version_info(gitinfo=False))
|
||||||
|
|
||||||
return loader, inventory, variable_manager
|
return loader, inventory, variable_manager
|
||||||
|
|
||||||
|
|
|
@ -59,7 +59,7 @@ class ConsoleCLI(CLI, cmd.Cmd):
|
||||||
|
|
||||||
modules = []
|
modules = []
|
||||||
ARGUMENTS = {'host-pattern': 'A name of a group in the inventory, a shell-like glob '
|
ARGUMENTS = {'host-pattern': 'A name of a group in the inventory, a shell-like glob '
|
||||||
'selecting hosts in inventory or any combination of the two separated by commas.', }
|
'selecting hosts in inventory or any combination of the two separated by commas.'}
|
||||||
|
|
||||||
def __init__(self, args):
|
def __init__(self, args):
|
||||||
|
|
||||||
|
|
|
@ -21,8 +21,8 @@ __metaclass__ = type
|
||||||
|
|
||||||
import datetime
|
import datetime
|
||||||
import os
|
import os
|
||||||
import traceback
|
|
||||||
import textwrap
|
import textwrap
|
||||||
|
import traceback
|
||||||
import yaml
|
import yaml
|
||||||
|
|
||||||
from ansible import constants as C
|
from ansible import constants as C
|
||||||
|
@ -66,7 +66,7 @@ class DocCLI(CLI):
|
||||||
self.parser.add_option("-a", "--all", action="store_true", default=False, dest='all_plugins',
|
self.parser.add_option("-a", "--all", action="store_true", default=False, dest='all_plugins',
|
||||||
help='Show documentation for all plugins')
|
help='Show documentation for all plugins')
|
||||||
self.parser.add_option("-t", "--type", action="store", default='module', dest='type', type='choice',
|
self.parser.add_option("-t", "--type", action="store", default='module', dest='type', type='choice',
|
||||||
help='Choose which plugin type', choices=['module','cache', 'connection', 'callback', 'lookup', 'strategy', 'inventory'])
|
help='Choose which plugin type', choices=['cache', 'callback', 'connection', 'inventory', 'lookup', 'module', 'strategy'])
|
||||||
|
|
||||||
super(DocCLI, self).parse()
|
super(DocCLI, self).parse()
|
||||||
|
|
||||||
|
|
|
@ -23,11 +23,11 @@ from __future__ import (absolute_import, division, print_function)
|
||||||
__metaclass__ = type
|
__metaclass__ = type
|
||||||
|
|
||||||
import os.path
|
import os.path
|
||||||
import sys
|
|
||||||
import yaml
|
|
||||||
import time
|
|
||||||
import re
|
import re
|
||||||
import shutil
|
import shutil
|
||||||
|
import sys
|
||||||
|
import time
|
||||||
|
import yaml
|
||||||
|
|
||||||
from jinja2 import Environment, FileSystemLoader
|
from jinja2 import Environment, FileSystemLoader
|
||||||
|
|
||||||
|
@ -36,11 +36,11 @@ from ansible.cli import CLI
|
||||||
from ansible.errors import AnsibleError, AnsibleOptionsError
|
from ansible.errors import AnsibleError, AnsibleOptionsError
|
||||||
from ansible.galaxy import Galaxy
|
from ansible.galaxy import Galaxy
|
||||||
from ansible.galaxy.api import GalaxyAPI
|
from ansible.galaxy.api import GalaxyAPI
|
||||||
from ansible.galaxy.role import GalaxyRole
|
|
||||||
from ansible.galaxy.login import GalaxyLogin
|
from ansible.galaxy.login import GalaxyLogin
|
||||||
|
from ansible.galaxy.role import GalaxyRole
|
||||||
from ansible.galaxy.token import GalaxyToken
|
from ansible.galaxy.token import GalaxyToken
|
||||||
from ansible.playbook.role.requirement import RoleRequirement
|
|
||||||
from ansible.module_utils._text import to_text
|
from ansible.module_utils._text import to_text
|
||||||
|
from ansible.playbook.role.requirement import RoleRequirement
|
||||||
|
|
||||||
try:
|
try:
|
||||||
from __main__ import display
|
from __main__ import display
|
||||||
|
@ -64,7 +64,6 @@ class GalaxyCLI(CLI):
|
||||||
|
|
||||||
super(GalaxyCLI, self).set_action()
|
super(GalaxyCLI, self).set_action()
|
||||||
|
|
||||||
|
|
||||||
# specific to actions
|
# specific to actions
|
||||||
if self.action == "delete":
|
if self.action == "delete":
|
||||||
self.parser.set_usage("usage: %prog delete [options] github_user github_repo")
|
self.parser.set_usage("usage: %prog delete [options] github_user github_repo")
|
||||||
|
@ -297,7 +296,7 @@ class GalaxyCLI(CLI):
|
||||||
role_info.update(role_spec)
|
role_info.update(role_spec)
|
||||||
|
|
||||||
data = self._display_role_info(role_info)
|
data = self._display_role_info(role_info)
|
||||||
### FIXME: This is broken in both 1.9 and 2.0 as
|
# FIXME: This is broken in both 1.9 and 2.0 as
|
||||||
# _display_role_info() always returns something
|
# _display_role_info() always returns something
|
||||||
if not data:
|
if not data:
|
||||||
data = u"\n- the role %s was not found" % role
|
data = u"\n- the role %s was not found" % role
|
||||||
|
@ -692,4 +691,3 @@ class GalaxyCLI(CLI):
|
||||||
if os.pathsep in data:
|
if os.pathsep in data:
|
||||||
data = data.split(os.pathsep)[0]
|
data = data.split(os.pathsep)[0]
|
||||||
return data
|
return data
|
||||||
|
|
||||||
|
|
|
@ -36,13 +36,10 @@ except ImportError:
|
||||||
display = Display()
|
display = Display()
|
||||||
|
|
||||||
|
|
||||||
#---------------------------------------------------------------------------------------------------
|
|
||||||
|
|
||||||
class PlaybookCLI(CLI):
|
class PlaybookCLI(CLI):
|
||||||
''' the tool to run *Ansible playbooks*, which are a configuration and multinode deployment system.
|
''' the tool to run *Ansible playbooks*, which are a configuration and multinode deployment system.
|
||||||
See the project home page (https://docs.ansible.com) for more information. '''
|
See the project home page (https://docs.ansible.com) for more information. '''
|
||||||
|
|
||||||
|
|
||||||
def parse(self):
|
def parse(self):
|
||||||
|
|
||||||
# create parser for CLI options
|
# create parser for CLI options
|
||||||
|
@ -122,7 +119,6 @@ class PlaybookCLI(CLI):
|
||||||
# Invalid limit
|
# Invalid limit
|
||||||
raise AnsibleError("Specified --limit does not match any hosts")
|
raise AnsibleError("Specified --limit does not match any hosts")
|
||||||
|
|
||||||
|
|
||||||
# flush fact cache if requested
|
# flush fact cache if requested
|
||||||
if self.options.flush_cache:
|
if self.options.flush_cache:
|
||||||
self._flush_cache(inventory, variable_manager)
|
self._flush_cache(inventory, variable_manager)
|
||||||
|
|
|
@ -28,8 +28,8 @@ import socket
|
||||||
import sys
|
import sys
|
||||||
import time
|
import time
|
||||||
|
|
||||||
from ansible.errors import AnsibleOptionsError
|
|
||||||
from ansible.cli import CLI
|
from ansible.cli import CLI
|
||||||
|
from ansible.errors import AnsibleOptionsError
|
||||||
from ansible.module_utils._text import to_native
|
from ansible.module_utils._text import to_native
|
||||||
from ansible.plugins import module_loader
|
from ansible.plugins import module_loader
|
||||||
from ansible.utils.cmd_functions import run_cmd
|
from ansible.utils.cmd_functions import run_cmd
|
||||||
|
@ -59,7 +59,7 @@ class PullCLI(CLI):
|
||||||
DEFAULT_PLAYBOOK = 'local.yml'
|
DEFAULT_PLAYBOOK = 'local.yml'
|
||||||
PLAYBOOK_ERRORS = {
|
PLAYBOOK_ERRORS = {
|
||||||
1: 'File does not exist',
|
1: 'File does not exist',
|
||||||
2: 'File is not readable'
|
2: 'File is not readable',
|
||||||
}
|
}
|
||||||
SUPPORTED_REPO_MODULES = ['git']
|
SUPPORTED_REPO_MODULES = ['git']
|
||||||
ARGUMENTS = {'playbook.yml': 'The name of one the YAML format files to run as an Ansible playbook.'
|
ARGUMENTS = {'playbook.yml': 'The name of one the YAML format files to run as an Ansible playbook.'
|
||||||
|
@ -87,7 +87,8 @@ class PullCLI(CLI):
|
||||||
self.parser.add_option('-o', '--only-if-changed', dest='ifchanged', default=False, action='store_true',
|
self.parser.add_option('-o', '--only-if-changed', dest='ifchanged', default=False, action='store_true',
|
||||||
help='only run the playbook if the repository has been updated')
|
help='only run the playbook if the repository has been updated')
|
||||||
self.parser.add_option('-s', '--sleep', dest='sleep', default=None,
|
self.parser.add_option('-s', '--sleep', dest='sleep', default=None,
|
||||||
help='sleep for random interval (between 0 and n number of seconds) before starting. This is a useful way to disperse git requests')
|
help='sleep for random interval (between 0 and n number of seconds) before starting. '
|
||||||
|
'This is a useful way to disperse git requests')
|
||||||
self.parser.add_option('-f', '--force', dest='force', default=False, action='store_true',
|
self.parser.add_option('-f', '--force', dest='force', default=False, action='store_true',
|
||||||
help='run the playbook even if the repository could not be updated')
|
help='run the playbook even if the repository could not be updated')
|
||||||
self.parser.add_option('-d', '--directory', dest='dest', default=None, help='directory to checkout repository to')
|
self.parser.add_option('-d', '--directory', dest='dest', default=None, help='directory to checkout repository to')
|
||||||
|
|
|
@ -22,11 +22,11 @@ __metaclass__ = type
|
||||||
import os
|
import os
|
||||||
import sys
|
import sys
|
||||||
|
|
||||||
|
from ansible.cli import CLI
|
||||||
from ansible.errors import AnsibleError, AnsibleOptionsError
|
from ansible.errors import AnsibleError, AnsibleOptionsError
|
||||||
|
from ansible.module_utils._text import to_text, to_bytes
|
||||||
from ansible.parsing.dataloader import DataLoader
|
from ansible.parsing.dataloader import DataLoader
|
||||||
from ansible.parsing.vault import VaultEditor
|
from ansible.parsing.vault import VaultEditor
|
||||||
from ansible.cli import CLI
|
|
||||||
from ansible.module_utils._text import to_text, to_bytes
|
|
||||||
|
|
||||||
try:
|
try:
|
||||||
from __main__ import display
|
from __main__ import display
|
||||||
|
|
|
@ -176,15 +176,15 @@ BLACKLIST_EXTS = ('.pyc', '.pyo', '.swp', '.bak', '~', '.rpm', '.md', '.txt')
|
||||||
DEFAULT_COW_WHITELIST = ['bud-frogs', 'bunny', 'cheese', 'daemon', 'default', 'dragon', 'elephant-in-snake', 'elephant',
|
DEFAULT_COW_WHITELIST = ['bud-frogs', 'bunny', 'cheese', 'daemon', 'default', 'dragon', 'elephant-in-snake', 'elephant',
|
||||||
'eyes', 'hellokitty', 'kitty', 'luke-koala', 'meow', 'milk', 'moofasa', 'moose', 'ren', 'sheep',
|
'eyes', 'hellokitty', 'kitty', 'luke-koala', 'meow', 'milk', 'moofasa', 'moose', 'ren', 'sheep',
|
||||||
'small', 'stegosaurus', 'stimpy', 'supermilker', 'three-eyes', 'turkey', 'turtle', 'tux', 'udder',
|
'small', 'stegosaurus', 'stimpy', 'supermilker', 'three-eyes', 'turkey', 'turtle', 'tux', 'udder',
|
||||||
'vader-koala', 'vader', 'www', ]
|
'vader-koala', 'vader', 'www']
|
||||||
|
|
||||||
# sections in config file
|
# sections in config file
|
||||||
DEFAULTS = 'defaults'
|
DEFAULTS = 'defaults'
|
||||||
|
|
||||||
#### DEPRECATED VARS ### # FIXME: add deprecation warning when these get set
|
# DEPRECATED VARS # FIXME: add deprecation warning when these get set
|
||||||
# none left now
|
# none left now
|
||||||
|
|
||||||
#### DEPRECATED FEATURE TOGGLES: these will eventually be removed as it becomes the standard ####
|
# DEPRECATED FEATURE TOGGLES: these will eventually be removed as it becomes the standard
|
||||||
|
|
||||||
# If --tags or --skip-tags is given multiple times on the CLI and this is True, merge the lists of tags together.
|
# If --tags or --skip-tags is given multiple times on the CLI and this is True, merge the lists of tags together.
|
||||||
# If False, let the last argument overwrite any previous ones.
|
# If False, let the last argument overwrite any previous ones.
|
||||||
|
@ -194,7 +194,7 @@ MERGE_MULTIPLE_CLI_TAGS = get_config(p, DEFAULTS, 'merge_multiple_cli_tags', '
|
||||||
# Controls which 'precedence path' to take, remove when decide on which!
|
# Controls which 'precedence path' to take, remove when decide on which!
|
||||||
SOURCE_OVER_GROUPS = get_config(p, 'vars', 'source_over_groups', 'ANSIBLE_SOURCE_OVER_GROUPS', True, value_type='boolean')
|
SOURCE_OVER_GROUPS = get_config(p, 'vars', 'source_over_groups', 'ANSIBLE_SOURCE_OVER_GROUPS', True, value_type='boolean')
|
||||||
|
|
||||||
#### GENERALLY CONFIGURABLE THINGS ####
|
# GENERALLY CONFIGURABLE THINGS ####
|
||||||
DEFAULT_DEBUG = get_config(p, DEFAULTS, 'debug', 'ANSIBLE_DEBUG', False, value_type='boolean')
|
DEFAULT_DEBUG = get_config(p, DEFAULTS, 'debug', 'ANSIBLE_DEBUG', False, value_type='boolean')
|
||||||
DEFAULT_VERBOSITY = get_config(p, DEFAULTS, 'verbosity', 'ANSIBLE_VERBOSITY', 0, value_type='integer')
|
DEFAULT_VERBOSITY = get_config(p, DEFAULTS, 'verbosity', 'ANSIBLE_VERBOSITY', 0, value_type='integer')
|
||||||
DEFAULT_ROLES_PATH = get_config(p, DEFAULTS, 'roles_path', 'ANSIBLE_ROLES_PATH',
|
DEFAULT_ROLES_PATH = get_config(p, DEFAULTS, 'roles_path', 'ANSIBLE_ROLES_PATH',
|
||||||
|
|
|
@ -20,8 +20,8 @@ from __future__ import (absolute_import, division, print_function)
|
||||||
__metaclass__ = type
|
__metaclass__ = type
|
||||||
|
|
||||||
import os
|
import os
|
||||||
import sys
|
|
||||||
import re
|
import re
|
||||||
|
import sys
|
||||||
|
|
||||||
from ansible import constants as C
|
from ansible import constants as C
|
||||||
from ansible.errors import AnsibleError
|
from ansible.errors import AnsibleError
|
||||||
|
@ -39,6 +39,7 @@ except ImportError:
|
||||||
from ansible.utils.display import Display
|
from ansible.utils.display import Display
|
||||||
display = Display()
|
display = Display()
|
||||||
|
|
||||||
|
|
||||||
class InventoryData(object):
|
class InventoryData(object):
|
||||||
"""
|
"""
|
||||||
Holds inventory data (host and group objects).
|
Holds inventory data (host and group objects).
|
||||||
|
@ -103,7 +104,6 @@ class InventoryData(object):
|
||||||
|
|
||||||
return new_host
|
return new_host
|
||||||
|
|
||||||
|
|
||||||
def _scan_groups_for_host(self, hostname, localhost=False):
|
def _scan_groups_for_host(self, hostname, localhost=False):
|
||||||
''' in case something did not update inventory correctly, fallback to group scan '''
|
''' in case something did not update inventory correctly, fallback to group scan '''
|
||||||
|
|
||||||
|
@ -121,7 +121,6 @@ class InventoryData(object):
|
||||||
|
|
||||||
return found
|
return found
|
||||||
|
|
||||||
|
|
||||||
def reconcile_inventory(self):
|
def reconcile_inventory(self):
|
||||||
''' Ensure inventory basic rules, run after updates '''
|
''' Ensure inventory basic rules, run after updates '''
|
||||||
|
|
||||||
|
@ -190,7 +189,6 @@ class InventoryData(object):
|
||||||
|
|
||||||
return matching_host
|
return matching_host
|
||||||
|
|
||||||
|
|
||||||
def add_group(self, group):
|
def add_group(self, group):
|
||||||
''' adds a group to inventory if not there already '''
|
''' adds a group to inventory if not there already '''
|
||||||
|
|
||||||
|
@ -238,7 +236,6 @@ class InventoryData(object):
|
||||||
self._groups_dict_cache = {}
|
self._groups_dict_cache = {}
|
||||||
display.debug("Added host %s to group %s" % (host, group))
|
display.debug("Added host %s to group %s" % (host, group))
|
||||||
|
|
||||||
|
|
||||||
def set_variable(self, entity, varname, value):
|
def set_variable(self, entity, varname, value):
|
||||||
''' sets a varible for an inventory object '''
|
''' sets a varible for an inventory object '''
|
||||||
|
|
||||||
|
@ -252,7 +249,6 @@ class InventoryData(object):
|
||||||
inv_object.set_variable(varname, value)
|
inv_object.set_variable(varname, value)
|
||||||
display.debug('set %s for %s' % (varname, entity))
|
display.debug('set %s for %s' % (varname, entity))
|
||||||
|
|
||||||
|
|
||||||
def add_child(self, group, child):
|
def add_child(self, group, child):
|
||||||
''' Add host or group to group '''
|
''' Add host or group to group '''
|
||||||
|
|
||||||
|
@ -278,4 +274,3 @@ class InventoryData(object):
|
||||||
self._groups_dict_cache[group_name] = [h.name for h in group.get_hosts()]
|
self._groups_dict_cache[group_name] = [h.name for h in group.get_hosts()]
|
||||||
|
|
||||||
return self._groups_dict_cache
|
return self._groups_dict_cache
|
||||||
|
|
||||||
|
|
|
@ -20,6 +20,7 @@ __metaclass__ = type
|
||||||
from ansible.errors import AnsibleError
|
from ansible.errors import AnsibleError
|
||||||
from ansible.utils.vars import combine_vars
|
from ansible.utils.vars import combine_vars
|
||||||
|
|
||||||
|
|
||||||
class Group:
|
class Group:
|
||||||
''' a group of ansible hosts '''
|
''' a group of ansible hosts '''
|
||||||
|
|
||||||
|
@ -182,4 +183,3 @@ class Group:
|
||||||
except TypeError:
|
except TypeError:
|
||||||
# FIXME: warn about invalid priority
|
# FIXME: warn about invalid priority
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
|
|
@ -24,6 +24,7 @@ from ansible.utils.vars import combine_vars, get_unique_id
|
||||||
|
|
||||||
__all__ = ['Host']
|
__all__ = ['Host']
|
||||||
|
|
||||||
|
|
||||||
class Host:
|
class Host:
|
||||||
''' a single ansible host '''
|
''' a single ansible host '''
|
||||||
|
|
||||||
|
@ -100,7 +101,6 @@ class Host:
|
||||||
def get_name(self):
|
def get_name(self):
|
||||||
return self.name
|
return self.name
|
||||||
|
|
||||||
|
|
||||||
def populate_ancestors(self):
|
def populate_ancestors(self):
|
||||||
# populate ancestors
|
# populate ancestors
|
||||||
for group in self.groups:
|
for group in self.groups:
|
||||||
|
@ -131,7 +131,6 @@ class Host:
|
||||||
else:
|
else:
|
||||||
self.remove_group(oldg)
|
self.remove_group(oldg)
|
||||||
|
|
||||||
|
|
||||||
def set_variable(self, key, value):
|
def set_variable(self, key, value):
|
||||||
self.vars[key] = value
|
self.vars[key] = value
|
||||||
|
|
||||||
|
@ -148,4 +147,3 @@ class Host:
|
||||||
|
|
||||||
def get_vars(self):
|
def get_vars(self):
|
||||||
return combine_vars(self.vars, self.get_magic_vars())
|
return combine_vars(self.vars, self.get_magic_vars())
|
||||||
|
|
||||||
|
|
|
@ -47,6 +47,7 @@ IGNORED_EXTS = [b'%s$' % to_bytes(re.escape(x)) for x in C.INVENTORY_IGNORE_EXTS
|
||||||
|
|
||||||
IGNORED = re.compile(b'|'.join(IGNORED_ALWAYS + IGNORED_PATTERNS + IGNORED_EXTS))
|
IGNORED = re.compile(b'|'.join(IGNORED_ALWAYS + IGNORED_PATTERNS + IGNORED_EXTS))
|
||||||
|
|
||||||
|
|
||||||
def order_patterns(patterns):
|
def order_patterns(patterns):
|
||||||
''' takes a list of patterns and reorders them by modifier to apply them consistently '''
|
''' takes a list of patterns and reorders them by modifier to apply them consistently '''
|
||||||
|
|
||||||
|
@ -114,6 +115,7 @@ def split_host_pattern(pattern):
|
||||||
|
|
||||||
return [p.strip() for p in patterns]
|
return [p.strip() for p in patterns]
|
||||||
|
|
||||||
|
|
||||||
class InventoryManager(object):
|
class InventoryManager(object):
|
||||||
''' Creates and manages inventory '''
|
''' Creates and manages inventory '''
|
||||||
|
|
||||||
|
@ -365,7 +367,6 @@ class InventoryManager(object):
|
||||||
|
|
||||||
return hosts
|
return hosts
|
||||||
|
|
||||||
|
|
||||||
def _evaluate_patterns(self, patterns):
|
def _evaluate_patterns(self, patterns):
|
||||||
"""
|
"""
|
||||||
Takes a list of patterns and returns a list of matching host names,
|
Takes a list of patterns and returns a list of matching host names,
|
||||||
|
|
|
@ -44,6 +44,7 @@ AXAPI_VPORT_PROTOCOLS = {
|
||||||
'https': 12,
|
'https': 12,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
def a10_argument_spec():
|
def a10_argument_spec():
|
||||||
return dict(
|
return dict(
|
||||||
host=dict(type='str', required=True),
|
host=dict(type='str', required=True),
|
||||||
|
@ -52,11 +53,13 @@ def a10_argument_spec():
|
||||||
write_config=dict(type='bool', default=False)
|
write_config=dict(type='bool', default=False)
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
def axapi_failure(result):
|
def axapi_failure(result):
|
||||||
if 'response' in result and result['response'].get('status') == 'fail':
|
if 'response' in result and result['response'].get('status') == 'fail':
|
||||||
return True
|
return True
|
||||||
return False
|
return False
|
||||||
|
|
||||||
|
|
||||||
def axapi_call(module, url, post=None):
|
def axapi_call(module, url, post=None):
|
||||||
'''
|
'''
|
||||||
Returns a datastructure based on the result of the API call
|
Returns a datastructure based on the result of the API call
|
||||||
|
@ -81,6 +84,7 @@ def axapi_call(module, url, post=None):
|
||||||
rsp.close()
|
rsp.close()
|
||||||
return data
|
return data
|
||||||
|
|
||||||
|
|
||||||
def axapi_authenticate(module, base_url, username, password):
|
def axapi_authenticate(module, base_url, username, password):
|
||||||
url = '%s&method=authenticate&username=%s&password=%s' % (base_url, username, password)
|
url = '%s&method=authenticate&username=%s&password=%s' % (base_url, username, password)
|
||||||
result = axapi_call(module, url)
|
result = axapi_call(module, url)
|
||||||
|
@ -89,6 +93,7 @@ def axapi_authenticate(module, base_url, username, password):
|
||||||
sessid = result['session_id']
|
sessid = result['session_id']
|
||||||
return base_url + '&session_id=' + sessid
|
return base_url + '&session_id=' + sessid
|
||||||
|
|
||||||
|
|
||||||
def axapi_authenticate_v3(module, base_url, username, password):
|
def axapi_authenticate_v3(module, base_url, username, password):
|
||||||
url = base_url
|
url = base_url
|
||||||
auth_payload = {"credentials": {"username": username, "password": password}}
|
auth_payload = {"credentials": {"username": username, "password": password}}
|
||||||
|
@ -98,6 +103,7 @@ def axapi_authenticate_v3(module, base_url, username, password):
|
||||||
signature = result['authresponse']['signature']
|
signature = result['authresponse']['signature']
|
||||||
return signature
|
return signature
|
||||||
|
|
||||||
|
|
||||||
def axapi_call_v3(module, url, method=None, body=None, signature=None):
|
def axapi_call_v3(module, url, method=None, body=None, signature=None):
|
||||||
'''
|
'''
|
||||||
Returns a datastructure based on the result of the API call
|
Returns a datastructure based on the result of the API call
|
||||||
|
@ -126,6 +132,7 @@ def axapi_call_v3(module, url, method=None, body=None, signature=None):
|
||||||
rsp.close()
|
rsp.close()
|
||||||
return data
|
return data
|
||||||
|
|
||||||
|
|
||||||
def axapi_enabled_disabled(flag):
|
def axapi_enabled_disabled(flag):
|
||||||
'''
|
'''
|
||||||
The axapi uses 0/1 integer values for flags, rather than strings
|
The axapi uses 0/1 integer values for flags, rather than strings
|
||||||
|
@ -137,8 +144,10 @@ def axapi_enabled_disabled(flag):
|
||||||
else:
|
else:
|
||||||
return 0
|
return 0
|
||||||
|
|
||||||
|
|
||||||
def axapi_get_port_protocol(protocol):
|
def axapi_get_port_protocol(protocol):
|
||||||
return AXAPI_PORT_PROTOCOLS.get(protocol.lower(), None)
|
return AXAPI_PORT_PROTOCOLS.get(protocol.lower(), None)
|
||||||
|
|
||||||
|
|
||||||
def axapi_get_vport_protocol(protocol):
|
def axapi_get_vport_protocol(protocol):
|
||||||
return AXAPI_VPORT_PROTOCOLS.get(protocol.lower(), None)
|
return AXAPI_VPORT_PROTOCOLS.get(protocol.lower(), None)
|
||||||
|
|
|
@ -37,8 +37,8 @@ from ansible.module_utils.aos import *
|
||||||
"""
|
"""
|
||||||
import json
|
import json
|
||||||
|
|
||||||
from distutils.version import LooseVersion
|
|
||||||
from ansible.module_utils.pycompat24 import get_exception
|
from ansible.module_utils.pycompat24 import get_exception
|
||||||
|
from distutils.version import LooseVersion
|
||||||
|
|
||||||
try:
|
try:
|
||||||
import yaml
|
import yaml
|
||||||
|
@ -53,6 +53,7 @@ try:
|
||||||
except ImportError:
|
except ImportError:
|
||||||
HAS_AOS_PYEZ = False
|
HAS_AOS_PYEZ = False
|
||||||
|
|
||||||
|
|
||||||
def check_aos_version(module, min=False):
|
def check_aos_version(module, min=False):
|
||||||
"""
|
"""
|
||||||
Check if the library aos-pyez is present.
|
Check if the library aos-pyez is present.
|
||||||
|
@ -71,6 +72,7 @@ def check_aos_version(module, min=False):
|
||||||
|
|
||||||
return True
|
return True
|
||||||
|
|
||||||
|
|
||||||
def get_aos_session(module, auth):
|
def get_aos_session(module, auth):
|
||||||
"""
|
"""
|
||||||
Resume an existing session and return an AOS object.
|
Resume an existing session and return an AOS object.
|
||||||
|
@ -94,6 +96,7 @@ def get_aos_session(module, auth):
|
||||||
|
|
||||||
return aos
|
return aos
|
||||||
|
|
||||||
|
|
||||||
def find_collection_item(collection, item_name=False, item_id=False):
|
def find_collection_item(collection, item_name=False, item_id=False):
|
||||||
"""
|
"""
|
||||||
Find collection_item based on name or id from a collection object
|
Find collection_item based on name or id from a collection object
|
||||||
|
@ -114,6 +117,7 @@ def find_collection_item(collection, item_name=False, item_id=False):
|
||||||
else:
|
else:
|
||||||
return my_dict
|
return my_dict
|
||||||
|
|
||||||
|
|
||||||
def content_to_dict(module, content):
|
def content_to_dict(module, content):
|
||||||
"""
|
"""
|
||||||
Convert 'content' into a Python Dict based on 'content_format'
|
Convert 'content' into a Python Dict based on 'content_format'
|
||||||
|
@ -144,12 +148,12 @@ def content_to_dict(module, content):
|
||||||
except:
|
except:
|
||||||
module.fail_json(msg="Unable to convert 'content' to a dict, please check if valid")
|
module.fail_json(msg="Unable to convert 'content' to a dict, please check if valid")
|
||||||
|
|
||||||
|
|
||||||
# replace the string with the dict
|
# replace the string with the dict
|
||||||
module.params['content'] = content_dict
|
module.params['content'] = content_dict
|
||||||
|
|
||||||
return content_dict
|
return content_dict
|
||||||
|
|
||||||
|
|
||||||
def do_load_resource(module, collection, name):
|
def do_load_resource(module, collection, name):
|
||||||
"""
|
"""
|
||||||
Create a new object (collection.item) by loading a datastructure directly
|
Create a new object (collection.item) by loading a datastructure directly
|
||||||
|
@ -161,10 +165,7 @@ def do_load_resource(module, collection, name):
|
||||||
module.fail_json(msg="An error occurred while running 'find_collection_item'")
|
module.fail_json(msg="An error occurred while running 'find_collection_item'")
|
||||||
|
|
||||||
if item.exists:
|
if item.exists:
|
||||||
module.exit_json( changed=False,
|
module.exit_json(changed=False, name=item.name, id=item.id, value=item.value)
|
||||||
name=item.name,
|
|
||||||
id=item.id,
|
|
||||||
value=item.value )
|
|
||||||
|
|
||||||
# If not in check mode, apply the changes
|
# If not in check mode, apply the changes
|
||||||
if not module.check_mode:
|
if not module.check_mode:
|
||||||
|
@ -175,7 +176,4 @@ def do_load_resource(module, collection, name):
|
||||||
e = get_exception()
|
e = get_exception()
|
||||||
module.fail_json(msg="Unable to write item content : %r" % e)
|
module.fail_json(msg="Unable to write item content : %r" % e)
|
||||||
|
|
||||||
module.exit_json( changed=True,
|
module.exit_json(changed=True, name=item.name, id=item.id, value=item.value)
|
||||||
name=item.name,
|
|
||||||
id=item.id,
|
|
||||||
value=item.value )
|
|
||||||
|
|
|
@ -40,6 +40,7 @@ The 'api' module provides the following common argument specs:
|
||||||
"""
|
"""
|
||||||
import time
|
import time
|
||||||
|
|
||||||
|
|
||||||
def rate_limit_argument_spec(spec=None):
|
def rate_limit_argument_spec(spec=None):
|
||||||
"""Creates an argument spec for working with rate limiting"""
|
"""Creates an argument spec for working with rate limiting"""
|
||||||
arg_spec = (dict(
|
arg_spec = (dict(
|
||||||
|
@ -50,6 +51,7 @@ def rate_limit_argument_spec(spec=None):
|
||||||
arg_spec.update(spec)
|
arg_spec.update(spec)
|
||||||
return arg_spec
|
return arg_spec
|
||||||
|
|
||||||
|
|
||||||
def retry_argument_spec(spec=None):
|
def retry_argument_spec(spec=None):
|
||||||
"""Creates an argument spec for working with retrying"""
|
"""Creates an argument spec for working with retrying"""
|
||||||
arg_spec = (dict(
|
arg_spec = (dict(
|
||||||
|
@ -60,24 +62,28 @@ def retry_argument_spec(spec=None):
|
||||||
arg_spec.update(spec)
|
arg_spec.update(spec)
|
||||||
return arg_spec
|
return arg_spec
|
||||||
|
|
||||||
|
|
||||||
def basic_auth_argument_spec(spec=None):
|
def basic_auth_argument_spec(spec=None):
|
||||||
arg_spec = (dict(
|
arg_spec = (dict(
|
||||||
api_username=dict(type='str', required=False),
|
api_username=dict(type='str'),
|
||||||
api_password=dict(type='str', required=False, no_log=True),
|
api_password=dict(type='str', no_log=True),
|
||||||
api_url=dict(type='str', required=False),
|
api_url=dict(type='str'),
|
||||||
validate_certs=dict(type='bool', default=True)
|
validate_certs=dict(type='bool', default=True)
|
||||||
))
|
))
|
||||||
if spec:
|
if spec:
|
||||||
arg_spec.update(spec)
|
arg_spec.update(spec)
|
||||||
return arg_spec
|
return arg_spec
|
||||||
|
|
||||||
|
|
||||||
def rate_limit(rate=None, rate_limit=None):
|
def rate_limit(rate=None, rate_limit=None):
|
||||||
"""rate limiting decorator"""
|
"""rate limiting decorator"""
|
||||||
minrate = None
|
minrate = None
|
||||||
if rate is not None and rate_limit is not None:
|
if rate is not None and rate_limit is not None:
|
||||||
minrate = float(rate_limit) / float(rate)
|
minrate = float(rate_limit) / float(rate)
|
||||||
|
|
||||||
def wrapper(f):
|
def wrapper(f):
|
||||||
last = [0.0]
|
last = [0.0]
|
||||||
|
|
||||||
def ratelimited(*args, **kwargs):
|
def ratelimited(*args, **kwargs):
|
||||||
if minrate is not None:
|
if minrate is not None:
|
||||||
elapsed = time.clock() - last[0]
|
elapsed = time.clock() - last[0]
|
||||||
|
@ -87,13 +93,16 @@ def rate_limit(rate=None, rate_limit=None):
|
||||||
last[0] = time.clock()
|
last[0] = time.clock()
|
||||||
ret = f(*args, **kwargs)
|
ret = f(*args, **kwargs)
|
||||||
return ret
|
return ret
|
||||||
|
|
||||||
return ratelimited
|
return ratelimited
|
||||||
return wrapper
|
return wrapper
|
||||||
|
|
||||||
|
|
||||||
def retry(retries=None, retry_pause=1):
|
def retry(retries=None, retry_pause=1):
|
||||||
"""Retry decorator"""
|
"""Retry decorator"""
|
||||||
def wrapper(f):
|
def wrapper(f):
|
||||||
retry_count = 0
|
retry_count = 0
|
||||||
|
|
||||||
def retried(*args, **kwargs):
|
def retried(*args, **kwargs):
|
||||||
if retries is not None:
|
if retries is not None:
|
||||||
ret = None
|
ret = None
|
||||||
|
@ -109,6 +118,6 @@ def retry(retries=None, retry_pause=1):
|
||||||
break
|
break
|
||||||
time.sleep(retry_pause)
|
time.sleep(retry_pause)
|
||||||
return ret
|
return ret
|
||||||
|
|
||||||
return retried
|
return retried
|
||||||
return wrapper
|
return wrapper
|
||||||
|
|
||||||
|
|
|
@ -25,7 +25,6 @@
|
||||||
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||||
# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
|
# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
|
||||||
# USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
# USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
#
|
|
||||||
|
|
||||||
# This module initially matched the namespace of network module avi. However,
|
# This module initially matched the namespace of network module avi. However,
|
||||||
# that causes namespace import error when other modules from avi namespaces
|
# that causes namespace import error when other modules from avi namespaces
|
||||||
|
@ -40,8 +39,7 @@ HAS_AVI = True
|
||||||
try:
|
try:
|
||||||
import avi.sdk
|
import avi.sdk
|
||||||
sdk_version = getattr(avi.sdk, '__version__', None)
|
sdk_version = getattr(avi.sdk, '__version__', None)
|
||||||
if ((sdk_version is None) or (sdk_version and
|
if ((sdk_version is None) or (sdk_version and (parse_version(sdk_version) < parse_version('17.1')))):
|
||||||
(parse_version(sdk_version) < parse_version('17.1')))):
|
|
||||||
# It allows the __version__ to be '' as that value is used in development builds
|
# It allows the __version__ to be '' as that value is used in development builds
|
||||||
raise ImportError
|
raise ImportError
|
||||||
from avi.sdk.utils.ansible_utils import avi_ansible_api
|
from avi.sdk.utils.ansible_utils import avi_ansible_api
|
||||||
|
|
|
@ -1,4 +1,3 @@
|
||||||
#
|
|
||||||
# Copyright (c) 2016 Matt Davis, <mdavis@ansible.com>
|
# Copyright (c) 2016 Matt Davis, <mdavis@ansible.com>
|
||||||
# Chris Houseknecht, <house@redhat.com>
|
# Chris Houseknecht, <house@redhat.com>
|
||||||
#
|
#
|
||||||
|
@ -16,7 +15,6 @@
|
||||||
#
|
#
|
||||||
# You should have received a copy of the GNU General Public License
|
# You should have received a copy of the GNU General Public License
|
||||||
# along with Ansible. If not, see <http://www.gnu.org/licenses/>.
|
# along with Ansible. If not, see <http://www.gnu.org/licenses/>.
|
||||||
#
|
|
||||||
|
|
||||||
import json
|
import json
|
||||||
import os
|
import os
|
||||||
|
@ -102,6 +100,7 @@ except ImportError as exc:
|
||||||
HAS_AZURE_EXC = exc
|
HAS_AZURE_EXC = exc
|
||||||
HAS_AZURE = False
|
HAS_AZURE = False
|
||||||
|
|
||||||
|
|
||||||
def azure_id_to_dict(id):
|
def azure_id_to_dict(id):
|
||||||
pieces = re.sub(r'^\/', '', id).split('/')
|
pieces = re.sub(r'^\/', '', id).split('/')
|
||||||
result = {}
|
result = {}
|
||||||
|
@ -121,6 +120,7 @@ AZURE_EXPECTED_VERSIONS = dict(
|
||||||
|
|
||||||
AZURE_MIN_RELEASE = '2.0.0rc5'
|
AZURE_MIN_RELEASE = '2.0.0rc5'
|
||||||
|
|
||||||
|
|
||||||
class AzureRMModuleBase(object):
|
class AzureRMModuleBase(object):
|
||||||
|
|
||||||
def __init__(self, derived_arg_spec, bypass_checks=False, no_log=False,
|
def __init__(self, derived_arg_spec, bypass_checks=False, no_log=False,
|
||||||
|
|
|
@ -32,7 +32,17 @@ BOOLEANS_TRUE = ['y', 'yes', 'on', '1', 'true', 1, True]
|
||||||
BOOLEANS_FALSE = ['n', 'no', 'off', '0', 'false', 0, False]
|
BOOLEANS_FALSE = ['n', 'no', 'off', '0', 'false', 0, False]
|
||||||
BOOLEANS = BOOLEANS_TRUE + BOOLEANS_FALSE
|
BOOLEANS = BOOLEANS_TRUE + BOOLEANS_FALSE
|
||||||
|
|
||||||
SIZE_RANGES = { 'Y': 1<<80, 'Z': 1<<70, 'E': 1<<60, 'P': 1<<50, 'T': 1<<40, 'G': 1<<30, 'M': 1<<20, 'K': 1<<10, 'B': 1 }
|
SIZE_RANGES = {
|
||||||
|
'Y': 1 << 80,
|
||||||
|
'Z': 1 << 70,
|
||||||
|
'E': 1 << 60,
|
||||||
|
'P': 1 << 50,
|
||||||
|
'T': 1 << 40,
|
||||||
|
'G': 1 << 30,
|
||||||
|
'M': 1 << 20,
|
||||||
|
'K': 1 << 10,
|
||||||
|
'B': 1,
|
||||||
|
}
|
||||||
|
|
||||||
FILE_ATTRIBUTES = {
|
FILE_ATTRIBUTES = {
|
||||||
'A': 'noatime',
|
'A': 'noatime',
|
||||||
|
@ -161,8 +171,16 @@ except ImportError:
|
||||||
pass
|
pass
|
||||||
|
|
||||||
from ansible.module_utils.pycompat24 import get_exception, literal_eval
|
from ansible.module_utils.pycompat24 import get_exception, literal_eval
|
||||||
from ansible.module_utils.six import (PY2, PY3, b, binary_type, integer_types,
|
from ansible.module_utils.six import (
|
||||||
iteritems, text_type, string_types)
|
PY2,
|
||||||
|
PY3,
|
||||||
|
b,
|
||||||
|
binary_type,
|
||||||
|
integer_types,
|
||||||
|
iteritems,
|
||||||
|
string_types,
|
||||||
|
text_type,
|
||||||
|
)
|
||||||
from ansible.module_utils.six.moves import map, reduce, shlex_quote
|
from ansible.module_utils.six.moves import map, reduce, shlex_quote
|
||||||
from ansible.module_utils._text import to_native, to_bytes, to_text
|
from ansible.module_utils._text import to_native, to_bytes, to_text
|
||||||
|
|
||||||
|
@ -242,6 +260,7 @@ def get_platform():
|
||||||
''' what's the platform? example: Linux is a platform. '''
|
''' what's the platform? example: Linux is a platform. '''
|
||||||
return platform.system()
|
return platform.system()
|
||||||
|
|
||||||
|
|
||||||
def get_distribution():
|
def get_distribution():
|
||||||
''' return the distribution name '''
|
''' return the distribution name '''
|
||||||
if platform.system() == 'Linux':
|
if platform.system() == 'Linux':
|
||||||
|
@ -261,6 +280,7 @@ def get_distribution():
|
||||||
distribution = None
|
distribution = None
|
||||||
return distribution
|
return distribution
|
||||||
|
|
||||||
|
|
||||||
def get_distribution_version():
|
def get_distribution_version():
|
||||||
''' return the distribution version '''
|
''' return the distribution version '''
|
||||||
if platform.system() == 'Linux':
|
if platform.system() == 'Linux':
|
||||||
|
@ -275,6 +295,7 @@ def get_distribution_version():
|
||||||
distribution_version = None
|
distribution_version = None
|
||||||
return distribution_version
|
return distribution_version
|
||||||
|
|
||||||
|
|
||||||
def get_all_subclasses(cls):
|
def get_all_subclasses(cls):
|
||||||
'''
|
'''
|
||||||
used by modules like Hardware or Network fact classes to retrieve all subclasses of a given class.
|
used by modules like Hardware or Network fact classes to retrieve all subclasses of a given class.
|
||||||
|
@ -338,6 +359,7 @@ def json_dict_unicode_to_bytes(d, encoding='utf-8', errors='surrogate_or_strict'
|
||||||
else:
|
else:
|
||||||
return d
|
return d
|
||||||
|
|
||||||
|
|
||||||
def json_dict_bytes_to_unicode(d, encoding='utf-8', errors='surrogate_or_strict'):
|
def json_dict_bytes_to_unicode(d, encoding='utf-8', errors='surrogate_or_strict'):
|
||||||
''' Recursively convert dict keys and values to byte str
|
''' Recursively convert dict keys and values to byte str
|
||||||
|
|
||||||
|
@ -357,6 +379,7 @@ def json_dict_bytes_to_unicode(d, encoding='utf-8', errors='surrogate_or_strict'
|
||||||
else:
|
else:
|
||||||
return d
|
return d
|
||||||
|
|
||||||
|
|
||||||
def return_values(obj):
|
def return_values(obj):
|
||||||
""" Return native stringified values from datastructures.
|
""" Return native stringified values from datastructures.
|
||||||
|
|
||||||
|
@ -381,6 +404,7 @@ def return_values(obj):
|
||||||
else:
|
else:
|
||||||
raise TypeError('Unknown parameter type: %s, %s' % (type(obj), obj))
|
raise TypeError('Unknown parameter type: %s, %s' % (type(obj), obj))
|
||||||
|
|
||||||
|
|
||||||
def remove_values(value, no_log_strings):
|
def remove_values(value, no_log_strings):
|
||||||
""" Remove strings in no_log_strings from value. If value is a container
|
""" Remove strings in no_log_strings from value. If value is a container
|
||||||
type, then remove a lot more"""
|
type, then remove a lot more"""
|
||||||
|
@ -489,6 +513,7 @@ def heuristic_log_sanitize(data, no_log_values=None):
|
||||||
output = remove_values(output, no_log_values)
|
output = remove_values(output, no_log_values)
|
||||||
return output
|
return output
|
||||||
|
|
||||||
|
|
||||||
def bytes_to_human(size, isbits=False, unit=None):
|
def bytes_to_human(size, isbits=False, unit=None):
|
||||||
|
|
||||||
base = 'Bytes'
|
base = 'Bytes'
|
||||||
|
@ -507,6 +532,7 @@ def bytes_to_human(size, isbits=False, unit=None):
|
||||||
|
|
||||||
return '%.2f %s' % (float(size) / limit, suffix)
|
return '%.2f %s' % (float(size) / limit, suffix)
|
||||||
|
|
||||||
|
|
||||||
def human_to_bytes(number, default_unit=None, isbits=False):
|
def human_to_bytes(number, default_unit=None, isbits=False):
|
||||||
|
|
||||||
'''
|
'''
|
||||||
|
@ -555,6 +581,7 @@ def human_to_bytes(number, default_unit=None, isbits=False):
|
||||||
|
|
||||||
return int(round(num * limit))
|
return int(round(num * limit))
|
||||||
|
|
||||||
|
|
||||||
def is_executable(path):
|
def is_executable(path):
|
||||||
'''is the given path executable?
|
'''is the given path executable?
|
||||||
|
|
||||||
|
@ -568,6 +595,7 @@ def is_executable(path):
|
||||||
# execute bits are set.
|
# execute bits are set.
|
||||||
return ((stat.S_IXUSR | stat.S_IXGRP | stat.S_IXOTH) & os.stat(path)[stat.ST_MODE])
|
return ((stat.S_IXUSR | stat.S_IXGRP | stat.S_IXOTH) & os.stat(path)[stat.ST_MODE])
|
||||||
|
|
||||||
|
|
||||||
def _load_params():
|
def _load_params():
|
||||||
''' read the modules parameters and store them globally.
|
''' read the modules parameters and store them globally.
|
||||||
|
|
||||||
|
@ -623,6 +651,7 @@ def _load_params():
|
||||||
'"failed": true}')
|
'"failed": true}')
|
||||||
sys.exit(1)
|
sys.exit(1)
|
||||||
|
|
||||||
|
|
||||||
def env_fallback(*args, **kwargs):
|
def env_fallback(*args, **kwargs):
|
||||||
''' Load value from environment '''
|
''' Load value from environment '''
|
||||||
for arg in args:
|
for arg in args:
|
||||||
|
@ -631,6 +660,7 @@ def env_fallback(*args, **kwargs):
|
||||||
else:
|
else:
|
||||||
raise AnsibleFallbackNotFound
|
raise AnsibleFallbackNotFound
|
||||||
|
|
||||||
|
|
||||||
def _lenient_lowercase(lst):
|
def _lenient_lowercase(lst):
|
||||||
"""Lowercase elements of a list.
|
"""Lowercase elements of a list.
|
||||||
|
|
||||||
|
@ -644,6 +674,7 @@ def _lenient_lowercase(lst):
|
||||||
lowered.append(value)
|
lowered.append(value)
|
||||||
return lowered
|
return lowered
|
||||||
|
|
||||||
|
|
||||||
def format_attributes(attributes):
|
def format_attributes(attributes):
|
||||||
attribute_list = []
|
attribute_list = []
|
||||||
for attr in attributes:
|
for attr in attributes:
|
||||||
|
@ -651,6 +682,7 @@ def format_attributes(attributes):
|
||||||
attribute_list.append(FILE_ATTRIBUTES[attr])
|
attribute_list.append(FILE_ATTRIBUTES[attr])
|
||||||
return attribute_list
|
return attribute_list
|
||||||
|
|
||||||
|
|
||||||
def get_flags_from_attributes(attributes):
|
def get_flags_from_attributes(attributes):
|
||||||
flags = []
|
flags = []
|
||||||
for key, attr in FILE_ATTRIBUTES.items():
|
for key, attr in FILE_ATTRIBUTES.items():
|
||||||
|
@ -658,6 +690,7 @@ def get_flags_from_attributes(attributes):
|
||||||
flags.append(key)
|
flags.append(key)
|
||||||
return ''.join(flags)
|
return ''.join(flags)
|
||||||
|
|
||||||
|
|
||||||
class AnsibleFallbackNotFound(Exception):
|
class AnsibleFallbackNotFound(Exception):
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
@ -834,7 +867,6 @@ class AnsibleModule(object):
|
||||||
selevel=selevel, secontext=secontext, attributes=attributes,
|
selevel=selevel, secontext=secontext, attributes=attributes,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
# Detect whether using selinux that is MLS-aware.
|
# Detect whether using selinux that is MLS-aware.
|
||||||
# While this means you can set the level/range with
|
# While this means you can set the level/range with
|
||||||
# selinux.lsetfilecon(), it may or may not mean that you
|
# selinux.lsetfilecon(), it may or may not mean that you
|
||||||
|
@ -1194,7 +1226,6 @@ class AnsibleModule(object):
|
||||||
pass
|
pass
|
||||||
return output
|
return output
|
||||||
|
|
||||||
|
|
||||||
def _symbolic_mode_to_octal(self, path_stat, symbolic_mode):
|
def _symbolic_mode_to_octal(self, path_stat, symbolic_mode):
|
||||||
new_mode = stat.S_IMODE(path_stat.st_mode)
|
new_mode = stat.S_IMODE(path_stat.st_mode)
|
||||||
|
|
||||||
|
@ -1247,13 +1278,13 @@ class AnsibleModule(object):
|
||||||
X_perms = {
|
X_perms = {
|
||||||
'u': {'X': stat.S_IXUSR},
|
'u': {'X': stat.S_IXUSR},
|
||||||
'g': {'X': stat.S_IXGRP},
|
'g': {'X': stat.S_IXGRP},
|
||||||
'o': {'X': stat.S_IXOTH}
|
'o': {'X': stat.S_IXOTH},
|
||||||
}
|
}
|
||||||
else:
|
else:
|
||||||
X_perms = {
|
X_perms = {
|
||||||
'u': {'X': 0},
|
'u': {'X': 0},
|
||||||
'g': {'X': 0},
|
'g': {'X': 0},
|
||||||
'o': {'X': 0}
|
'o': {'X': 0},
|
||||||
}
|
}
|
||||||
|
|
||||||
user_perms_to_modes = {
|
user_perms_to_modes = {
|
||||||
|
@ -1265,7 +1296,8 @@ class AnsibleModule(object):
|
||||||
't': 0,
|
't': 0,
|
||||||
'u': prev_mode & stat.S_IRWXU,
|
'u': prev_mode & stat.S_IRWXU,
|
||||||
'g': (prev_mode & stat.S_IRWXG) << 3,
|
'g': (prev_mode & stat.S_IRWXG) << 3,
|
||||||
'o': (prev_mode & stat.S_IRWXO) << 6 },
|
'o': (prev_mode & stat.S_IRWXO) << 6,
|
||||||
|
},
|
||||||
'g': {
|
'g': {
|
||||||
'r': stat.S_IRGRP,
|
'r': stat.S_IRGRP,
|
||||||
'w': stat.S_IWGRP,
|
'w': stat.S_IWGRP,
|
||||||
|
@ -1274,7 +1306,8 @@ class AnsibleModule(object):
|
||||||
't': 0,
|
't': 0,
|
||||||
'u': (prev_mode & stat.S_IRWXU) >> 3,
|
'u': (prev_mode & stat.S_IRWXU) >> 3,
|
||||||
'g': prev_mode & stat.S_IRWXG,
|
'g': prev_mode & stat.S_IRWXG,
|
||||||
'o': (prev_mode & stat.S_IRWXO) << 3 },
|
'o': (prev_mode & stat.S_IRWXO) << 3,
|
||||||
|
},
|
||||||
'o': {
|
'o': {
|
||||||
'r': stat.S_IROTH,
|
'r': stat.S_IROTH,
|
||||||
'w': stat.S_IWOTH,
|
'w': stat.S_IWOTH,
|
||||||
|
@ -1283,14 +1316,17 @@ class AnsibleModule(object):
|
||||||
't': stat.S_ISVTX,
|
't': stat.S_ISVTX,
|
||||||
'u': (prev_mode & stat.S_IRWXU) >> 6,
|
'u': (prev_mode & stat.S_IRWXU) >> 6,
|
||||||
'g': (prev_mode & stat.S_IRWXG) >> 3,
|
'g': (prev_mode & stat.S_IRWXG) >> 3,
|
||||||
'o': prev_mode & stat.S_IRWXO }
|
'o': prev_mode & stat.S_IRWXO,
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
# Insert X_perms into user_perms_to_modes
|
# Insert X_perms into user_perms_to_modes
|
||||||
for key, value in X_perms.items():
|
for key, value in X_perms.items():
|
||||||
user_perms_to_modes[key].update(value)
|
user_perms_to_modes[key].update(value)
|
||||||
|
|
||||||
or_reduce = lambda mode, perm: mode | user_perms_to_modes[user][perm]
|
def or_reduce(mode, perm):
|
||||||
|
return mode | user_perms_to_modes[user][perm]
|
||||||
|
|
||||||
return reduce(or_reduce, perms, 0)
|
return reduce(or_reduce, perms, 0)
|
||||||
|
|
||||||
def set_fs_attributes_if_different(self, file_args, changed, diff=None, expand=True):
|
def set_fs_attributes_if_different(self, file_args, changed, diff=None, expand=True):
|
||||||
|
@ -1703,14 +1739,12 @@ class AnsibleModule(object):
|
||||||
def _check_type_raw(self, value):
|
def _check_type_raw(self, value):
|
||||||
return value
|
return value
|
||||||
|
|
||||||
|
|
||||||
def _check_type_bytes(self, value):
|
def _check_type_bytes(self, value):
|
||||||
try:
|
try:
|
||||||
self.human_to_bytes(value)
|
self.human_to_bytes(value)
|
||||||
except ValueError:
|
except ValueError:
|
||||||
raise TypeError('%s cannot be converted to a Byte value' % type(value))
|
raise TypeError('%s cannot be converted to a Byte value' % type(value))
|
||||||
|
|
||||||
|
|
||||||
def _check_type_bits(self, value):
|
def _check_type_bits(self, value):
|
||||||
try:
|
try:
|
||||||
self.human_to_bytes(value, isbits=True)
|
self.human_to_bytes(value, isbits=True)
|
||||||
|
@ -1773,7 +1807,7 @@ class AnsibleModule(object):
|
||||||
self.params[k] = default
|
self.params[k] = default
|
||||||
|
|
||||||
def _set_fallbacks(self):
|
def _set_fallbacks(self):
|
||||||
for k,v in self.argument_spec.items():
|
for (k, v) in self.argument_spec.items():
|
||||||
fallback = v.get('fallback', (None,))
|
fallback = v.get('fallback', (None,))
|
||||||
fallback_strategy = fallback[0]
|
fallback_strategy = fallback[0]
|
||||||
fallback_args = []
|
fallback_args = []
|
||||||
|
@ -1863,9 +1897,7 @@ class AnsibleModule(object):
|
||||||
if self.boolean(no_log):
|
if self.boolean(no_log):
|
||||||
log_args[param] = 'NOT_LOGGING_PARAMETER'
|
log_args[param] = 'NOT_LOGGING_PARAMETER'
|
||||||
# try to capture all passwords/passphrase named fields missed by no_log
|
# try to capture all passwords/passphrase named fields missed by no_log
|
||||||
elif PASSWORD_MATCH.search(param) and \
|
elif PASSWORD_MATCH.search(param) and arg_opts.get('type', 'str') != 'bool' and not arg_opts.get('choices', False):
|
||||||
arg_opts.get('type', 'str') != 'bool' and \
|
|
||||||
not arg_opts.get('choices', False):
|
|
||||||
# skip boolean and enums as they are about 'password' state
|
# skip boolean and enums as they are about 'password' state
|
||||||
log_args[param] = 'NOT_LOGGING_PASSWORD'
|
log_args[param] = 'NOT_LOGGING_PASSWORD'
|
||||||
self.warn('Module did not set no_log for %s' % param)
|
self.warn('Module did not set no_log for %s' % param)
|
||||||
|
@ -1885,7 +1917,6 @@ class AnsibleModule(object):
|
||||||
|
|
||||||
self.log(msg, log_args=log_args)
|
self.log(msg, log_args=log_args)
|
||||||
|
|
||||||
|
|
||||||
def _set_cwd(self):
|
def _set_cwd(self):
|
||||||
try:
|
try:
|
||||||
cwd = os.getcwd()
|
cwd = os.getcwd()
|
||||||
|
@ -2011,7 +2042,7 @@ class AnsibleModule(object):
|
||||||
def exit_json(self, **kwargs):
|
def exit_json(self, **kwargs):
|
||||||
''' return from the module, without error '''
|
''' return from the module, without error '''
|
||||||
|
|
||||||
if not 'changed' in kwargs:
|
if 'changed' not in kwargs:
|
||||||
kwargs['changed'] = False
|
kwargs['changed'] = False
|
||||||
|
|
||||||
self.do_cleanup_files()
|
self.do_cleanup_files()
|
||||||
|
@ -2024,7 +2055,7 @@ class AnsibleModule(object):
|
||||||
assert 'msg' in kwargs, "implementation error -- msg to explain the error is required"
|
assert 'msg' in kwargs, "implementation error -- msg to explain the error is required"
|
||||||
kwargs['failed'] = True
|
kwargs['failed'] = True
|
||||||
|
|
||||||
if not 'changed' in kwargs:
|
if 'changed' not in kwargs:
|
||||||
kwargs['changed'] = False
|
kwargs['changed'] = False
|
||||||
|
|
||||||
self.do_cleanup_files()
|
self.do_cleanup_files()
|
||||||
|
@ -2261,7 +2292,6 @@ class AnsibleModule(object):
|
||||||
e = get_exception()
|
e = get_exception()
|
||||||
self.fail_json(msg='Could not write data to file (%s) from (%s): %s' % (dest, src, e), exception=traceback.format_exc())
|
self.fail_json(msg='Could not write data to file (%s) from (%s): %s' % (dest, src, e), exception=traceback.format_exc())
|
||||||
|
|
||||||
|
|
||||||
def _read_from_pipes(self, rpipes, rfds, file_descriptor):
|
def _read_from_pipes(self, rpipes, rfds, file_descriptor):
|
||||||
data = b('')
|
data = b('')
|
||||||
if file_descriptor in rfds:
|
if file_descriptor in rfds:
|
||||||
|
@ -2387,9 +2417,9 @@ class AnsibleModule(object):
|
||||||
# Clean out python paths set by ansiballz
|
# Clean out python paths set by ansiballz
|
||||||
if 'PYTHONPATH' in os.environ:
|
if 'PYTHONPATH' in os.environ:
|
||||||
pypaths = os.environ['PYTHONPATH'].split(':')
|
pypaths = os.environ['PYTHONPATH'].split(':')
|
||||||
pypaths = [x for x in pypaths \
|
pypaths = [x for x in pypaths
|
||||||
if not x.endswith('/ansible_modlib.zip') \
|
if not x.endswith('/ansible_modlib.zip') and
|
||||||
and not x.endswith('/debug_dir')]
|
not x.endswith('/debug_dir')]
|
||||||
os.environ['PYTHONPATH'] = ':'.join(pypaths)
|
os.environ['PYTHONPATH'] = ':'.join(pypaths)
|
||||||
if not os.environ['PYTHONPATH']:
|
if not os.environ['PYTHONPATH']:
|
||||||
del os.environ['PYTHONPATH']
|
del os.environ['PYTHONPATH']
|
||||||
|
|
|
@ -25,9 +25,12 @@
|
||||||
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||||
# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
|
# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
|
||||||
# USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
# USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
|
||||||
import json
|
import json
|
||||||
|
|
||||||
from ansible.module_utils.urls import fetch_url
|
from ansible.module_utils.urls import fetch_url
|
||||||
|
|
||||||
|
|
||||||
class Response(object):
|
class Response(object):
|
||||||
|
|
||||||
def __init__(self, resp, info):
|
def __init__(self, resp, info):
|
||||||
|
|
|
@ -25,18 +25,20 @@
|
||||||
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||||
# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
|
# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
|
||||||
# USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
# USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
#
|
|
||||||
|
import signal
|
||||||
import socket
|
import socket
|
||||||
import struct
|
import struct
|
||||||
import signal
|
|
||||||
|
|
||||||
from ansible.module_utils.basic import get_exception
|
from ansible.module_utils.basic import get_exception
|
||||||
from ansible.module_utils._text import to_bytes, to_native
|
from ansible.module_utils._text import to_bytes, to_native
|
||||||
|
|
||||||
|
|
||||||
def send_data(s, data):
|
def send_data(s, data):
|
||||||
packed_len = struct.pack('!Q', len(data))
|
packed_len = struct.pack('!Q', len(data))
|
||||||
return s.sendall(packed_len + data)
|
return s.sendall(packed_len + data)
|
||||||
|
|
||||||
|
|
||||||
def recv_data(s):
|
def recv_data(s):
|
||||||
header_len = 8 # size of a packed unsigned long long
|
header_len = 8 # size of a packed unsigned long long
|
||||||
data = to_bytes("")
|
data = to_bytes("")
|
||||||
|
@ -54,6 +56,7 @@ def recv_data(s):
|
||||||
data += d
|
data += d
|
||||||
return data
|
return data
|
||||||
|
|
||||||
|
|
||||||
def exec_command(module, command):
|
def exec_command(module, command):
|
||||||
try:
|
try:
|
||||||
sf = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
|
sf = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
|
||||||
|
|
|
@ -26,9 +26,11 @@
|
||||||
# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
|
# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
|
||||||
# USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
# USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
|
||||||
|
|
||||||
class SQLParseError(Exception):
|
class SQLParseError(Exception):
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
|
||||||
class UnclosedQuoteError(SQLParseError):
|
class UnclosedQuoteError(SQLParseError):
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
@ -38,6 +40,7 @@ class UnclosedQuoteError(SQLParseError):
|
||||||
_PG_IDENTIFIER_TO_DOT_LEVEL = dict(database=1, schema=2, table=3, column=4, role=1)
|
_PG_IDENTIFIER_TO_DOT_LEVEL = dict(database=1, schema=2, table=3, column=4, role=1)
|
||||||
_MYSQL_IDENTIFIER_TO_DOT_LEVEL = dict(database=1, table=2, column=3, role=1, vars=1)
|
_MYSQL_IDENTIFIER_TO_DOT_LEVEL = dict(database=1, table=2, column=3, role=1, vars=1)
|
||||||
|
|
||||||
|
|
||||||
def _find_end_quote(identifier, quote_char):
|
def _find_end_quote(identifier, quote_char):
|
||||||
accumulate = 0
|
accumulate = 0
|
||||||
while True:
|
while True:
|
||||||
|
@ -113,6 +116,7 @@ def pg_quote_identifier(identifier, id_type):
|
||||||
raise SQLParseError('PostgreSQL does not support %s with more than %i dots' % (id_type, _PG_IDENTIFIER_TO_DOT_LEVEL[id_type]))
|
raise SQLParseError('PostgreSQL does not support %s with more than %i dots' % (id_type, _PG_IDENTIFIER_TO_DOT_LEVEL[id_type]))
|
||||||
return '.'.join(identifier_fragments)
|
return '.'.join(identifier_fragments)
|
||||||
|
|
||||||
|
|
||||||
def mysql_quote_identifier(identifier, id_type):
|
def mysql_quote_identifier(identifier, id_type):
|
||||||
identifier_fragments = _identifier_parse(identifier, quote_char='`')
|
identifier_fragments = _identifier_parse(identifier, quote_char='`')
|
||||||
if len(identifier_fragments) > _MYSQL_IDENTIFIER_TO_DOT_LEVEL[id_type]:
|
if len(identifier_fragments) > _MYSQL_IDENTIFIER_TO_DOT_LEVEL[id_type]:
|
||||||
|
|
|
@ -327,11 +327,10 @@ class AnsibleDockerClient(Client):
|
||||||
def _handle_ssl_error(self, error):
|
def _handle_ssl_error(self, error):
|
||||||
match = re.match(r"hostname.*doesn\'t match (\'.*\')", str(error))
|
match = re.match(r"hostname.*doesn\'t match (\'.*\')", str(error))
|
||||||
if match:
|
if match:
|
||||||
msg = "You asked for verification that Docker host name matches %s. The actual hostname is %s. " \
|
self.fail("You asked for verification that Docker host name matches %s. The actual hostname is %s. "
|
||||||
"Most likely you need to set DOCKER_TLS_HOSTNAME or pass tls_hostname with a value of %s. " \
|
"Most likely you need to set DOCKER_TLS_HOSTNAME or pass tls_hostname with a value of %s. "
|
||||||
"You may also use TLS without verification by setting the tls parameter to true." \
|
"You may also use TLS without verification by setting the tls parameter to true."
|
||||||
% (self.auth_params['tls_hostname'], match.group(1), match.group(1))
|
% (self.auth_params['tls_hostname'], match.group(1), match.group(1)))
|
||||||
self.fail(msg)
|
|
||||||
self.fail("SSL Exception: %s" % (error))
|
self.fail("SSL Exception: %s" % (error))
|
||||||
|
|
||||||
def get_container(self, name=None):
|
def get_container(self, name=None):
|
||||||
|
@ -448,5 +447,3 @@ class AnsibleDockerClient(Client):
|
||||||
new_tag = self.find_image(name, tag)
|
new_tag = self.find_image(name, tag)
|
||||||
|
|
||||||
return new_tag, old_tag == new_tag
|
return new_tag, old_tag == new_tag
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -54,6 +54,7 @@ except:
|
||||||
|
|
||||||
from ansible.module_utils.six import string_types, binary_type, text_type
|
from ansible.module_utils.six import string_types, binary_type, text_type
|
||||||
|
|
||||||
|
|
||||||
class AnsibleAWSError(Exception):
|
class AnsibleAWSError(Exception):
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
@ -98,6 +99,7 @@ def boto3_conn(module, conn_type=None, resource=None, region=None, endpoint=None
|
||||||
module.fail_json(msg='There is an issue in the code of the module. You must specify either both, resource or client to the conn_type '
|
module.fail_json(msg='There is an issue in the code of the module. You must specify either both, resource or client to the conn_type '
|
||||||
'parameter in the boto3_conn function call')
|
'parameter in the boto3_conn function call')
|
||||||
|
|
||||||
|
|
||||||
def _boto3_conn(conn_type=None, resource=None, region=None, endpoint=None, **params):
|
def _boto3_conn(conn_type=None, resource=None, region=None, endpoint=None, **params):
|
||||||
profile = params.pop('profile_name', None)
|
profile = params.pop('profile_name', None)
|
||||||
|
|
||||||
|
@ -120,6 +122,7 @@ def _boto3_conn(conn_type=None, resource=None, region=None, endpoint=None, **par
|
||||||
|
|
||||||
boto3_inventory_conn = _boto3_conn
|
boto3_inventory_conn = _boto3_conn
|
||||||
|
|
||||||
|
|
||||||
def aws_common_argument_spec():
|
def aws_common_argument_spec():
|
||||||
return dict(
|
return dict(
|
||||||
ec2_url=dict(),
|
ec2_url=dict(),
|
||||||
|
@ -291,6 +294,7 @@ def ec2_connect(module):
|
||||||
|
|
||||||
return ec2
|
return ec2
|
||||||
|
|
||||||
|
|
||||||
def paging(pause=0, marker_property='marker'):
|
def paging(pause=0, marker_property='marker'):
|
||||||
""" Adds paging to boto retrieval functions that support a 'marker'
|
""" Adds paging to boto retrieval functions that support a 'marker'
|
||||||
this is configurable as not all boto functions seem to use the
|
this is configurable as not all boto functions seem to use the
|
||||||
|
@ -330,7 +334,6 @@ def camel_dict_to_snake_dict(camel_dict):
|
||||||
|
|
||||||
return all_cap_re.sub(r'\1_\2', s1).lower()
|
return all_cap_re.sub(r'\1_\2', s1).lower()
|
||||||
|
|
||||||
|
|
||||||
def value_is_list(camel_list):
|
def value_is_list(camel_list):
|
||||||
|
|
||||||
checked_list = []
|
checked_list = []
|
||||||
|
@ -344,7 +347,6 @@ def camel_dict_to_snake_dict(camel_dict):
|
||||||
|
|
||||||
return checked_list
|
return checked_list
|
||||||
|
|
||||||
|
|
||||||
snake_dict = {}
|
snake_dict = {}
|
||||||
for k, v in camel_dict.items():
|
for k, v in camel_dict.items():
|
||||||
if isinstance(v, dict):
|
if isinstance(v, dict):
|
||||||
|
@ -491,7 +493,6 @@ def get_ec2_security_group_ids_from_names(sec_group_list, ec2_connection, vpc_id
|
||||||
else:
|
else:
|
||||||
return sg.name
|
return sg.name
|
||||||
|
|
||||||
|
|
||||||
def get_sg_id(sg, boto3):
|
def get_sg_id(sg, boto3):
|
||||||
|
|
||||||
if boto3:
|
if boto3:
|
||||||
|
|
|
@ -56,7 +56,6 @@ def f5_argument_spec():
|
||||||
server_port=dict(
|
server_port=dict(
|
||||||
type='int',
|
type='int',
|
||||||
default=443,
|
default=443,
|
||||||
required=False,
|
|
||||||
fallback=(env_fallback, ['F5_SERVER_PORT'])
|
fallback=(env_fallback, ['F5_SERVER_PORT'])
|
||||||
),
|
),
|
||||||
state=dict(
|
state=dict(
|
||||||
|
@ -80,7 +79,7 @@ def f5_parse_arguments(module):
|
||||||
import ssl
|
import ssl
|
||||||
if not hasattr(ssl, 'SSLContext'):
|
if not hasattr(ssl, 'SSLContext'):
|
||||||
module.fail_json(
|
module.fail_json(
|
||||||
msg="bigsuds does not support verifying certificates with python < 2.7.9." \
|
msg="bigsuds does not support verifying certificates with python < 2.7.9."
|
||||||
"Either update python or set validate_certs=False on the task'")
|
"Either update python or set validate_certs=False on the task'")
|
||||||
|
|
||||||
return (
|
return (
|
||||||
|
@ -135,13 +134,9 @@ def fq_list_names(partition,list_names):
|
||||||
return map(lambda x: fq_name(partition, x), list_names)
|
return map(lambda x: fq_name(partition, x), list_names)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
# New style
|
# New style
|
||||||
|
|
||||||
from abc import ABCMeta, abstractproperty
|
from abc import ABCMeta, abstractproperty
|
||||||
from ansible.module_utils.six import with_metaclass
|
|
||||||
from collections import defaultdict
|
from collections import defaultdict
|
||||||
|
|
||||||
try:
|
try:
|
||||||
|
@ -158,7 +153,7 @@ except ImportError:
|
||||||
|
|
||||||
|
|
||||||
from ansible.module_utils.basic import *
|
from ansible.module_utils.basic import *
|
||||||
from ansible.module_utils.six import iteritems
|
from ansible.module_utils.six import iteritems, with_metaclass
|
||||||
|
|
||||||
|
|
||||||
F5_COMMON_ARGS = dict(
|
F5_COMMON_ARGS = dict(
|
||||||
|
@ -187,7 +182,6 @@ F5_COMMON_ARGS = dict(
|
||||||
server_port=dict(
|
server_port=dict(
|
||||||
type='int',
|
type='int',
|
||||||
default=443,
|
default=443,
|
||||||
required=False,
|
|
||||||
fallback=(env_fallback, ['F5_SERVER_PORT'])
|
fallback=(env_fallback, ['F5_SERVER_PORT'])
|
||||||
),
|
),
|
||||||
state=dict(
|
state=dict(
|
||||||
|
|
|
@ -48,7 +48,7 @@ fortios_argument_spec = dict(
|
||||||
username=dict(),
|
username=dict(),
|
||||||
password=dict(type='str', no_log=True),
|
password=dict(type='str', no_log=True),
|
||||||
timeout=dict(type='int', default=60),
|
timeout=dict(type='int', default=60),
|
||||||
vdom = dict(type='str', default=None ),
|
vdom=dict(type='str'),
|
||||||
backup=dict(type='bool', default=False),
|
backup=dict(type='bool', default=False),
|
||||||
backup_path=dict(type='path'),
|
backup_path=dict(type='path'),
|
||||||
backup_filename=dict(type='str'),
|
backup_filename=dict(type='str'),
|
||||||
|
@ -91,8 +91,6 @@ def backup(module,running_config):
|
||||||
module.fail_json(msg="Can't create backup file {0} Permission denied ?".format(filename))
|
module.fail_json(msg="Can't create backup file {0} Permission denied ?".format(filename))
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
class AnsibleFortios(object):
|
class AnsibleFortios(object):
|
||||||
def __init__(self, module):
|
def __init__(self, module):
|
||||||
if not HAS_PYFG:
|
if not HAS_PYFG:
|
||||||
|
@ -103,7 +101,6 @@ class AnsibleFortios(object):
|
||||||
}
|
}
|
||||||
self.module = module
|
self.module = module
|
||||||
|
|
||||||
|
|
||||||
def _connect(self):
|
def _connect(self):
|
||||||
if self.module.params['file_mode']:
|
if self.module.params['file_mode']:
|
||||||
self.forti_device = FortiOS('')
|
self.forti_device = FortiOS('')
|
||||||
|
@ -122,7 +119,6 @@ class AnsibleFortios(object):
|
||||||
e = get_exception()
|
e = get_exception()
|
||||||
self.module.fail_json(msg='Error connecting device. %s' % e)
|
self.module.fail_json(msg='Error connecting device. %s' % e)
|
||||||
|
|
||||||
|
|
||||||
def load_config(self, path):
|
def load_config(self, path):
|
||||||
self.path = path
|
self.path = path
|
||||||
self._connect()
|
self._connect()
|
||||||
|
@ -154,7 +150,6 @@ class AnsibleFortios(object):
|
||||||
if self.module.params['backup']:
|
if self.module.params['backup']:
|
||||||
backup(self.module, self.forti_device.running_config.to_text())
|
backup(self.module, self.forti_device.running_config.to_text())
|
||||||
|
|
||||||
|
|
||||||
def apply_changes(self):
|
def apply_changes(self):
|
||||||
change_string = self.forti_device.compare_config()
|
change_string = self.forti_device.compare_config()
|
||||||
if change_string:
|
if change_string:
|
||||||
|
@ -184,15 +179,12 @@ class AnsibleFortios(object):
|
||||||
self.forti_device.close()
|
self.forti_device.close()
|
||||||
self.module.exit_json(**self.result)
|
self.module.exit_json(**self.result)
|
||||||
|
|
||||||
|
|
||||||
def del_block(self, block_id):
|
def del_block(self, block_id):
|
||||||
self.forti_device.candidate_config[self.path].del_block(block_id)
|
self.forti_device.candidate_config[self.path].del_block(block_id)
|
||||||
|
|
||||||
|
|
||||||
def add_block(self, block_id, block):
|
def add_block(self, block_id, block):
|
||||||
self.forti_device.candidate_config[self.path][block_id] = block
|
self.forti_device.candidate_config[self.path][block_id] = block
|
||||||
|
|
||||||
|
|
||||||
def get_error_infos(self, cli_errors):
|
def get_error_infos(self, cli_errors):
|
||||||
error_list = []
|
error_list = []
|
||||||
for errors in cli_errors.args:
|
for errors in cli_errors.args:
|
||||||
|
@ -206,4 +198,3 @@ class AnsibleFortios(object):
|
||||||
|
|
||||||
def get_empty_configuration_block(self, block_name, block_type):
|
def get_empty_configuration_block(self, block_name, block_type):
|
||||||
return FortiConfig(block_name, block_type)
|
return FortiConfig(block_name, block_type)
|
||||||
|
|
||||||
|
|
|
@ -27,9 +27,6 @@
|
||||||
# USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
# USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
#
|
#
|
||||||
|
|
||||||
from ansible.module_utils.gcp import gcp_connect
|
|
||||||
from ansible.module_utils.gcp import unexpected_error_msg as gcp_error
|
|
||||||
|
|
||||||
try:
|
try:
|
||||||
from libcloud.dns.types import Provider
|
from libcloud.dns.types import Provider
|
||||||
from libcloud.dns.providers import get_driver
|
from libcloud.dns.providers import get_driver
|
||||||
|
@ -37,9 +34,13 @@ try:
|
||||||
except ImportError:
|
except ImportError:
|
||||||
HAS_LIBCLOUD_BASE = False
|
HAS_LIBCLOUD_BASE = False
|
||||||
|
|
||||||
|
from ansible.module_utils.gcp import gcp_connect
|
||||||
|
from ansible.module_utils.gcp import unexpected_error_msg as gcp_error
|
||||||
|
|
||||||
USER_AGENT_PRODUCT = "Ansible-gcdns"
|
USER_AGENT_PRODUCT = "Ansible-gcdns"
|
||||||
USER_AGENT_VERSION = "v1"
|
USER_AGENT_VERSION = "v1"
|
||||||
|
|
||||||
|
|
||||||
def gcdns_connect(module, provider=None):
|
def gcdns_connect(module, provider=None):
|
||||||
"""Return a GCP connection for Google Cloud DNS."""
|
"""Return a GCP connection for Google Cloud DNS."""
|
||||||
if not HAS_LIBCLOUD_BASE:
|
if not HAS_LIBCLOUD_BASE:
|
||||||
|
@ -48,6 +49,7 @@ def gcdns_connect(module, provider=None):
|
||||||
provider = provider or Provider.GOOGLE
|
provider = provider or Provider.GOOGLE
|
||||||
return gcp_connect(module, provider, get_driver, USER_AGENT_PRODUCT, USER_AGENT_VERSION)
|
return gcp_connect(module, provider, get_driver, USER_AGENT_PRODUCT, USER_AGENT_VERSION)
|
||||||
|
|
||||||
|
|
||||||
def unexpected_error_msg(error):
|
def unexpected_error_msg(error):
|
||||||
"""Create an error string based on passed in error."""
|
"""Create an error string based on passed in error."""
|
||||||
return gcp_error(error)
|
return gcp_error(error)
|
||||||
|
|
|
@ -25,10 +25,6 @@
|
||||||
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||||
# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
|
# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
|
||||||
# USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
# USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
#
|
|
||||||
|
|
||||||
from ansible.module_utils.gcp import gcp_connect
|
|
||||||
from ansible.module_utils.gcp import unexpected_error_msg as gcp_error
|
|
||||||
|
|
||||||
try:
|
try:
|
||||||
from libcloud.compute.types import Provider
|
from libcloud.compute.types import Provider
|
||||||
|
@ -37,9 +33,13 @@ try:
|
||||||
except ImportError:
|
except ImportError:
|
||||||
HAS_LIBCLOUD_BASE = False
|
HAS_LIBCLOUD_BASE = False
|
||||||
|
|
||||||
|
from ansible.module_utils.gcp import gcp_connect
|
||||||
|
from ansible.module_utils.gcp import unexpected_error_msg as gcp_error
|
||||||
|
|
||||||
USER_AGENT_PRODUCT = "Ansible-gce"
|
USER_AGENT_PRODUCT = "Ansible-gce"
|
||||||
USER_AGENT_VERSION = "v1"
|
USER_AGENT_VERSION = "v1"
|
||||||
|
|
||||||
|
|
||||||
def gce_connect(module, provider=None):
|
def gce_connect(module, provider=None):
|
||||||
"""Return a GCP connection for Google Compute Engine."""
|
"""Return a GCP connection for Google Compute Engine."""
|
||||||
if not HAS_LIBCLOUD_BASE:
|
if not HAS_LIBCLOUD_BASE:
|
||||||
|
@ -48,6 +48,7 @@ def gce_connect(module, provider=None):
|
||||||
|
|
||||||
return gcp_connect(module, provider, get_driver, USER_AGENT_PRODUCT, USER_AGENT_VERSION)
|
return gcp_connect(module, provider, get_driver, USER_AGENT_PRODUCT, USER_AGENT_VERSION)
|
||||||
|
|
||||||
|
|
||||||
def unexpected_error_msg(error):
|
def unexpected_error_msg(error):
|
||||||
"""Create an error string based on passed in error."""
|
"""Create an error string based on passed in error."""
|
||||||
return gcp_error(error)
|
return gcp_error(error)
|
||||||
|
|
|
@ -502,8 +502,7 @@ class GCPUtils(object):
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def underscore_to_camel(txt):
|
def underscore_to_camel(txt):
|
||||||
return txt.split('_')[0] + ''.join(x.capitalize()
|
return txt.split('_')[0] + ''.join(x.capitalize() or '_' for x in txt.split('_')[1:])
|
||||||
or '_' for x in txt.split('_')[1:])
|
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def remove_non_gcp_params(params):
|
def remove_non_gcp_params(params):
|
||||||
|
@ -626,7 +625,7 @@ class GCPUtils(object):
|
||||||
# TODO(supertom): Isolate 'build-new-request' stuff.
|
# TODO(supertom): Isolate 'build-new-request' stuff.
|
||||||
resource_name_singular = GCPUtils.get_entity_name_from_resource_name(
|
resource_name_singular = GCPUtils.get_entity_name_from_resource_name(
|
||||||
resource_name)
|
resource_name)
|
||||||
if op_resp['operationType'] == 'insert' or not 'entity_name' in parsed_url:
|
if op_resp['operationType'] == 'insert' or 'entity_name' not in parsed_url:
|
||||||
parsed_url['entity_name'] = GCPUtils.parse_gcp_url(op_resp['targetLink'])[
|
parsed_url['entity_name'] = GCPUtils.parse_gcp_url(op_resp['targetLink'])[
|
||||||
'entity_name']
|
'entity_name']
|
||||||
args = {'project': project_id,
|
args = {'project': project_id,
|
||||||
|
|
|
@ -29,6 +29,7 @@ try:
|
||||||
except ImportError:
|
except ImportError:
|
||||||
import simplejson as json
|
import simplejson as json
|
||||||
|
|
||||||
|
|
||||||
# NB: a copy of this function exists in ../../modules/core/async_wrapper.py. Ensure any
|
# NB: a copy of this function exists in ../../modules/core/async_wrapper.py. Ensure any
|
||||||
# changes are propagated there.
|
# changes are propagated there.
|
||||||
def _filter_non_json_lines(data):
|
def _filter_non_json_lines(data):
|
||||||
|
|
|
@ -47,6 +47,7 @@ ARGS_DEFAULT_VALUE = {
|
||||||
'timeout': 10
|
'timeout': 10
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
def check_args(module, warnings):
|
def check_args(module, warnings):
|
||||||
provider = module.params['provider'] or {}
|
provider = module.params['provider'] or {}
|
||||||
for key in junos_argument_spec:
|
for key in junos_argument_spec:
|
||||||
|
@ -66,6 +67,7 @@ def check_args(module, warnings):
|
||||||
if provider.get(param):
|
if provider.get(param):
|
||||||
module.no_log_values.update(return_values(provider[param]))
|
module.no_log_values.update(return_values(provider[param]))
|
||||||
|
|
||||||
|
|
||||||
def _validate_rollback_id(module, value):
|
def _validate_rollback_id(module, value):
|
||||||
try:
|
try:
|
||||||
if not 0 <= int(value) <= 49:
|
if not 0 <= int(value) <= 49:
|
||||||
|
@ -73,6 +75,7 @@ def _validate_rollback_id(module, value):
|
||||||
except ValueError:
|
except ValueError:
|
||||||
module.fail_json(msg='rollback must be between 0 and 49')
|
module.fail_json(msg='rollback must be between 0 and 49')
|
||||||
|
|
||||||
|
|
||||||
def load_configuration(module, candidate=None, action='merge', rollback=None, format='xml'):
|
def load_configuration(module, candidate=None, action='merge', rollback=None, format='xml'):
|
||||||
|
|
||||||
if all((candidate is None, rollback is None)):
|
if all((candidate is None, rollback is None)):
|
||||||
|
@ -117,6 +120,7 @@ def load_configuration(module, candidate=None, action='merge', rollback=None, fo
|
||||||
cfg.append(candidate)
|
cfg.append(candidate)
|
||||||
return send_request(module, obj)
|
return send_request(module, obj)
|
||||||
|
|
||||||
|
|
||||||
def get_configuration(module, compare=False, format='xml', rollback='0'):
|
def get_configuration(module, compare=False, format='xml', rollback='0'):
|
||||||
if format not in CONFIG_FORMATS:
|
if format not in CONFIG_FORMATS:
|
||||||
module.fail_json(msg='invalid config format specified')
|
module.fail_json(msg='invalid config format specified')
|
||||||
|
@ -127,6 +131,7 @@ def get_configuration(module, compare=False, format='xml', rollback='0'):
|
||||||
xattrs['rollback'] = str(rollback)
|
xattrs['rollback'] = str(rollback)
|
||||||
return send_request(module, Element('get-configuration', xattrs))
|
return send_request(module, Element('get-configuration', xattrs))
|
||||||
|
|
||||||
|
|
||||||
def commit_configuration(module, confirm=False, check=False, comment=None, confirm_timeout=None):
|
def commit_configuration(module, confirm=False, check=False, comment=None, confirm_timeout=None):
|
||||||
obj = Element('commit-configuration')
|
obj = Element('commit-configuration')
|
||||||
if confirm:
|
if confirm:
|
||||||
|
@ -141,6 +146,7 @@ def commit_configuration(module, confirm=False, check=False, comment=None, confi
|
||||||
subele.text = str(confirm_timeout)
|
subele.text = str(confirm_timeout)
|
||||||
return send_request(module, obj)
|
return send_request(module, obj)
|
||||||
|
|
||||||
|
|
||||||
def command(module, command, format='text', rpc_only=False):
|
def command(module, command, format='text', rpc_only=False):
|
||||||
xattrs = {'format': format}
|
xattrs = {'format': format}
|
||||||
if rpc_only:
|
if rpc_only:
|
||||||
|
@ -148,8 +154,14 @@ def command(module, command, format='text', rpc_only=False):
|
||||||
xattrs['format'] = 'text'
|
xattrs['format'] = 'text'
|
||||||
return send_request(module, Element('command', xattrs, text=command))
|
return send_request(module, Element('command', xattrs, text=command))
|
||||||
|
|
||||||
lock_configuration = lambda x: send_request(x, Element('lock-configuration'))
|
|
||||||
unlock_configuration = lambda x: send_request(x, Element('unlock-configuration'))
|
def lock_configuration(x):
|
||||||
|
return send_request(x, Element('lock-configuration'))
|
||||||
|
|
||||||
|
|
||||||
|
def unlock_configuration(x):
|
||||||
|
return send_request(x, Element('unlock-configuration'))
|
||||||
|
|
||||||
|
|
||||||
@contextmanager
|
@contextmanager
|
||||||
def locked_config(module):
|
def locked_config(module):
|
||||||
|
@ -159,6 +171,7 @@ def locked_config(module):
|
||||||
finally:
|
finally:
|
||||||
unlock_configuration(module)
|
unlock_configuration(module)
|
||||||
|
|
||||||
|
|
||||||
def get_diff(module):
|
def get_diff(module):
|
||||||
|
|
||||||
reply = get_configuration(module, compare=True, format='text')
|
reply = get_configuration(module, compare=True, format='text')
|
||||||
|
@ -166,6 +179,7 @@ def get_diff(module):
|
||||||
if output is not None:
|
if output is not None:
|
||||||
return to_text(output.text, encoding='latin1').strip()
|
return to_text(output.text, encoding='latin1').strip()
|
||||||
|
|
||||||
|
|
||||||
def load_config(module, candidate, warnings, action='merge', commit=False, format='xml',
|
def load_config(module, candidate, warnings, action='merge', commit=False, format='xml',
|
||||||
comment=None, confirm=False, confirm_timeout=None):
|
comment=None, confirm=False, confirm_timeout=None):
|
||||||
|
|
||||||
|
@ -192,5 +206,6 @@ def load_config(module, candidate, warnings, action='merge', commit=False, forma
|
||||||
|
|
||||||
return diff
|
return diff
|
||||||
|
|
||||||
|
|
||||||
def get_param(module, key):
|
def get_param(module, key):
|
||||||
return module.params[key] or module.params['provider'].get(key)
|
return module.params[key] or module.params['provider'].get(key)
|
||||||
|
|
|
@ -38,12 +38,14 @@ except ImportError:
|
||||||
# httplib/http.client connection using unix domain socket
|
# httplib/http.client connection using unix domain socket
|
||||||
import socket
|
import socket
|
||||||
import ssl
|
import ssl
|
||||||
|
|
||||||
try:
|
try:
|
||||||
from httplib import HTTPConnection, HTTPSConnection
|
from httplib import HTTPConnection, HTTPSConnection
|
||||||
except ImportError:
|
except ImportError:
|
||||||
# Python 3
|
# Python 3
|
||||||
from http.client import HTTPConnection, HTTPSConnection
|
from http.client import HTTPConnection, HTTPSConnection
|
||||||
|
|
||||||
|
|
||||||
class UnixHTTPConnection(HTTPConnection):
|
class UnixHTTPConnection(HTTPConnection):
|
||||||
def __init__(self, path):
|
def __init__(self, path):
|
||||||
HTTPConnection.__init__(self, 'localhost')
|
HTTPConnection.__init__(self, 'localhost')
|
||||||
|
@ -54,11 +56,13 @@ class UnixHTTPConnection(HTTPConnection):
|
||||||
sock.connect(self.path)
|
sock.connect(self.path)
|
||||||
self.sock = sock
|
self.sock = sock
|
||||||
|
|
||||||
|
|
||||||
class LXDClientException(Exception):
|
class LXDClientException(Exception):
|
||||||
def __init__(self, msg, **kwargs):
|
def __init__(self, msg, **kwargs):
|
||||||
self.msg = msg
|
self.msg = msg
|
||||||
self.kwargs = kwargs
|
self.kwargs = kwargs
|
||||||
|
|
||||||
|
|
||||||
class LXDClient(object):
|
class LXDClient(object):
|
||||||
def __init__(self, url, key_file=None, cert_file=None, debug=False):
|
def __init__(self, url, key_file=None, cert_file=None, debug=False):
|
||||||
"""LXD Client.
|
"""LXD Client.
|
||||||
|
|
|
@ -35,6 +35,7 @@ try:
|
||||||
except ImportError:
|
except ImportError:
|
||||||
mysqldb_found = False
|
mysqldb_found = False
|
||||||
|
|
||||||
|
|
||||||
def mysql_connect(module, login_user=None, login_password=None, config_file='', ssl_cert=None, ssl_key=None, ssl_ca=None, db=None, cursor_class=None,
|
def mysql_connect(module, login_user=None, login_password=None, config_file='', ssl_cert=None, ssl_key=None, ssl_ca=None, db=None, cursor_class=None,
|
||||||
connect_timeout=30):
|
connect_timeout=30):
|
||||||
config = {}
|
config = {}
|
||||||
|
|
|
@ -92,13 +92,20 @@ class ConfigLine(object):
|
||||||
assert isinstance(obj, ConfigLine), 'child must be of type `ConfigLine`'
|
assert isinstance(obj, ConfigLine), 'child must be of type `ConfigLine`'
|
||||||
self._children.append(obj)
|
self._children.append(obj)
|
||||||
|
|
||||||
|
|
||||||
def ignore_line(text, tokens=None):
|
def ignore_line(text, tokens=None):
|
||||||
for item in (tokens or DEFAULT_COMMENT_TOKENS):
|
for item in (tokens or DEFAULT_COMMENT_TOKENS):
|
||||||
if text.startswith(item):
|
if text.startswith(item):
|
||||||
return True
|
return True
|
||||||
|
|
||||||
_obj_to_text = lambda x: [o.text for o in x]
|
|
||||||
_obj_to_raw = lambda x: [o.raw for o in x]
|
def _obj_to_text(x):
|
||||||
|
return [o.text for o in x]
|
||||||
|
|
||||||
|
|
||||||
|
def _obj_to_raw(x):
|
||||||
|
return [o.raw for o in x]
|
||||||
|
|
||||||
|
|
||||||
def _obj_to_block(objects, visited=None):
|
def _obj_to_block(objects, visited=None):
|
||||||
items = list()
|
items = list()
|
||||||
|
@ -110,6 +117,7 @@ def _obj_to_block(objects, visited=None):
|
||||||
items.append(child)
|
items.append(child)
|
||||||
return _obj_to_raw(items)
|
return _obj_to_raw(items)
|
||||||
|
|
||||||
|
|
||||||
def dumps(objects, output='block', comments=False):
|
def dumps(objects, output='block', comments=False):
|
||||||
if output == 'block':
|
if output == 'block':
|
||||||
items = _obj_to_block(objects)
|
items = _obj_to_block(objects)
|
||||||
|
@ -130,6 +138,7 @@ def dumps(objects, output='block', comments=False):
|
||||||
|
|
||||||
return '\n'.join(items)
|
return '\n'.join(items)
|
||||||
|
|
||||||
|
|
||||||
class NetworkConfig(object):
|
class NetworkConfig(object):
|
||||||
|
|
||||||
def __init__(self, indent=1, contents=None):
|
def __init__(self, indent=1, contents=None):
|
||||||
|
@ -328,7 +337,7 @@ class NetworkConfig(object):
|
||||||
offset = 0
|
offset = 0
|
||||||
obj = None
|
obj = None
|
||||||
|
|
||||||
## global config command
|
# global config command
|
||||||
if not parents:
|
if not parents:
|
||||||
for line in lines:
|
for line in lines:
|
||||||
item = ConfigLine(line)
|
item = ConfigLine(line)
|
||||||
|
|
|
@ -24,17 +24,16 @@
|
||||||
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||||
# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
|
# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
|
||||||
# USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
# USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
#
|
|
||||||
|
|
||||||
import re
|
import re
|
||||||
import time
|
|
||||||
import shlex
|
import shlex
|
||||||
|
import time
|
||||||
|
|
||||||
from ansible.module_utils.basic import BOOLEANS_TRUE, BOOLEANS_FALSE
|
from ansible.module_utils.basic import BOOLEANS_TRUE, BOOLEANS_FALSE, get_exception
|
||||||
from ansible.module_utils.basic import get_exception
|
|
||||||
from ansible.module_utils.six import string_types, text_type
|
from ansible.module_utils.six import string_types, text_type
|
||||||
from ansible.module_utils.six.moves import zip
|
from ansible.module_utils.six.moves import zip
|
||||||
|
|
||||||
|
|
||||||
def to_list(val):
|
def to_list(val):
|
||||||
if isinstance(val, (list, tuple)):
|
if isinstance(val, (list, tuple)):
|
||||||
return list(val)
|
return list(val)
|
||||||
|
@ -49,16 +48,19 @@ class FailedConditionsError(Exception):
|
||||||
super(FailedConditionsError, self).__init__(msg)
|
super(FailedConditionsError, self).__init__(msg)
|
||||||
self.failed_conditions = failed_conditions
|
self.failed_conditions = failed_conditions
|
||||||
|
|
||||||
|
|
||||||
class FailedConditionalError(Exception):
|
class FailedConditionalError(Exception):
|
||||||
def __init__(self, msg, failed_conditional):
|
def __init__(self, msg, failed_conditional):
|
||||||
super(FailedConditionalError, self).__init__(msg)
|
super(FailedConditionalError, self).__init__(msg)
|
||||||
self.failed_conditional = failed_conditional
|
self.failed_conditional = failed_conditional
|
||||||
|
|
||||||
|
|
||||||
class AddCommandError(Exception):
|
class AddCommandError(Exception):
|
||||||
def __init__(self, msg, command):
|
def __init__(self, msg, command):
|
||||||
super(AddCommandError, self).__init__(msg)
|
super(AddCommandError, self).__init__(msg)
|
||||||
self.command = command
|
self.command = command
|
||||||
|
|
||||||
|
|
||||||
class AddConditionError(Exception):
|
class AddConditionError(Exception):
|
||||||
def __init__(self, msg, condition):
|
def __init__(self, msg, condition):
|
||||||
super(AddConditionError, self).__init__(msg)
|
super(AddConditionError, self).__init__(msg)
|
||||||
|
@ -105,6 +107,7 @@ class Cli(object):
|
||||||
|
|
||||||
return responses
|
return responses
|
||||||
|
|
||||||
|
|
||||||
class Command(object):
|
class Command(object):
|
||||||
|
|
||||||
def __init__(self, command, output=None, prompt=None, response=None,
|
def __init__(self, command, output=None, prompt=None, response=None,
|
||||||
|
@ -122,6 +125,7 @@ class Command(object):
|
||||||
def __str__(self):
|
def __str__(self):
|
||||||
return self.command_string
|
return self.command_string
|
||||||
|
|
||||||
|
|
||||||
class CommandRunner(object):
|
class CommandRunner(object):
|
||||||
|
|
||||||
def __init__(self, module):
|
def __init__(self, module):
|
||||||
|
|
|
@ -26,14 +26,13 @@
|
||||||
# USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
# USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
#
|
#
|
||||||
from contextlib import contextmanager
|
from contextlib import contextmanager
|
||||||
from xml.etree.ElementTree import Element, SubElement
|
from xml.etree.ElementTree import Element, SubElement, fromstring, tostring
|
||||||
from xml.etree.ElementTree import tostring, fromstring
|
|
||||||
|
|
||||||
from ansible.module_utils.connection import exec_command
|
from ansible.module_utils.connection import exec_command
|
||||||
|
|
||||||
|
|
||||||
NS_MAP = {'nc': "urn:ietf:params:xml:ns:netconf:base:1.0"}
|
NS_MAP = {'nc': "urn:ietf:params:xml:ns:netconf:base:1.0"}
|
||||||
|
|
||||||
|
|
||||||
def send_request(module, obj, check_rc=True):
|
def send_request(module, obj, check_rc=True):
|
||||||
request = tostring(obj)
|
request = tostring(obj)
|
||||||
rc, out, err = exec_command(module, request)
|
rc, out, err = exec_command(module, request)
|
||||||
|
@ -58,6 +57,7 @@ def send_request(module, obj, check_rc=True):
|
||||||
return warnings
|
return warnings
|
||||||
return fromstring(out)
|
return fromstring(out)
|
||||||
|
|
||||||
|
|
||||||
def children(root, iterable):
|
def children(root, iterable):
|
||||||
for item in iterable:
|
for item in iterable:
|
||||||
try:
|
try:
|
||||||
|
@ -65,33 +65,40 @@ def children(root, iterable):
|
||||||
except NameError:
|
except NameError:
|
||||||
ele = SubElement(root, item)
|
ele = SubElement(root, item)
|
||||||
|
|
||||||
|
|
||||||
def lock(module, target='candidate'):
|
def lock(module, target='candidate'):
|
||||||
obj = Element('lock')
|
obj = Element('lock')
|
||||||
children(obj, ('target', target))
|
children(obj, ('target', target))
|
||||||
return send_request(module, obj)
|
return send_request(module, obj)
|
||||||
|
|
||||||
|
|
||||||
def unlock(module, target='candidate'):
|
def unlock(module, target='candidate'):
|
||||||
obj = Element('unlock')
|
obj = Element('unlock')
|
||||||
children(obj, ('target', target))
|
children(obj, ('target', target))
|
||||||
return send_request(module, obj)
|
return send_request(module, obj)
|
||||||
|
|
||||||
|
|
||||||
def commit(module):
|
def commit(module):
|
||||||
return send_request(module, Element('commit'))
|
return send_request(module, Element('commit'))
|
||||||
|
|
||||||
|
|
||||||
def discard_changes(module):
|
def discard_changes(module):
|
||||||
return send_request(module, Element('discard-changes'))
|
return send_request(module, Element('discard-changes'))
|
||||||
|
|
||||||
|
|
||||||
def validate(module):
|
def validate(module):
|
||||||
obj = Element('validate')
|
obj = Element('validate')
|
||||||
children(obj, ('source', 'candidate'))
|
children(obj, ('source', 'candidate'))
|
||||||
return send_request(module, obj)
|
return send_request(module, obj)
|
||||||
|
|
||||||
|
|
||||||
def get_config(module, source='running', filter=None):
|
def get_config(module, source='running', filter=None):
|
||||||
obj = Element('get-config')
|
obj = Element('get-config')
|
||||||
children(obj, ('source', source))
|
children(obj, ('source', source))
|
||||||
children(obj, ('filter', filter))
|
children(obj, ('filter', filter))
|
||||||
return send_request(module, obj)
|
return send_request(module, obj)
|
||||||
|
|
||||||
|
|
||||||
@contextmanager
|
@contextmanager
|
||||||
def locked_config(module):
|
def locked_config(module):
|
||||||
try:
|
try:
|
||||||
|
|
|
@ -52,6 +52,7 @@ NET_CONNECTION_ARGS = dict()
|
||||||
|
|
||||||
NET_CONNECTIONS = dict()
|
NET_CONNECTIONS = dict()
|
||||||
|
|
||||||
|
|
||||||
def _transitional_argument_spec():
|
def _transitional_argument_spec():
|
||||||
argument_spec = {}
|
argument_spec = {}
|
||||||
for key, value in iteritems(NET_TRANSPORT_ARGS):
|
for key, value in iteritems(NET_TRANSPORT_ARGS):
|
||||||
|
@ -59,6 +60,7 @@ def _transitional_argument_spec():
|
||||||
argument_spec[key] = value
|
argument_spec[key] = value
|
||||||
return argument_spec
|
return argument_spec
|
||||||
|
|
||||||
|
|
||||||
def to_list(val):
|
def to_list(val):
|
||||||
if isinstance(val, (list, tuple)):
|
if isinstance(val, (list, tuple)):
|
||||||
return list(val)
|
return list(val)
|
||||||
|
@ -75,12 +77,14 @@ class ModuleStub(object):
|
||||||
self.params[key] = value.get('default')
|
self.params[key] = value.get('default')
|
||||||
self.fail_json = fail_json
|
self.fail_json = fail_json
|
||||||
|
|
||||||
|
|
||||||
class NetworkError(Exception):
|
class NetworkError(Exception):
|
||||||
|
|
||||||
def __init__(self, msg, **kwargs):
|
def __init__(self, msg, **kwargs):
|
||||||
super(NetworkError, self).__init__(msg)
|
super(NetworkError, self).__init__(msg)
|
||||||
self.kwargs = kwargs
|
self.kwargs = kwargs
|
||||||
|
|
||||||
|
|
||||||
class Config(object):
|
class Config(object):
|
||||||
|
|
||||||
def __init__(self, connection):
|
def __init__(self, connection):
|
||||||
|
@ -185,6 +189,7 @@ class NetworkModule(AnsibleModule):
|
||||||
exc = get_exception()
|
exc = get_exception()
|
||||||
self.fail_json(msg=to_native(exc))
|
self.fail_json(msg=to_native(exc))
|
||||||
|
|
||||||
|
|
||||||
def register_transport(transport, default=False):
|
def register_transport(transport, default=False):
|
||||||
def register(cls):
|
def register(cls):
|
||||||
NET_CONNECTIONS[transport] = cls
|
NET_CONNECTIONS[transport] = cls
|
||||||
|
@ -193,6 +198,6 @@ def register_transport(transport, default=False):
|
||||||
return cls
|
return cls
|
||||||
return register
|
return register
|
||||||
|
|
||||||
|
|
||||||
def add_argument(key, value):
|
def add_argument(key, value):
|
||||||
NET_CONNECTION_ARGS[key] = value
|
NET_CONNECTION_ARGS[key] = value
|
||||||
|
|
||||||
|
|
|
@ -24,9 +24,10 @@
|
||||||
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||||
# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
|
# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
|
||||||
# USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
# USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
#
|
|
||||||
from ansible.module_utils.six import iteritems
|
|
||||||
from ansible.module_utils.basic import AnsibleFallbackNotFound
|
from ansible.module_utils.basic import AnsibleFallbackNotFound
|
||||||
|
from ansible.module_utils.six import iteritems
|
||||||
|
|
||||||
|
|
||||||
def to_list(val):
|
def to_list(val):
|
||||||
if isinstance(val, (list, tuple, set)):
|
if isinstance(val, (list, tuple, set)):
|
||||||
|
@ -36,6 +37,7 @@ def to_list(val):
|
||||||
else:
|
else:
|
||||||
return list()
|
return list()
|
||||||
|
|
||||||
|
|
||||||
class ComplexDict(object):
|
class ComplexDict(object):
|
||||||
"""Transforms a dict to with an argument spec
|
"""Transforms a dict to with an argument spec
|
||||||
|
|
||||||
|
@ -88,7 +90,6 @@ class ComplexDict(object):
|
||||||
self_has_key = True
|
self_has_key = True
|
||||||
attr['required'] = True
|
attr['required'] = True
|
||||||
|
|
||||||
|
|
||||||
def _dict(self, value):
|
def _dict(self, value):
|
||||||
obj = {}
|
obj = {}
|
||||||
for name, attr in iteritems(self._attributes):
|
for name, attr in iteritems(self._attributes):
|
||||||
|
@ -131,8 +132,7 @@ class ComplexDict(object):
|
||||||
|
|
||||||
if 'choices' in attr:
|
if 'choices' in attr:
|
||||||
if value[name] not in attr['choices']:
|
if value[name] not in attr['choices']:
|
||||||
raise ValueError('%s must be one of %s, got %s' % \
|
raise ValueError('%s must be one of %s, got %s' % (name, ', '.join(attr['choices']), value[name]))
|
||||||
(name, ', '.join(attr['choices']), value[name]))
|
|
||||||
|
|
||||||
if value[name] is not None:
|
if value[name] is not None:
|
||||||
value_type = attr.get('type', 'str')
|
value_type = attr.get('type', 'str')
|
||||||
|
@ -141,6 +141,7 @@ class ComplexDict(object):
|
||||||
|
|
||||||
return value
|
return value
|
||||||
|
|
||||||
|
|
||||||
class ComplexList(ComplexDict):
|
class ComplexList(ComplexDict):
|
||||||
"""Extends ```ComplexDict``` to handle a list of dicts """
|
"""Extends ```ComplexDict``` to handle a list of dicts """
|
||||||
|
|
||||||
|
@ -148,4 +149,3 @@ class ComplexList(ComplexDict):
|
||||||
if not isinstance(values, (list, tuple)):
|
if not isinstance(values, (list, tuple)):
|
||||||
raise TypeError('value must be an ordered iterable')
|
raise TypeError('value must be an ordered iterable')
|
||||||
return [(super(ComplexList, self).__call__(v)) for v in values]
|
return [(super(ComplexList, self).__call__(v)) for v in values]
|
||||||
|
|
||||||
|
|
|
@ -30,6 +30,7 @@ import os
|
||||||
|
|
||||||
from ansible.module_utils.six import iteritems
|
from ansible.module_utils.six import iteritems
|
||||||
|
|
||||||
|
|
||||||
def openstack_argument_spec():
|
def openstack_argument_spec():
|
||||||
# DEPRECATED: This argument spec is only used for the deprecated old
|
# DEPRECATED: This argument spec is only used for the deprecated old
|
||||||
# OpenStack modules. It turns out that modern OpenStack auth is WAY
|
# OpenStack modules. It turns out that modern OpenStack auth is WAY
|
||||||
|
@ -47,7 +48,7 @@ def openstack_argument_spec():
|
||||||
login_username=dict(default=OS_USERNAME),
|
login_username=dict(default=OS_USERNAME),
|
||||||
auth_url=dict(default=OS_AUTH_URL),
|
auth_url=dict(default=OS_AUTH_URL),
|
||||||
region_name=dict(default=OS_REGION_NAME),
|
region_name=dict(default=OS_REGION_NAME),
|
||||||
availability_zone = dict(default=None),
|
availability_zone=dict(),
|
||||||
)
|
)
|
||||||
if OS_PASSWORD:
|
if OS_PASSWORD:
|
||||||
spec['login_password'] = dict(default=OS_PASSWORD)
|
spec['login_password'] = dict(default=OS_PASSWORD)
|
||||||
|
@ -59,6 +60,7 @@ def openstack_argument_spec():
|
||||||
spec['login_tenant_name'] = dict(required=True)
|
spec['login_tenant_name'] = dict(required=True)
|
||||||
return spec
|
return spec
|
||||||
|
|
||||||
|
|
||||||
def openstack_find_nova_addresses(addresses, ext_tag, key_name=None):
|
def openstack_find_nova_addresses(addresses, ext_tag, key_name=None):
|
||||||
|
|
||||||
ret = []
|
ret = []
|
||||||
|
@ -71,6 +73,7 @@ def openstack_find_nova_addresses(addresses, ext_tag, key_name=None):
|
||||||
ret.append(interface_spec['addr'])
|
ret.append(interface_spec['addr'])
|
||||||
return ret
|
return ret
|
||||||
|
|
||||||
|
|
||||||
def openstack_full_argument_spec(**kwargs):
|
def openstack_full_argument_spec(**kwargs):
|
||||||
spec = dict(
|
spec = dict(
|
||||||
cloud=dict(default=None),
|
cloud=dict(default=None),
|
||||||
|
|
|
@ -37,6 +37,7 @@ from ansible.module_utils.urls import fetch_url, url_argument_spec
|
||||||
add_argument('use_ssl', dict(default=True, type='bool'))
|
add_argument('use_ssl', dict(default=True, type='bool'))
|
||||||
add_argument('validate_certs', dict(default=True, type='bool'))
|
add_argument('validate_certs', dict(default=True, type='bool'))
|
||||||
|
|
||||||
|
|
||||||
def get_opsidl():
|
def get_opsidl():
|
||||||
extschema = restparser.parseSchema(settings.get('ext_schema'))
|
extschema = restparser.parseSchema(settings.get('ext_schema'))
|
||||||
ovsschema = settings.get('ovs_schema')
|
ovsschema = settings.get('ovs_schema')
|
||||||
|
@ -129,7 +130,7 @@ class Rest(object):
|
||||||
def authorize(self, params, **kwargs):
|
def authorize(self, params, **kwargs):
|
||||||
raise NotImplementedError
|
raise NotImplementedError
|
||||||
|
|
||||||
### REST methods ###
|
# REST methods
|
||||||
|
|
||||||
def _url_builder(self, path):
|
def _url_builder(self, path):
|
||||||
if path[0] == '/':
|
if path[0] == '/':
|
||||||
|
@ -160,12 +161,12 @@ class Rest(object):
|
||||||
def delete(self, path, data=None, headers=None):
|
def delete(self, path, data=None, headers=None):
|
||||||
return self.request('DELETE', path, data, headers)
|
return self.request('DELETE', path, data, headers)
|
||||||
|
|
||||||
### Command methods ###
|
# Command methods
|
||||||
|
|
||||||
def run_commands(self, commands):
|
def run_commands(self, commands):
|
||||||
raise NotImplementedError
|
raise NotImplementedError
|
||||||
|
|
||||||
### Config methods ###
|
# Config methods
|
||||||
|
|
||||||
def configure(self, commands):
|
def configure(self, commands):
|
||||||
path = '/system/full-configuration'
|
path = '/system/full-configuration'
|
||||||
|
@ -212,7 +213,7 @@ class Cli(CliBase):
|
||||||
|
|
||||||
NET_PASSWD_RE = re.compile(r"[\r\n]?password: $", re.I)
|
NET_PASSWD_RE = re.compile(r"[\r\n]?password: $", re.I)
|
||||||
|
|
||||||
### Config methods ###
|
# Config methods
|
||||||
|
|
||||||
def configure(self, commands, **kwargs):
|
def configure(self, commands, **kwargs):
|
||||||
cmds = ['configure terminal']
|
cmds = ['configure terminal']
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
_DEVICE_CONFIGS = {}
|
_DEVICE_CONFIGS = {}
|
||||||
|
|
||||||
|
|
||||||
def get_config(module, flags=[]):
|
def get_config(module, flags=[]):
|
||||||
cmd = 'show running-config '
|
cmd = 'show running-config '
|
||||||
cmd += ' '.join(flags)
|
cmd += ' '.join(flags)
|
||||||
|
|
|
@ -504,7 +504,6 @@ class BaseModule(object):
|
||||||
after[k] = update[k]
|
after[k] = update[k]
|
||||||
return after
|
return after
|
||||||
|
|
||||||
|
|
||||||
def create(
|
def create(
|
||||||
self,
|
self,
|
||||||
entity=None,
|
entity=None,
|
||||||
|
@ -579,9 +578,14 @@ class BaseModule(object):
|
||||||
# Wait for the entity to be created and to be in the defined state:
|
# Wait for the entity to be created and to be in the defined state:
|
||||||
entity_service = self._service.service(entity.id)
|
entity_service = self._service.service(entity.id)
|
||||||
|
|
||||||
state_condition = lambda entity: entity
|
def state_condition(entity):
|
||||||
|
return entity
|
||||||
|
|
||||||
if result_state:
|
if result_state:
|
||||||
state_condition = lambda entity: entity and entity.status == result_state
|
|
||||||
|
def state_condition(entity):
|
||||||
|
return entity and entity.status == result_state
|
||||||
|
|
||||||
wait(
|
wait(
|
||||||
service=entity_service,
|
service=entity_service,
|
||||||
condition=state_condition,
|
condition=state_condition,
|
||||||
|
|
|
@ -27,24 +27,21 @@
|
||||||
# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
|
# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
|
||||||
# USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
# USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
|
||||||
# standard ansible imports
|
|
||||||
from ansible.module_utils.basic import get_exception
|
|
||||||
|
|
||||||
# standard PG imports
|
|
||||||
HAS_PSYCOPG2 = False
|
|
||||||
try:
|
try:
|
||||||
import psycopg2
|
import psycopg2
|
||||||
import psycopg2.extras
|
import psycopg2.extras
|
||||||
except ImportError:
|
|
||||||
pass
|
|
||||||
else:
|
|
||||||
HAS_PSYCOPG2 = True
|
HAS_PSYCOPG2 = True
|
||||||
|
except ImportError:
|
||||||
|
HAS_PSYCOPG2 = False
|
||||||
|
|
||||||
|
from ansible.module_utils.basic import get_exception
|
||||||
from ansible.module_utils.six import iteritems
|
from ansible.module_utils.six import iteritems
|
||||||
|
|
||||||
|
|
||||||
class LibraryError(Exception):
|
class LibraryError(Exception):
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
|
||||||
def ensure_libs(sslrootcert=None):
|
def ensure_libs(sslrootcert=None):
|
||||||
if not HAS_PSYCOPG2:
|
if not HAS_PSYCOPG2:
|
||||||
raise LibraryError('psycopg2 is not installed. we need psycopg2.')
|
raise LibraryError('psycopg2 is not installed. we need psycopg2.')
|
||||||
|
@ -54,6 +51,7 @@ def ensure_libs(sslrootcert=None):
|
||||||
# no problems
|
# no problems
|
||||||
return None
|
return None
|
||||||
|
|
||||||
|
|
||||||
def postgres_common_argument_spec():
|
def postgres_common_argument_spec():
|
||||||
return dict(
|
return dict(
|
||||||
login_user=dict(default='postgres'),
|
login_user=dict(default='postgres'),
|
||||||
|
@ -62,6 +60,5 @@ def postgres_common_argument_spec():
|
||||||
login_unix_socket=dict(default=''),
|
login_unix_socket=dict(default=''),
|
||||||
port=dict(type='int', default=5432),
|
port=dict(type='int', default=5432),
|
||||||
ssl_mode=dict(default='prefer', choices=['disable', 'allow', 'prefer', 'require', 'verify-ca', 'verify-full']),
|
ssl_mode=dict(default='prefer', choices=['disable', 'allow', 'prefer', 'require', 'verify-ca', 'verify-full']),
|
||||||
ssl_rootcert = dict(default=None),
|
ssl_rootcert=dict(),
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
|
@ -25,10 +25,10 @@
|
||||||
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||||
# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
|
# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
|
||||||
# USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
# USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
#
|
|
||||||
|
|
||||||
import sys
|
import sys
|
||||||
|
|
||||||
|
|
||||||
def get_exception():
|
def get_exception():
|
||||||
"""Get the current exception.
|
"""Get the current exception.
|
||||||
|
|
||||||
|
|
|
@ -277,4 +277,3 @@ class RhsmPools(object):
|
||||||
for product in self.products:
|
for product in self.products:
|
||||||
if r.search(product._name):
|
if r.search(product._name):
|
||||||
yield product
|
yield product
|
||||||
|
|
||||||
|
|
|
@ -25,20 +25,20 @@
|
||||||
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||||
# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
|
# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
|
||||||
# USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
# USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
#
|
|
||||||
|
|
||||||
import os
|
|
||||||
import shlex
|
|
||||||
import subprocess
|
|
||||||
import glob
|
import glob
|
||||||
import select
|
import os
|
||||||
import pickle
|
import pickle
|
||||||
import platform
|
import platform
|
||||||
|
import select
|
||||||
|
import shlex
|
||||||
|
import subprocess
|
||||||
import traceback
|
import traceback
|
||||||
|
|
||||||
from ansible.module_utils.six import PY2, b
|
from ansible.module_utils.six import PY2, b
|
||||||
from ansible.module_utils._text import to_bytes, to_text
|
from ansible.module_utils._text import to_bytes, to_text
|
||||||
|
|
||||||
|
|
||||||
def sysv_is_enabled(name):
|
def sysv_is_enabled(name):
|
||||||
'''
|
'''
|
||||||
This function will check if the service name supplied
|
This function will check if the service name supplied
|
||||||
|
@ -48,6 +48,7 @@ def sysv_is_enabled(name):
|
||||||
'''
|
'''
|
||||||
return bool(glob.glob('/etc/rc?.d/S??%s' % name))
|
return bool(glob.glob('/etc/rc?.d/S??%s' % name))
|
||||||
|
|
||||||
|
|
||||||
def get_sysv_script(name):
|
def get_sysv_script(name):
|
||||||
'''
|
'''
|
||||||
This function will return the expected path for an init script
|
This function will return the expected path for an init script
|
||||||
|
@ -62,6 +63,7 @@ def get_sysv_script(name):
|
||||||
|
|
||||||
return result
|
return result
|
||||||
|
|
||||||
|
|
||||||
def sysv_exists(name):
|
def sysv_exists(name):
|
||||||
'''
|
'''
|
||||||
This function will return True or False depending on
|
This function will return True or False depending on
|
||||||
|
@ -71,6 +73,7 @@ def sysv_exists(name):
|
||||||
'''
|
'''
|
||||||
return os.path.exists(get_sysv_script(name))
|
return os.path.exists(get_sysv_script(name))
|
||||||
|
|
||||||
|
|
||||||
def fail_if_missing(module, found, service, msg=''):
|
def fail_if_missing(module, found, service, msg=''):
|
||||||
'''
|
'''
|
||||||
This function will return an error or exit gracefully depending on check mode status
|
This function will return an error or exit gracefully depending on check mode status
|
||||||
|
@ -87,6 +90,7 @@ def fail_if_missing(module, found, service, msg=''):
|
||||||
else:
|
else:
|
||||||
module.fail_json(msg='Could not find the requested service %s: %s' % (service, msg))
|
module.fail_json(msg='Could not find the requested service %s: %s' % (service, msg))
|
||||||
|
|
||||||
|
|
||||||
def daemonize(module, cmd):
|
def daemonize(module, cmd):
|
||||||
'''
|
'''
|
||||||
Execute a command while detaching as a deamon, returns rc, stdout, and stderr.
|
Execute a command while detaching as a deamon, returns rc, stdout, and stderr.
|
||||||
|
@ -207,6 +211,7 @@ def daemonize(module, cmd):
|
||||||
# py2 and py3)
|
# py2 and py3)
|
||||||
return pickle.loads(to_bytes(return_data, errors=errors))
|
return pickle.loads(to_bytes(return_data, errors=errors))
|
||||||
|
|
||||||
|
|
||||||
def check_ps(module, pattern):
|
def check_ps(module, pattern):
|
||||||
|
|
||||||
# Set ps flags
|
# Set ps flags
|
||||||
|
|
|
@ -281,5 +281,8 @@ class CliBase(object):
|
||||||
exc = get_exception()
|
exc = get_exception()
|
||||||
raise NetworkError(to_native(exc))
|
raise NetworkError(to_native(exc))
|
||||||
|
|
||||||
run_commands = lambda self, x: self.execute(to_list(x))
|
def run_commands(self, x):
|
||||||
exec_command = lambda self, x: self.shell.send(self.to_command(x))
|
return self.execute(to_list(x))
|
||||||
|
|
||||||
|
def exec_command(self, x):
|
||||||
|
return self.shell.send(self.to_command(x))
|
||||||
|
|
|
@ -26,6 +26,7 @@
|
||||||
# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
|
# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
|
||||||
# USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
# USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
|
||||||
|
|
||||||
def _get_quote_state(token, quote_char):
|
def _get_quote_state(token, quote_char):
|
||||||
'''
|
'''
|
||||||
the goal of this block is to determine if the quoted string
|
the goal of this block is to determine if the quoted string
|
||||||
|
@ -45,6 +46,7 @@ def _get_quote_state(token, quote_char):
|
||||||
quote_char = cur_char
|
quote_char = cur_char
|
||||||
return quote_char
|
return quote_char
|
||||||
|
|
||||||
|
|
||||||
def _count_jinja2_blocks(token, cur_depth, open_token, close_token):
|
def _count_jinja2_blocks(token, cur_depth, open_token, close_token):
|
||||||
'''
|
'''
|
||||||
this function counts the number of opening/closing blocks for a
|
this function counts the number of opening/closing blocks for a
|
||||||
|
@ -59,6 +61,7 @@ def _count_jinja2_blocks(token, cur_depth, open_token, close_token):
|
||||||
cur_depth = 0
|
cur_depth = 0
|
||||||
return cur_depth
|
return cur_depth
|
||||||
|
|
||||||
|
|
||||||
def split_args(args):
|
def split_args(args):
|
||||||
'''
|
'''
|
||||||
Splits args on whitespace, but intelligently reassembles
|
Splits args on whitespace, but intelligently reassembles
|
||||||
|
@ -201,12 +204,13 @@ def split_args(args):
|
||||||
|
|
||||||
return params
|
return params
|
||||||
|
|
||||||
|
|
||||||
def is_quoted(data):
|
def is_quoted(data):
|
||||||
return len(data) > 0 and (data[0] == '"' and data[-1] == '"' or data[0] == "'" and data[-1] == "'")
|
return len(data) > 0 and (data[0] == '"' and data[-1] == '"' or data[0] == "'" and data[-1] == "'")
|
||||||
|
|
||||||
|
|
||||||
def unquote(data):
|
def unquote(data):
|
||||||
''' removes first and last quotes from a string, if the string starts and ends with the same quotes '''
|
''' removes first and last quotes from a string, if the string starts and ends with the same quotes '''
|
||||||
if is_quoted(data):
|
if is_quoted(data):
|
||||||
return data[1:-1]
|
return data[1:-1]
|
||||||
return data
|
return data
|
||||||
|
|
||||||
|
|
|
@ -118,7 +118,7 @@ def uldap():
|
||||||
base=base_dn(),
|
base=base_dn(),
|
||||||
binddn=bind_dn,
|
binddn=bind_dn,
|
||||||
bindpw=pwd,
|
bindpw=pwd,
|
||||||
start_tls = 1
|
start_tls=1,
|
||||||
)
|
)
|
||||||
|
|
||||||
return _singleton('uldap', construct)
|
return _singleton('uldap', construct)
|
||||||
|
|
|
@ -206,17 +206,14 @@ except ImportError:
|
||||||
HAS_MATCH_HOSTNAME = False
|
HAS_MATCH_HOSTNAME = False
|
||||||
|
|
||||||
if not HAS_MATCH_HOSTNAME:
|
if not HAS_MATCH_HOSTNAME:
|
||||||
###
|
# The following block of code is under the terms and conditions of the
|
||||||
### The following block of code is under the terms and conditions of the
|
# Python Software Foundation License
|
||||||
### Python Software Foundation License
|
|
||||||
###
|
|
||||||
|
|
||||||
"""The match_hostname() function from Python 3.4, essential when using SSL."""
|
"""The match_hostname() function from Python 3.4, essential when using SSL."""
|
||||||
|
|
||||||
class CertificateError(ValueError):
|
class CertificateError(ValueError):
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
|
||||||
def _dnsname_match(dn, hostname, max_wildcards=1):
|
def _dnsname_match(dn, hostname, max_wildcards=1):
|
||||||
"""Matching according to RFC 6125, section 6.4.3
|
"""Matching according to RFC 6125, section 6.4.3
|
||||||
|
|
||||||
|
@ -269,7 +266,6 @@ if not HAS_MATCH_HOSTNAME:
|
||||||
pat = re.compile(r'\A' + r'\.'.join(pats) + r'\Z', re.IGNORECASE)
|
pat = re.compile(r'\A' + r'\.'.join(pats) + r'\Z', re.IGNORECASE)
|
||||||
return pat.match(hostname)
|
return pat.match(hostname)
|
||||||
|
|
||||||
|
|
||||||
def match_hostname(cert, hostname):
|
def match_hostname(cert, hostname):
|
||||||
"""Verify that *cert* (in decoded format as returned by
|
"""Verify that *cert* (in decoded format as returned by
|
||||||
SSLSocket.getpeercert()) matches the *hostname*. RFC 2818 and RFC 6125
|
SSLSocket.getpeercert()) matches the *hostname*. RFC 2818 and RFC 6125
|
||||||
|
@ -299,20 +295,13 @@ if not HAS_MATCH_HOSTNAME:
|
||||||
return
|
return
|
||||||
dnsnames.append(value)
|
dnsnames.append(value)
|
||||||
if len(dnsnames) > 1:
|
if len(dnsnames) > 1:
|
||||||
raise CertificateError("hostname %r "
|
raise CertificateError("hostname %r " "doesn't match either of %s" % (hostname, ', '.join(map(repr, dnsnames))))
|
||||||
"doesn't match either of %s"
|
|
||||||
% (hostname, ', '.join(map(repr, dnsnames))))
|
|
||||||
elif len(dnsnames) == 1:
|
elif len(dnsnames) == 1:
|
||||||
raise CertificateError("hostname %r "
|
raise CertificateError("hostname %r doesn't match %r" % (hostname, dnsnames[0]))
|
||||||
"doesn't match %r"
|
|
||||||
% (hostname, dnsnames[0]))
|
|
||||||
else:
|
else:
|
||||||
raise CertificateError("no appropriate commonName or "
|
raise CertificateError("no appropriate commonName or subjectAltName fields were found")
|
||||||
"subjectAltName fields were found")
|
|
||||||
|
|
||||||
###
|
# End of Python Software Foundation Licensed code
|
||||||
### End of Python Software Foundation Licensed code
|
|
||||||
###
|
|
||||||
|
|
||||||
HAS_MATCH_HOSTNAME = True
|
HAS_MATCH_HOSTNAME = True
|
||||||
|
|
||||||
|
@ -552,8 +541,7 @@ def RedirectHandlerFactory(follow_redirects=None, validate_certs=True):
|
||||||
# be conciliant with URIs containing a space
|
# be conciliant with URIs containing a space
|
||||||
newurl = newurl.replace(' ', '%20')
|
newurl = newurl.replace(' ', '%20')
|
||||||
newheaders = dict((k, v) for k, v in req.headers.items()
|
newheaders = dict((k, v) for k, v in req.headers.items()
|
||||||
if k.lower() not in ("content-length", "content-type")
|
if k.lower() not in ("content-length", "content-type"))
|
||||||
)
|
|
||||||
try:
|
try:
|
||||||
# Python 2-3.3
|
# Python 2-3.3
|
||||||
origin_req_host = req.get_origin_req_host()
|
origin_req_host = req.get_origin_req_host()
|
||||||
|
|
|
@ -15,6 +15,7 @@
|
||||||
# along with Ansible. If not, see <http://www.gnu.org/licenses/>.
|
# along with Ansible. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
import os
|
import os
|
||||||
|
|
||||||
try:
|
try:
|
||||||
from pyvcloud.vcloudair import VCA
|
from pyvcloud.vcloudair import VCA
|
||||||
HAS_PYVCLOUD = True
|
HAS_PYVCLOUD = True
|
||||||
|
@ -29,12 +30,14 @@ LOGIN_HOST = {'vca': 'vca.vmware.com', 'vchs': 'vchs.vmware.com'}
|
||||||
DEFAULT_SERVICE_TYPE = 'vca'
|
DEFAULT_SERVICE_TYPE = 'vca'
|
||||||
DEFAULT_VERSION = '5.7'
|
DEFAULT_VERSION = '5.7'
|
||||||
|
|
||||||
|
|
||||||
class VcaError(Exception):
|
class VcaError(Exception):
|
||||||
|
|
||||||
def __init__(self, msg, **kwargs):
|
def __init__(self, msg, **kwargs):
|
||||||
self.kwargs = kwargs
|
self.kwargs = kwargs
|
||||||
super(VcaError, self).__init__(msg)
|
super(VcaError, self).__init__(msg)
|
||||||
|
|
||||||
|
|
||||||
def vca_argument_spec():
|
def vca_argument_spec():
|
||||||
return dict(
|
return dict(
|
||||||
username=dict(type='str', aliases=['user'], required=True),
|
username=dict(type='str', aliases=['user'], required=True),
|
||||||
|
@ -50,6 +53,7 @@ def vca_argument_spec():
|
||||||
verify_certs=dict(type='bool', default=True)
|
verify_certs=dict(type='bool', default=True)
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
class VcaAnsibleModule(AnsibleModule):
|
class VcaAnsibleModule(AnsibleModule):
|
||||||
|
|
||||||
def __init__(self, *args, **kwargs):
|
def __init__(self, *args, **kwargs):
|
||||||
|
@ -193,7 +197,6 @@ class VcaAnsibleModule(AnsibleModule):
|
||||||
self.exit_json(**kwargs)
|
self.exit_json(**kwargs)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
# -------------------------------------------------------------
|
# -------------------------------------------------------------
|
||||||
# 9/18/2015 @privateip
|
# 9/18/2015 @privateip
|
||||||
# All of the functions below here were migrated from the original
|
# All of the functions below here were migrated from the original
|
||||||
|
@ -206,6 +209,7 @@ VCA_REQ_ARGS = ['instance_id', 'vdc_name']
|
||||||
VCHS_REQ_ARGS = ['service_id']
|
VCHS_REQ_ARGS = ['service_id']
|
||||||
VCD_REQ_ARGS = []
|
VCD_REQ_ARGS = []
|
||||||
|
|
||||||
|
|
||||||
def _validate_module(module):
|
def _validate_module(module):
|
||||||
if not HAS_PYVCLOUD:
|
if not HAS_PYVCLOUD:
|
||||||
module.fail_json(msg="python module pyvcloud is needed for this module")
|
module.fail_json(msg="python module pyvcloud is needed for this module")
|
||||||
|
@ -237,6 +241,7 @@ def serialize_instances(instance_list):
|
||||||
instances.append(dict(apiUrl=i['apiUrl'], instance_id=i['id']))
|
instances.append(dict(apiUrl=i['apiUrl'], instance_id=i['id']))
|
||||||
return instances
|
return instances
|
||||||
|
|
||||||
|
|
||||||
def _vca_login(vca, password, instance):
|
def _vca_login(vca, password, instance):
|
||||||
if not vca.login(password=password):
|
if not vca.login(password=password):
|
||||||
raise VcaError("Login Failed: Please check username or password",
|
raise VcaError("Login Failed: Please check username or password",
|
||||||
|
@ -249,6 +254,7 @@ def _vca_login(vca, password, instance):
|
||||||
|
|
||||||
return vca
|
return vca
|
||||||
|
|
||||||
|
|
||||||
def _vchs_login(vca, password, service, org):
|
def _vchs_login(vca, password, service, org):
|
||||||
if not vca.login(password=password):
|
if not vca.login(password=password):
|
||||||
raise VcaError("Login Failed: Please check username or password",
|
raise VcaError("Login Failed: Please check username or password",
|
||||||
|
@ -272,6 +278,7 @@ def _vcd_login(vca, password, org):
|
||||||
if not vca.login(token=vca.token, org=org, org_url=vca.vcloud_session.org_url):
|
if not vca.login(token=vca.token, org=org, org_url=vca.vcloud_session.org_url):
|
||||||
raise VcaError("Failed to login to org", error=vca.response.content)
|
raise VcaError("Failed to login to org", error=vca.response.content)
|
||||||
|
|
||||||
|
|
||||||
def vca_login(module):
|
def vca_login(module):
|
||||||
service_type = module.params.get('service_type')
|
service_type = module.params.get('service_type')
|
||||||
username = module.params.get('username')
|
username = module.params.get('username')
|
||||||
|
@ -323,8 +330,3 @@ def vca_login(module):
|
||||||
module.fail_json(msg=e.message, **e.kwargs)
|
module.fail_json(msg=e.message, **e.kwargs)
|
||||||
|
|
||||||
return vca
|
return vca
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -21,6 +21,7 @@ __metaclass__ = type
|
||||||
|
|
||||||
from copy import deepcopy
|
from copy import deepcopy
|
||||||
|
|
||||||
|
|
||||||
class Attribute:
|
class Attribute:
|
||||||
|
|
||||||
def __init__(self, isa=None, private=False, default=None, required=False, listof=None, priority=0, class_type=None, always_post_validate=False,
|
def __init__(self, isa=None, private=False, default=None, required=False, listof=None, priority=0, class_type=None, always_post_validate=False,
|
||||||
|
|
|
@ -441,7 +441,7 @@ class Base(with_metaclass(BaseMeta, object)):
|
||||||
|
|
||||||
except (TypeError, ValueError) as e:
|
except (TypeError, ValueError) as e:
|
||||||
raise AnsibleParserError("the field '%s' has an invalid value (%s), and could not be converted to an %s. "
|
raise AnsibleParserError("the field '%s' has an invalid value (%s), and could not be converted to an %s. "
|
||||||
" Error was: %s" % (name, value, attribute.isa, e), obj=self.get_ds())
|
"The error was: %s" % (name, value, attribute.isa, e), obj=self.get_ds())
|
||||||
except (AnsibleUndefinedVariable, UndefinedError) as e:
|
except (AnsibleUndefinedVariable, UndefinedError) as e:
|
||||||
if templar._fail_on_undefined_errors and name != 'name':
|
if templar._fail_on_undefined_errors and name != 'name':
|
||||||
raise AnsibleParserError("the field '%s' has an invalid value, which appears to include a variable that is undefined. "
|
raise AnsibleParserError("the field '%s' has an invalid value, which appears to include a variable that is undefined. "
|
||||||
|
|
|
@ -29,6 +29,7 @@ except ImportError:
|
||||||
from ansible.utils.display import Display
|
from ansible.utils.display import Display
|
||||||
display = Display()
|
display = Display()
|
||||||
|
|
||||||
|
|
||||||
class Become:
|
class Become:
|
||||||
|
|
||||||
# Privilege escalation
|
# Privilege escalation
|
||||||
|
@ -101,4 +102,3 @@ class Become:
|
||||||
become_method = C.DEFAULT_BECOME_METHOD
|
become_method = C.DEFAULT_BECOME_METHOD
|
||||||
if become_user is None:
|
if become_user is None:
|
||||||
become_user = C.DEFAULT_BECOME_USER
|
become_user = C.DEFAULT_BECOME_USER
|
||||||
|
|
||||||
|
|
|
@ -28,6 +28,7 @@ from ansible.playbook.helpers import load_list_of_tasks
|
||||||
from ansible.playbook.role import Role
|
from ansible.playbook.role import Role
|
||||||
from ansible.playbook.taggable import Taggable
|
from ansible.playbook.taggable import Taggable
|
||||||
|
|
||||||
|
|
||||||
class Block(Base, Become, Conditional, Taggable):
|
class Block(Base, Become, Conditional, Taggable):
|
||||||
|
|
||||||
# main block fields containing the task lists
|
# main block fields containing the task lists
|
||||||
|
@ -385,4 +386,3 @@ class Block(Base, Become, Conditional, Taggable):
|
||||||
return self._parent.all_parents_static()
|
return self._parent.all_parents_static()
|
||||||
|
|
||||||
return True
|
return True
|
||||||
|
|
||||||
|
|
|
@ -41,6 +41,7 @@ DEFINED_REGEX = re.compile(r'(hostvars\[.+\]|[\w_]+)\s+(not\s+is|is|is\s+not)\s+
|
||||||
LOOKUP_REGEX = re.compile(r'lookup\s*\(')
|
LOOKUP_REGEX = re.compile(r'lookup\s*\(')
|
||||||
VALID_VAR_REGEX = re.compile("^[_A-Za-z][_a-zA-Z0-9]*$")
|
VALID_VAR_REGEX = re.compile("^[_A-Za-z][_a-zA-Z0-9]*$")
|
||||||
|
|
||||||
|
|
||||||
class Conditional:
|
class Conditional:
|
||||||
|
|
||||||
'''
|
'''
|
||||||
|
@ -234,7 +235,4 @@ class Conditional:
|
||||||
# trigger the AnsibleUndefinedVariable exception again below
|
# trigger the AnsibleUndefinedVariable exception again below
|
||||||
raise
|
raise
|
||||||
except Exception as new_e:
|
except Exception as new_e:
|
||||||
raise AnsibleUndefinedVariable(
|
raise AnsibleUndefinedVariable("error while evaluating conditional (%s): %s" % (original, e))
|
||||||
"error while evaluating conditional (%s): %s" % (original, e)
|
|
||||||
)
|
|
||||||
|
|
||||||
|
|
|
@ -22,6 +22,7 @@ __metaclass__ = type
|
||||||
from ansible.playbook.attribute import FieldAttribute
|
from ansible.playbook.attribute import FieldAttribute
|
||||||
from ansible.playbook.task import Task
|
from ansible.playbook.task import Task
|
||||||
|
|
||||||
|
|
||||||
class Handler(Task):
|
class Handler(Task):
|
||||||
|
|
||||||
_listen = FieldAttribute(isa='list')
|
_listen = FieldAttribute(isa='list')
|
||||||
|
|
|
@ -20,8 +20,9 @@ from __future__ import (absolute_import, division, print_function)
|
||||||
__metaclass__ = type
|
__metaclass__ = type
|
||||||
|
|
||||||
# from ansible.inventory.host import Host
|
# from ansible.inventory.host import Host
|
||||||
from ansible.playbook.task_include import TaskInclude
|
|
||||||
from ansible.playbook.handler import Handler
|
from ansible.playbook.handler import Handler
|
||||||
|
from ansible.playbook.task_include import TaskInclude
|
||||||
|
|
||||||
|
|
||||||
class HandlerTaskInclude(Handler, TaskInclude):
|
class HandlerTaskInclude(Handler, TaskInclude):
|
||||||
|
|
||||||
|
@ -29,4 +30,3 @@ class HandlerTaskInclude(Handler, TaskInclude):
|
||||||
def load(data, block=None, role=None, task_include=None, variable_manager=None, loader=None):
|
def load(data, block=None, role=None, task_include=None, variable_manager=None, loader=None):
|
||||||
t = HandlerTaskInclude(block=block, role=role, task_include=task_include)
|
t = HandlerTaskInclude(block=block, role=role, task_include=task_include)
|
||||||
return t.load_data(data, variable_manager=variable_manager, loader=loader)
|
return t.load_data(data, variable_manager=variable_manager, loader=loader)
|
||||||
|
|
||||||
|
|
|
@ -179,9 +179,9 @@ def load_list_of_tasks(ds, play, block=None, role=None, task_include=None, use_h
|
||||||
include_target = templar.template(t.args['_raw_params'])
|
include_target = templar.template(t.args['_raw_params'])
|
||||||
except AnsibleUndefinedVariable:
|
except AnsibleUndefinedVariable:
|
||||||
raise AnsibleParserError(
|
raise AnsibleParserError(
|
||||||
"Error when evaluating variable in include name: %s.\n\n" \
|
"Error when evaluating variable in include name: %s.\n\n"
|
||||||
"When using static includes, ensure that any variables used in their names are defined in vars/vars_files\n" \
|
"When using static includes, ensure that any variables used in their names are defined in vars/vars_files\n"
|
||||||
"or extra-vars passed in from the command line. Static includes cannot use variables from inventory\n" \
|
"or extra-vars passed in from the command line. Static includes cannot use variables from inventory\n"
|
||||||
"sources like group or host vars." % t.args['_raw_params'],
|
"sources like group or host vars." % t.args['_raw_params'],
|
||||||
obj=task_ds,
|
obj=task_ds,
|
||||||
suppress_extended_error=True,
|
suppress_extended_error=True,
|
||||||
|
@ -209,11 +209,11 @@ def load_list_of_tasks(ds, play, block=None, role=None, task_include=None, use_h
|
||||||
C.DEFAULT_HANDLER_INCLUDES_STATIC and use_handlers:
|
C.DEFAULT_HANDLER_INCLUDES_STATIC and use_handlers:
|
||||||
raise
|
raise
|
||||||
display.deprecated(
|
display.deprecated(
|
||||||
"Included file '%s' not found, however since this include is not " \
|
"Included file '%s' not found, however since this include is not "
|
||||||
"explicitly marked as 'static: yes', we will try and include it dynamically " \
|
"explicitly marked as 'static: yes', we will try and include it dynamically "
|
||||||
"later. In the future, this will be an error unless 'static: no' is used " \
|
"later. In the future, this will be an error unless 'static: no' is used "
|
||||||
"on the include task. If you do not want missing includes to be considered " \
|
"on the include task. If you do not want missing includes to be considered "
|
||||||
"dynamic, use 'static: yes' on the include or set the global ansible.cfg " \
|
"dynamic, use 'static: yes' on the include or set the global ansible.cfg "
|
||||||
"options to make all inclues static for tasks and/or handlers" % include_file, version="2.7"
|
"options to make all inclues static for tasks and/or handlers" % include_file, version="2.7"
|
||||||
)
|
)
|
||||||
task_list.append(t)
|
task_list.append(t)
|
||||||
|
@ -242,7 +242,7 @@ def load_list_of_tasks(ds, play, block=None, role=None, task_include=None, use_h
|
||||||
if len(tags) > 0:
|
if len(tags) > 0:
|
||||||
if len(ti_copy.tags) > 0:
|
if len(ti_copy.tags) > 0:
|
||||||
raise AnsibleParserError(
|
raise AnsibleParserError(
|
||||||
"Include tasks should not specify tags in more than one way (both via args and directly on the task). " \
|
"Include tasks should not specify tags in more than one way (both via args and directly on the task). "
|
||||||
"Mixing styles in which tags are specified is prohibited for whole import hierarchy, not only for single import statement",
|
"Mixing styles in which tags are specified is prohibited for whole import hierarchy, not only for single import statement",
|
||||||
obj=task_ds,
|
obj=task_ds,
|
||||||
suppress_extended_error=True,
|
suppress_extended_error=True,
|
||||||
|
@ -275,7 +275,7 @@ def load_list_of_tasks(ds, play, block=None, role=None, task_include=None, use_h
|
||||||
role=role,
|
role=role,
|
||||||
task_include=None,
|
task_include=None,
|
||||||
variable_manager=variable_manager,
|
variable_manager=variable_manager,
|
||||||
loader=loader
|
loader=loader,
|
||||||
)
|
)
|
||||||
|
|
||||||
# 1. the user has set the 'static' option to false or true
|
# 1. the user has set the 'static' option to false or true
|
||||||
|
@ -293,9 +293,11 @@ def load_list_of_tasks(ds, play, block=None, role=None, task_include=None, use_h
|
||||||
if not templar.is_template(ir.args[param]):
|
if not templar.is_template(ir.args[param]):
|
||||||
needs_templating = True
|
needs_templating = True
|
||||||
break
|
break
|
||||||
is_static = C.DEFAULT_TASK_INCLUDES_STATIC or \
|
is_static = (
|
||||||
(use_handlers and C.DEFAULT_HANDLER_INCLUDES_STATIC) or \
|
C.DEFAULT_TASK_INCLUDES_STATIC or
|
||||||
|
(use_handlers and C.DEFAULT_HANDLER_INCLUDES_STATIC) or
|
||||||
(not needs_templating and ir.all_parents_static() and not ir.loop)
|
(not needs_templating and ir.all_parents_static() and not ir.loop)
|
||||||
|
)
|
||||||
display.debug('Determined that if include_role static is %s' % str(is_static))
|
display.debug('Determined that if include_role static is %s' % str(is_static))
|
||||||
if is_static:
|
if is_static:
|
||||||
# uses compiled list from object
|
# uses compiled list from object
|
||||||
|
@ -331,4 +333,3 @@ def load_list_of_roles(ds, play, current_role_path=None, variable_manager=None,
|
||||||
roles.append(i)
|
roles.append(i)
|
||||||
|
|
||||||
return roles
|
return roles
|
||||||
|
|
||||||
|
|
|
@ -30,6 +30,7 @@ except ImportError:
|
||||||
from ansible.utils.display import Display
|
from ansible.utils.display import Display
|
||||||
display = Display()
|
display = Display()
|
||||||
|
|
||||||
|
|
||||||
class IncludedFile:
|
class IncludedFile:
|
||||||
|
|
||||||
def __init__(self, filename, args, task):
|
def __init__(self, filename, args, task):
|
||||||
|
|
|
@ -36,4 +36,3 @@ class LoopControl(Base):
|
||||||
def load(data, variable_manager=None, loader=None):
|
def load(data, variable_manager=None, loader=None):
|
||||||
t = LoopControl()
|
t = LoopControl()
|
||||||
return t.load_data(data, variable_manager=variable_manager, loader=loader)
|
return t.load_data(data, variable_manager=variable_manager, loader=loader)
|
||||||
|
|
||||||
|
|
|
@ -20,10 +20,8 @@ from __future__ import (absolute_import, division, print_function)
|
||||||
__metaclass__ = type
|
__metaclass__ = type
|
||||||
|
|
||||||
from ansible import constants as C
|
from ansible import constants as C
|
||||||
|
|
||||||
from ansible.errors import AnsibleParserError
|
from ansible.errors import AnsibleParserError
|
||||||
from ansible.module_utils.six import string_types
|
from ansible.module_utils.six import string_types
|
||||||
|
|
||||||
from ansible.playbook.attribute import FieldAttribute
|
from ansible.playbook.attribute import FieldAttribute
|
||||||
from ansible.playbook.base import Base
|
from ansible.playbook.base import Base
|
||||||
from ansible.playbook.become import Become
|
from ansible.playbook.become import Become
|
||||||
|
|
|
@ -155,6 +155,7 @@ RESET_VARS = (
|
||||||
'ansible_port',
|
'ansible_port',
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
class PlayContext(Base):
|
class PlayContext(Base):
|
||||||
|
|
||||||
'''
|
'''
|
||||||
|
@ -243,7 +244,6 @@ class PlayContext(Base):
|
||||||
if play:
|
if play:
|
||||||
self.set_play(play)
|
self.set_play(play)
|
||||||
|
|
||||||
|
|
||||||
def set_play(self, play):
|
def set_play(self, play):
|
||||||
'''
|
'''
|
||||||
Configures this connection information instance with data from
|
Configures this connection information instance with data from
|
||||||
|
@ -464,7 +464,6 @@ class PlayContext(Base):
|
||||||
if task.check_mode is not None:
|
if task.check_mode is not None:
|
||||||
new_info.check_mode = task.check_mode
|
new_info.check_mode = task.check_mode
|
||||||
|
|
||||||
|
|
||||||
return new_info
|
return new_info
|
||||||
|
|
||||||
def make_become_cmd(self, cmd, executable=None):
|
def make_become_cmd(self, cmd, executable=None):
|
||||||
|
@ -490,18 +489,22 @@ class PlayContext(Base):
|
||||||
command = success_cmd
|
command = success_cmd
|
||||||
|
|
||||||
# set executable to use for the privilege escalation method, with various overrides
|
# set executable to use for the privilege escalation method, with various overrides
|
||||||
exe = self.become_exe or \
|
exe = (
|
||||||
getattr(self, '%s_exe' % self.become_method, None) or \
|
self.become_exe or
|
||||||
C.DEFAULT_BECOME_EXE or \
|
getattr(self, '%s_exe' % self.become_method, None) or
|
||||||
getattr(C, 'DEFAULT_%s_EXE' % self.become_method.upper(), None) or \
|
C.DEFAULT_BECOME_EXE or
|
||||||
|
getattr(C, 'DEFAULT_%s_EXE' % self.become_method.upper(), None) or
|
||||||
self.become_method
|
self.become_method
|
||||||
|
)
|
||||||
|
|
||||||
# set flags to use for the privilege escalation method, with various overrides
|
# set flags to use for the privilege escalation method, with various overrides
|
||||||
flags = self.become_flags or \
|
flags = (
|
||||||
getattr(self, '%s_flags' % self.become_method, None) or \
|
self.become_flags or
|
||||||
C.DEFAULT_BECOME_FLAGS or \
|
getattr(self, '%s_flags' % self.become_method, None) or
|
||||||
getattr(C, 'DEFAULT_%s_FLAGS' % self.become_method.upper(), None) or \
|
C.DEFAULT_BECOME_FLAGS or
|
||||||
|
getattr(C, 'DEFAULT_%s_FLAGS' % self.become_method.upper(), None) or
|
||||||
''
|
''
|
||||||
|
)
|
||||||
|
|
||||||
if self.become_method == 'sudo':
|
if self.become_method == 'sudo':
|
||||||
# If we have a password, we run sudo with a randomly-generated
|
# If we have a password, we run sudo with a randomly-generated
|
||||||
|
@ -521,7 +524,6 @@ class PlayContext(Base):
|
||||||
else:
|
else:
|
||||||
becomecmd = '%s %s -u %s %s' % (exe, flags, self.become_user, command)
|
becomecmd = '%s %s -u %s %s' % (exe, flags, self.become_user, command)
|
||||||
|
|
||||||
|
|
||||||
elif self.become_method == 'su':
|
elif self.become_method == 'su':
|
||||||
|
|
||||||
# passing code ref to examine prompt as simple string comparisson isn't good enough with su
|
# passing code ref to examine prompt as simple string comparisson isn't good enough with su
|
||||||
|
@ -645,4 +647,3 @@ class PlayContext(Base):
|
||||||
self.connection = conn_type
|
self.connection = conn_type
|
||||||
|
|
||||||
return self._attributes['connection']
|
return self._attributes['connection']
|
||||||
|
|
||||||
|
|
|
@ -152,4 +152,3 @@ class PlaybookInclude(Base, Conditional, Taggable):
|
||||||
if 'vars' in new_ds:
|
if 'vars' in new_ds:
|
||||||
raise AnsibleParserError("include parameters cannot be mixed with 'vars' entries for include statements", obj=ds)
|
raise AnsibleParserError("include parameters cannot be mixed with 'vars' entries for include statements", obj=ds)
|
||||||
new_ds['vars'] = params
|
new_ds['vars'] = params
|
||||||
|
|
||||||
|
|
|
@ -42,6 +42,7 @@ __all__ = ['Role', 'hash_params']
|
||||||
# in a static method. This is also used in the base class for
|
# in a static method. This is also used in the base class for
|
||||||
# strategies (ansible/plugins/strategy/__init__.py)
|
# strategies (ansible/plugins/strategy/__init__.py)
|
||||||
|
|
||||||
|
|
||||||
def hash_params(params):
|
def hash_params(params):
|
||||||
"""
|
"""
|
||||||
Construct a data structure of parameters that is hashable.
|
Construct a data structure of parameters that is hashable.
|
||||||
|
@ -286,7 +287,6 @@ class Role(Base, Become, Conditional, Taggable):
|
||||||
|
|
||||||
return deps
|
return deps
|
||||||
|
|
||||||
#------------------------------------------------------------------------------
|
|
||||||
# other functions
|
# other functions
|
||||||
|
|
||||||
def add_parent(self, parent_role):
|
def add_parent(self, parent_role):
|
||||||
|
@ -488,4 +488,3 @@ class Role(Base, Become, Conditional, Taggable):
|
||||||
parent.set_loader(loader)
|
parent.set_loader(loader)
|
||||||
for dep in self.get_direct_dependencies():
|
for dep in self.get_direct_dependencies():
|
||||||
dep.set_loader(loader)
|
dep.set_loader(loader)
|
||||||
|
|
||||||
|
|
|
@ -205,8 +205,8 @@ class RoleDefinition(Base, Become, Conditional, Taggable):
|
||||||
# remember to update it manually.
|
# remember to update it manually.
|
||||||
if key not in base_attribute_names or key in ('connection', 'port', 'remote_user'):
|
if key not in base_attribute_names or key in ('connection', 'port', 'remote_user'):
|
||||||
if key in ('connection', 'port', 'remote_user'):
|
if key in ('connection', 'port', 'remote_user'):
|
||||||
display.deprecated("Using '%s' as a role param has been deprecated. " % key + \
|
display.deprecated("Using '%s' as a role param has been deprecated. " % key +
|
||||||
"In the future, these values should be entered in the `vars:` " + \
|
"In the future, these values should be entered in the `vars:` " +
|
||||||
"section for roles, but for now we'll store it as both a param and an attribute.", version="2.7")
|
"section for roles, but for now we'll store it as both a param and an attribute.", version="2.7")
|
||||||
role_def[key] = value
|
role_def[key] = value
|
||||||
# this key does not match a field attribute, so it must be a role param
|
# this key does not match a field attribute, so it must be a role param
|
||||||
|
|
|
@ -57,4 +57,3 @@ class RoleInclude(RoleDefinition):
|
||||||
|
|
||||||
ri = RoleInclude(play=play, role_basedir=current_role_path, variable_manager=variable_manager, loader=loader)
|
ri = RoleInclude(play=play, role_basedir=current_role_path, variable_manager=variable_manager, loader=loader)
|
||||||
return ri.load_data(data, variable_manager=variable_manager, loader=loader)
|
return ri.load_data(data, variable_manager=variable_manager, loader=loader)
|
||||||
|
|
||||||
|
|
|
@ -46,6 +46,7 @@ except ImportError:
|
||||||
from ansible.utils.display import Display
|
from ansible.utils.display import Display
|
||||||
display = Display()
|
display = Display()
|
||||||
|
|
||||||
|
|
||||||
class RoleRequirement(RoleDefinition):
|
class RoleRequirement(RoleDefinition):
|
||||||
|
|
||||||
"""
|
"""
|
||||||
|
@ -228,4 +229,3 @@ class RoleRequirement(RoleDefinition):
|
||||||
|
|
||||||
shutil.rmtree(tempdir, ignore_errors=True)
|
shutil.rmtree(tempdir, ignore_errors=True)
|
||||||
return temp_file.name
|
return temp_file.name
|
||||||
|
|
||||||
|
|
|
@ -60,7 +60,6 @@ class IncludeRole(Task):
|
||||||
self._parent_role = role
|
self._parent_role = role
|
||||||
self._role_name = None
|
self._role_name = None
|
||||||
|
|
||||||
|
|
||||||
def get_block_list(self, play=None, variable_manager=None, loader=None):
|
def get_block_list(self, play=None, variable_manager=None, loader=None):
|
||||||
|
|
||||||
# only need play passed in when dynamic
|
# only need play passed in when dynamic
|
||||||
|
@ -99,7 +98,7 @@ class IncludeRole(Task):
|
||||||
|
|
||||||
ir = IncludeRole(block, role, task_include=task_include).load_data(data, variable_manager=variable_manager, loader=loader)
|
ir = IncludeRole(block, role, task_include=task_include).load_data(data, variable_manager=variable_manager, loader=loader)
|
||||||
|
|
||||||
### Process options
|
# Process options
|
||||||
# name is needed, or use role as alias
|
# name is needed, or use role as alias
|
||||||
ir._role_name = ir.args.get('name', ir.args.get('role'))
|
ir._role_name = ir.args.get('name', ir.args.get('role'))
|
||||||
if ir._role_name is None:
|
if ir._role_name is None:
|
||||||
|
|
|
@ -76,4 +76,3 @@ class TaskInclude(Task):
|
||||||
del all_vars['when']
|
del all_vars['when']
|
||||||
|
|
||||||
return all_vars
|
return all_vars
|
||||||
|
|
||||||
|
|
|
@ -271,7 +271,7 @@ class PluginLoader:
|
||||||
|
|
||||||
# HACK: We have no way of executing python byte
|
# HACK: We have no way of executing python byte
|
||||||
# compiled files as ansible modules so specifically exclude them
|
# compiled files as ansible modules so specifically exclude them
|
||||||
### FIXME: I believe this is only correct for modules and
|
# FIXME: I believe this is only correct for modules and
|
||||||
# module_utils. For all other plugins we want .pyc and .pyo should
|
# module_utils. For all other plugins we want .pyc and .pyo should
|
||||||
# bew valid
|
# bew valid
|
||||||
if full_path.endswith(('.pyc', '.pyo')):
|
if full_path.endswith(('.pyc', '.pyo')):
|
||||||
|
@ -550,4 +550,3 @@ vars_loader = PluginLoader(
|
||||||
C.DEFAULT_VARS_PLUGIN_PATH,
|
C.DEFAULT_VARS_PLUGIN_PATH,
|
||||||
'vars_plugins',
|
'vars_plugins',
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
|
@ -309,8 +309,8 @@ class ActionBase(with_metaclass(ABCMeta, object)):
|
||||||
|
|
||||||
tmp_rm_data = self._parse_returned_data(tmp_rm_res)
|
tmp_rm_data = self._parse_returned_data(tmp_rm_res)
|
||||||
if tmp_rm_data.get('rc', 0) != 0:
|
if tmp_rm_data.get('rc', 0) != 0:
|
||||||
display.warning('Error deleting remote temporary files (rc: {0}, stderr: {1})'.format(tmp_rm_res.get('rc'),
|
display.warning('Error deleting remote temporary files (rc: %s, stderr: %s})'
|
||||||
tmp_rm_res.get('stderr', 'No error string available.')))
|
% (tmp_rm_res.get('rc'), tmp_rm_res.get('stderr', 'No error string available.')))
|
||||||
|
|
||||||
def _transfer_file(self, local_path, remote_path):
|
def _transfer_file(self, local_path, remote_path):
|
||||||
self._connection.put_file(local_path, remote_path)
|
self._connection.put_file(local_path, remote_path)
|
||||||
|
@ -408,7 +408,7 @@ class ActionBase(with_metaclass(ABCMeta, object)):
|
||||||
setfacl_mode = 'r-x'
|
setfacl_mode = 'r-x'
|
||||||
else:
|
else:
|
||||||
chmod_mode = 'rX'
|
chmod_mode = 'rX'
|
||||||
### Note: this form fails silently on freebsd. We currently
|
# NOTE: this form fails silently on freebsd. We currently
|
||||||
# never call _fixup_perms2() with execute=False but if we
|
# never call _fixup_perms2() with execute=False but if we
|
||||||
# start to we'll have to fix this.
|
# start to we'll have to fix this.
|
||||||
setfacl_mode = 'r-X'
|
setfacl_mode = 'r-X'
|
||||||
|
@ -440,8 +440,9 @@ class ActionBase(with_metaclass(ABCMeta, object)):
|
||||||
raise AnsibleError('Failed to set file mode on remote files (rc: {0}, err: {1})'.format(res['rc'], to_native(res['stderr'])))
|
raise AnsibleError('Failed to set file mode on remote files (rc: {0}, err: {1})'.format(res['rc'], to_native(res['stderr'])))
|
||||||
else:
|
else:
|
||||||
raise AnsibleError('Failed to set permissions on the temporary files Ansible needs to create when becoming an unprivileged user '
|
raise AnsibleError('Failed to set permissions on the temporary files Ansible needs to create when becoming an unprivileged user '
|
||||||
' (rc: {0}, err: {1}). For information on working around this,'
|
'(rc: %s, err: %s}). For information on working around this, see '
|
||||||
' see https://docs.ansible.com/ansible/become.html#becoming-an-unprivileged-user'.format(res['rc'], to_native(res['stderr'])))
|
'https://docs.ansible.com/ansible/become.html#becoming-an-unprivileged-user'
|
||||||
|
% (res['rc'], to_native(res['stderr'])))
|
||||||
elif execute:
|
elif execute:
|
||||||
# Can't depend on the file being transferred with execute permissions.
|
# Can't depend on the file being transferred with execute permissions.
|
||||||
# Only need user perms because no become was used here
|
# Only need user perms because no become was used here
|
||||||
|
@ -611,8 +612,6 @@ class ActionBase(with_metaclass(ABCMeta, object)):
|
||||||
# give the module the socket for persistent connections
|
# give the module the socket for persistent connections
|
||||||
module_args['_ansible_socket'] = task_vars.get('ansible_socket')
|
module_args['_ansible_socket'] = task_vars.get('ansible_socket')
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
def _execute_module(self, module_name=None, module_args=None, tmp=None, task_vars=None, persist_files=False, delete_remote_tmp=True, wrap_async=False):
|
def _execute_module(self, module_name=None, module_args=None, tmp=None, task_vars=None, persist_files=False, delete_remote_tmp=True, wrap_async=False):
|
||||||
'''
|
'''
|
||||||
Transfer and run a module along with its arguments.
|
Transfer and run a module along with its arguments.
|
||||||
|
@ -641,7 +640,7 @@ class ActionBase(with_metaclass(ABCMeta, object)):
|
||||||
if not self._is_pipelining_enabled(module_style, wrap_async):
|
if not self._is_pipelining_enabled(module_style, wrap_async):
|
||||||
|
|
||||||
# we might need remote tmp dir
|
# we might need remote tmp dir
|
||||||
if not tmp or not 'tmp' in tmp:
|
if not tmp or 'tmp' not in tmp:
|
||||||
tmp = self._make_tmp_path()
|
tmp = self._make_tmp_path()
|
||||||
|
|
||||||
remote_module_filename = self._connection._shell.get_remote_filename(module_path)
|
remote_module_filename = self._connection._shell.get_remote_filename(module_path)
|
||||||
|
@ -784,7 +783,6 @@ class ActionBase(with_metaclass(ABCMeta, object)):
|
||||||
if key in data and not data[key]:
|
if key in data and not data[key]:
|
||||||
del data[key]
|
del data[key]
|
||||||
|
|
||||||
|
|
||||||
def _clean_returned_data(self, data):
|
def _clean_returned_data(self, data):
|
||||||
remove_keys = set()
|
remove_keys = set()
|
||||||
fact_keys = set(data.keys())
|
fact_keys = set(data.keys())
|
||||||
|
|
|
@ -22,7 +22,6 @@ __metaclass__ = type
|
||||||
from ansible.plugins.action import ActionBase
|
from ansible.plugins.action import ActionBase
|
||||||
from ansible.plugins.action.net_config import ActionModule as NetActionModule
|
from ansible.plugins.action.net_config import ActionModule as NetActionModule
|
||||||
|
|
||||||
|
|
||||||
class ActionModule(NetActionModule, ActionBase):
|
class ActionModule(NetActionModule, ActionBase):
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -22,5 +22,6 @@ __metaclass__ = type
|
||||||
from ansible.plugins.action import ActionBase
|
from ansible.plugins.action import ActionBase
|
||||||
from ansible.plugins.action.net_template import ActionModule as NetActionModule
|
from ansible.plugins.action.net_template import ActionModule as NetActionModule
|
||||||
|
|
||||||
|
|
||||||
class ActionModule(NetActionModule, ActionBase):
|
class ActionModule(NetActionModule, ActionBase):
|
||||||
pass
|
pass
|
||||||
|
|
|
@ -27,6 +27,7 @@ import urlparse
|
||||||
from ansible.module_utils._text import to_text
|
from ansible.module_utils._text import to_text
|
||||||
from ansible.plugins.action.eos import ActionModule as _ActionModule
|
from ansible.plugins.action.eos import ActionModule as _ActionModule
|
||||||
|
|
||||||
|
|
||||||
class ActionModule(_ActionModule):
|
class ActionModule(_ActionModule):
|
||||||
|
|
||||||
def run(self, tmp=None, task_vars=None):
|
def run(self, tmp=None, task_vars=None):
|
||||||
|
|
|
@ -23,7 +23,7 @@ from ansible.plugins.action import ActionBase
|
||||||
class ActionModule(ActionBase):
|
class ActionModule(ActionBase):
|
||||||
''' Create inventory groups based on variables '''
|
''' Create inventory groups based on variables '''
|
||||||
|
|
||||||
### We need to be able to modify the inventory
|
# We need to be able to modify the inventory
|
||||||
TRANSFERS_FILES = False
|
TRANSFERS_FILES = False
|
||||||
|
|
||||||
def run(self, tmp=None, task_vars=None):
|
def run(self, tmp=None, task_vars=None):
|
||||||
|
|
|
@ -27,6 +27,7 @@ import urlparse
|
||||||
from ansible.module_utils._text import to_text
|
from ansible.module_utils._text import to_text
|
||||||
from ansible.plugins.action.ios import ActionModule as _ActionModule
|
from ansible.plugins.action.ios import ActionModule as _ActionModule
|
||||||
|
|
||||||
|
|
||||||
class ActionModule(_ActionModule):
|
class ActionModule(_ActionModule):
|
||||||
|
|
||||||
def run(self, tmp=None, task_vars=None):
|
def run(self, tmp=None, task_vars=None):
|
||||||
|
|
|
@ -27,6 +27,7 @@ import urlparse
|
||||||
from ansible.module_utils._text import to_text
|
from ansible.module_utils._text import to_text
|
||||||
from ansible.plugins.action.iosxr import ActionModule as _ActionModule
|
from ansible.plugins.action.iosxr import ActionModule as _ActionModule
|
||||||
|
|
||||||
|
|
||||||
class ActionModule(_ActionModule):
|
class ActionModule(_ActionModule):
|
||||||
|
|
||||||
def run(self, tmp=None, task_vars=None):
|
def run(self, tmp=None, task_vars=None):
|
||||||
|
@ -100,4 +101,3 @@ class ActionModule(_ActionModule):
|
||||||
searchpath.append(os.path.dirname(source))
|
searchpath.append(os.path.dirname(source))
|
||||||
self._templar.environment.loader.searchpath = searchpath
|
self._templar.environment.loader.searchpath = searchpath
|
||||||
self._task.args['src'] = self._templar.template(template_data)
|
self._task.args['src'] = self._templar.template(template_data)
|
||||||
|
|
||||||
|
|
|
@ -27,6 +27,7 @@ import urlparse
|
||||||
from ansible.module_utils._text import to_text
|
from ansible.module_utils._text import to_text
|
||||||
from ansible.plugins.action.junos import ActionModule as _ActionModule
|
from ansible.plugins.action.junos import ActionModule as _ActionModule
|
||||||
|
|
||||||
|
|
||||||
class ActionModule(_ActionModule):
|
class ActionModule(_ActionModule):
|
||||||
|
|
||||||
def run(self, tmp=None, task_vars=None):
|
def run(self, tmp=None, task_vars=None):
|
||||||
|
|
|
@ -27,6 +27,7 @@ import urlparse
|
||||||
from ansible.module_utils._text import to_text
|
from ansible.module_utils._text import to_text
|
||||||
from ansible.plugins.action.nxos import ActionModule as _ActionModule
|
from ansible.plugins.action.nxos import ActionModule as _ActionModule
|
||||||
|
|
||||||
|
|
||||||
class ActionModule(_ActionModule):
|
class ActionModule(_ActionModule):
|
||||||
|
|
||||||
def run(self, tmp=None, task_vars=None):
|
def run(self, tmp=None, task_vars=None):
|
||||||
|
|
|
@ -22,7 +22,6 @@ __metaclass__ = type
|
||||||
from ansible.plugins.action import ActionBase
|
from ansible.plugins.action import ActionBase
|
||||||
from ansible.plugins.action.net_config import ActionModule as NetActionModule
|
from ansible.plugins.action.net_config import ActionModule as NetActionModule
|
||||||
|
|
||||||
|
|
||||||
class ActionModule(NetActionModule, ActionBase):
|
class ActionModule(NetActionModule, ActionBase):
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -48,5 +48,3 @@ class ActionModule(NetActionModule, ActionBase):
|
||||||
del result['_backup']
|
del result['_backup']
|
||||||
|
|
||||||
return result
|
return result
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -163,7 +163,6 @@ class ActionModule(ActionBase):
|
||||||
else:
|
else:
|
||||||
raise AnsibleError('user requested abort!')
|
raise AnsibleError('user requested abort!')
|
||||||
|
|
||||||
|
|
||||||
except AnsibleTimeoutExceeded:
|
except AnsibleTimeoutExceeded:
|
||||||
# this is the exception we expect when the alarm signal
|
# this is the exception we expect when the alarm signal
|
||||||
# fires, so we simply ignore it to move into the cleanup
|
# fires, so we simply ignore it to move into the cleanup
|
||||||
|
|
|
@ -19,14 +19,14 @@
|
||||||
from __future__ import (absolute_import, division, print_function)
|
from __future__ import (absolute_import, division, print_function)
|
||||||
__metaclass__ = type
|
__metaclass__ = type
|
||||||
|
|
||||||
|
import glob
|
||||||
import os
|
import os
|
||||||
import re
|
import re
|
||||||
import time
|
import time
|
||||||
import glob
|
|
||||||
|
|
||||||
from ansible.plugins.action.sros import ActionModule as _ActionModule
|
|
||||||
from ansible.module_utils._text import to_text
|
|
||||||
from ansible.module_utils.six.moves.urllib.parse import urlsplit
|
from ansible.module_utils.six.moves.urllib.parse import urlsplit
|
||||||
|
from ansible.module_utils._text import to_text
|
||||||
|
from ansible.plugins.action.sros import ActionModule as _ActionModule
|
||||||
from ansible.utils.vars import merge_hash
|
from ansible.utils.vars import merge_hash
|
||||||
|
|
||||||
PRIVATE_KEYS_RE = re.compile('__.+__')
|
PRIVATE_KEYS_RE = re.compile('__.+__')
|
||||||
|
@ -110,4 +110,3 @@ class ActionModule(_ActionModule):
|
||||||
searchpath.append(os.path.dirname(source))
|
searchpath.append(os.path.dirname(source))
|
||||||
self._templar.environment.loader.searchpath = searchpath
|
self._templar.environment.loader.searchpath = searchpath
|
||||||
self._task.args['src'] = self._templar.template(template_data)
|
self._task.args['src'] = self._templar.template(template_data)
|
||||||
|
|
||||||
|
|
|
@ -308,8 +308,7 @@ class ActionModule(ActionBase):
|
||||||
src = _tmp_args.get('src', None)
|
src = _tmp_args.get('src', None)
|
||||||
dest = _tmp_args.get('dest', None)
|
dest = _tmp_args.get('dest', None)
|
||||||
if src is None or dest is None:
|
if src is None or dest is None:
|
||||||
return dict(failed=True,
|
return dict(failed=True, msg="synchronize requires both src and dest parameters are set")
|
||||||
msg="synchronize requires both src and dest parameters are set")
|
|
||||||
|
|
||||||
if not dest_is_local:
|
if not dest_is_local:
|
||||||
# Private key handling
|
# Private key handling
|
||||||
|
|
|
@ -23,11 +23,12 @@ from ansible import constants as C
|
||||||
from ansible.errors import AnsibleError
|
from ansible.errors import AnsibleError
|
||||||
from ansible.module_utils._text import to_bytes, to_native, to_text
|
from ansible.module_utils._text import to_bytes, to_native, to_text
|
||||||
from ansible.plugins.action import ActionBase
|
from ansible.plugins.action import ActionBase
|
||||||
from ansible.utils.hashing import checksum_s
|
|
||||||
from ansible.template import generate_ansible_template_vars
|
from ansible.template import generate_ansible_template_vars
|
||||||
|
from ansible.utils.hashing import checksum_s
|
||||||
|
|
||||||
boolean = C.mk_boolean
|
boolean = C.mk_boolean
|
||||||
|
|
||||||
|
|
||||||
class ActionModule(ActionBase):
|
class ActionModule(ActionBase):
|
||||||
|
|
||||||
TRANSFERS_FILES = True
|
TRANSFERS_FILES = True
|
||||||
|
|
2
lib/ansible/plugins/cache/__init__.py
vendored
2
lib/ansible/plugins/cache/__init__.py
vendored
|
@ -236,6 +236,7 @@ class BaseFileCacheModule(BaseCacheModule):
|
||||||
"""
|
"""
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
|
||||||
class FactCache(MutableMapping):
|
class FactCache(MutableMapping):
|
||||||
|
|
||||||
def __init__(self, *args, **kwargs):
|
def __init__(self, *args, **kwargs):
|
||||||
|
@ -247,7 +248,6 @@ class FactCache(MutableMapping):
|
||||||
# Backwards compat: self._display isn't really needed, just import the global display and use that.
|
# Backwards compat: self._display isn't really needed, just import the global display and use that.
|
||||||
self._display = display
|
self._display = display
|
||||||
|
|
||||||
|
|
||||||
def __getitem__(self, key):
|
def __getitem__(self, key):
|
||||||
if not self._plugin.contains(key):
|
if not self._plugin.contains(key):
|
||||||
raise KeyError
|
raise KeyError
|
||||||
|
|
1
lib/ansible/plugins/cache/base.py
vendored
1
lib/ansible/plugins/cache/base.py
vendored
|
@ -19,4 +19,3 @@ __metaclass__ = type
|
||||||
|
|
||||||
# moved actual classes to __init__ kept here for backward compat with 3rd parties
|
# moved actual classes to __init__ kept here for backward compat with 3rd parties
|
||||||
from ansible.plugins.cache import BaseCacheModule, BaseFileCacheModule
|
from ansible.plugins.cache import BaseCacheModule, BaseFileCacheModule
|
||||||
|
|
||||||
|
|
1
lib/ansible/plugins/cache/jsonfile.py
vendored
1
lib/ansible/plugins/cache/jsonfile.py
vendored
|
@ -37,6 +37,7 @@ except ImportError:
|
||||||
from ansible.parsing.utils.jsonify import jsonify
|
from ansible.parsing.utils.jsonify import jsonify
|
||||||
from ansible.plugins.cache import BaseFileCacheModule
|
from ansible.plugins.cache import BaseFileCacheModule
|
||||||
|
|
||||||
|
|
||||||
class CacheModule(BaseFileCacheModule):
|
class CacheModule(BaseFileCacheModule):
|
||||||
"""
|
"""
|
||||||
A caching module backed by json files.
|
A caching module backed by json files.
|
||||||
|
|
1
lib/ansible/plugins/cache/memory.py
vendored
1
lib/ansible/plugins/cache/memory.py
vendored
|
@ -30,6 +30,7 @@ __metaclass__ = type
|
||||||
|
|
||||||
from ansible.plugins.cache import BaseCacheModule
|
from ansible.plugins.cache import BaseCacheModule
|
||||||
|
|
||||||
|
|
||||||
class CacheModule(BaseCacheModule):
|
class CacheModule(BaseCacheModule):
|
||||||
|
|
||||||
def __init__(self, *args, **kwargs):
|
def __init__(self, *args, **kwargs):
|
||||||
|
|
1
lib/ansible/plugins/cache/pickle.py
vendored
1
lib/ansible/plugins/cache/pickle.py
vendored
|
@ -36,6 +36,7 @@ except ImportError:
|
||||||
from ansible.module_utils.six import PY3
|
from ansible.module_utils.six import PY3
|
||||||
from ansible.plugins.cache import BaseFileCacheModule
|
from ansible.plugins.cache import BaseFileCacheModule
|
||||||
|
|
||||||
|
|
||||||
class CacheModule(BaseFileCacheModule):
|
class CacheModule(BaseFileCacheModule):
|
||||||
"""
|
"""
|
||||||
A caching module backed by pickle files.
|
A caching module backed by pickle files.
|
||||||
|
|
1
lib/ansible/plugins/cache/redis.py
vendored
1
lib/ansible/plugins/cache/redis.py
vendored
|
@ -30,6 +30,7 @@ try:
|
||||||
except ImportError:
|
except ImportError:
|
||||||
raise AnsibleError("The 'redis' python module is required for the redis fact cache, 'pip install redis'")
|
raise AnsibleError("The 'redis' python module is required for the redis fact cache, 'pip install redis'")
|
||||||
|
|
||||||
|
|
||||||
class CacheModule(BaseCacheModule):
|
class CacheModule(BaseCacheModule):
|
||||||
"""
|
"""
|
||||||
A caching module backed by redis.
|
A caching module backed by redis.
|
||||||
|
|
1
lib/ansible/plugins/cache/yaml.py
vendored
1
lib/ansible/plugins/cache/yaml.py
vendored
|
@ -37,6 +37,7 @@ from ansible.parsing.yaml.loader import AnsibleLoader
|
||||||
from ansible.parsing.yaml.dumper import AnsibleDumper
|
from ansible.parsing.yaml.dumper import AnsibleDumper
|
||||||
from ansible.plugins.cache import BaseFileCacheModule
|
from ansible.plugins.cache import BaseFileCacheModule
|
||||||
|
|
||||||
|
|
||||||
class CacheModule(BaseFileCacheModule):
|
class CacheModule(BaseFileCacheModule):
|
||||||
"""
|
"""
|
||||||
A caching module backed by yaml files.
|
A caching module backed by yaml files.
|
||||||
|
|
|
@ -213,7 +213,6 @@ class CallbackBase:
|
||||||
if remove_key in result:
|
if remove_key in result:
|
||||||
del result[remove_key]
|
del result[remove_key]
|
||||||
|
|
||||||
|
|
||||||
def set_play_context(self, play_context):
|
def set_play_context(self, play_context):
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
@ -280,7 +279,7 @@ class CallbackBase:
|
||||||
def on_file_diff(self, host, diff):
|
def on_file_diff(self, host, diff):
|
||||||
pass
|
pass
|
||||||
|
|
||||||
####### V2 METHODS, by default they call v1 counterparts if possible ######
|
# V2 METHODS, by default they call v1 counterparts if possible
|
||||||
def v2_on_any(self, *args, **kwargs):
|
def v2_on_any(self, *args, **kwargs):
|
||||||
self.on_any(args, kwargs)
|
self.on_any(args, kwargs)
|
||||||
|
|
||||||
|
|
|
@ -21,6 +21,7 @@ __metaclass__ = type
|
||||||
|
|
||||||
from ansible.plugins.callback.default import CallbackModule as CallbackModule_default
|
from ansible.plugins.callback.default import CallbackModule as CallbackModule_default
|
||||||
|
|
||||||
|
|
||||||
class CallbackModule(CallbackModule_default):
|
class CallbackModule(CallbackModule_default):
|
||||||
|
|
||||||
CALLBACK_VERSION = 2.0
|
CALLBACK_VERSION = 2.0
|
||||||
|
@ -76,4 +77,3 @@ class CallbackModule(CallbackModule_default):
|
||||||
def v2_runner_item_on_failed(self, result):
|
def v2_runner_item_on_failed(self, result):
|
||||||
self.display_task_banner()
|
self.display_task_banner()
|
||||||
self.super_ref.v2_runner_item_on_failed(result)
|
self.super_ref.v2_runner_item_on_failed(result)
|
||||||
|
|
||||||
|
|
|
@ -21,6 +21,7 @@ __metaclass__ = type
|
||||||
|
|
||||||
from ansible.plugins.callback import CallbackBase
|
from ansible.plugins.callback import CallbackBase
|
||||||
|
|
||||||
|
|
||||||
class CallbackModule(CallbackBase):
|
class CallbackModule(CallbackBase):
|
||||||
"""
|
"""
|
||||||
This is a very trivial example of how any callback function can get at play and task objects.
|
This is a very trivial example of how any callback function can get at play and task objects.
|
||||||
|
|
|
@ -30,6 +30,7 @@ from ansible import constants as C
|
||||||
from ansible.plugins.callback import CallbackBase
|
from ansible.plugins.callback import CallbackBase
|
||||||
from ansible.utils.color import colorize, hostcolor
|
from ansible.utils.color import colorize, hostcolor
|
||||||
|
|
||||||
|
|
||||||
class CallbackModule(CallbackBase):
|
class CallbackModule(CallbackBase):
|
||||||
|
|
||||||
'''
|
'''
|
||||||
|
@ -100,7 +101,7 @@ class CallbackModule(CallbackBase):
|
||||||
self._process_items(result)
|
self._process_items(result)
|
||||||
else:
|
else:
|
||||||
|
|
||||||
if (self._display.verbosity > 0 or '_ansible_verbose_always' in result._result) and not '_ansible_verbose_override' in result._result:
|
if (self._display.verbosity > 0 or '_ansible_verbose_always' in result._result) and '_ansible_verbose_override' not in result._result:
|
||||||
msg += " => %s" % (self._dump_results(result._result),)
|
msg += " => %s" % (self._dump_results(result._result),)
|
||||||
self._display.display(msg, color=color)
|
self._display.display(msg, color=color)
|
||||||
|
|
||||||
|
@ -113,7 +114,7 @@ class CallbackModule(CallbackBase):
|
||||||
self._process_items(result)
|
self._process_items(result)
|
||||||
else:
|
else:
|
||||||
msg = "skipping: [%s]" % result._host.get_name()
|
msg = "skipping: [%s]" % result._host.get_name()
|
||||||
if (self._display.verbosity > 0 or '_ansible_verbose_always' in result._result) and not '_ansible_verbose_override' in result._result:
|
if (self._display.verbosity > 0 or '_ansible_verbose_always' in result._result) and '_ansible_verbose_override' not in result._result:
|
||||||
msg += " => %s" % self._dump_results(result._result)
|
msg += " => %s" % self._dump_results(result._result)
|
||||||
self._display.display(msg, color=C.COLOR_SKIP)
|
self._display.display(msg, color=C.COLOR_SKIP)
|
||||||
|
|
||||||
|
@ -209,7 +210,7 @@ class CallbackModule(CallbackBase):
|
||||||
|
|
||||||
msg += " => (item=%s)" % (self._get_item(result._result),)
|
msg += " => (item=%s)" % (self._get_item(result._result),)
|
||||||
|
|
||||||
if (self._display.verbosity > 0 or '_ansible_verbose_always' in result._result) and not '_ansible_verbose_override' in result._result:
|
if (self._display.verbosity > 0 or '_ansible_verbose_always' in result._result) and '_ansible_verbose_override' not in result._result:
|
||||||
msg += " => %s" % self._dump_results(result._result)
|
msg += " => %s" % self._dump_results(result._result)
|
||||||
self._display.display(msg, color=color)
|
self._display.display(msg, color=color)
|
||||||
|
|
||||||
|
@ -230,7 +231,7 @@ class CallbackModule(CallbackBase):
|
||||||
def v2_runner_item_on_skipped(self, result):
|
def v2_runner_item_on_skipped(self, result):
|
||||||
if C.DISPLAY_SKIPPED_HOSTS:
|
if C.DISPLAY_SKIPPED_HOSTS:
|
||||||
msg = "skipping: [%s] => (item=%s) " % (result._host.get_name(), self._get_item(result._result))
|
msg = "skipping: [%s] => (item=%s) " % (result._host.get_name(), self._get_item(result._result))
|
||||||
if (self._display.verbosity > 0 or '_ansible_verbose_always' in result._result) and not '_ansible_verbose_override' in result._result:
|
if (self._display.verbosity > 0 or '_ansible_verbose_always' in result._result) and '_ansible_verbose_override' not in result._result:
|
||||||
msg += " => %s" % self._dump_results(result._result)
|
msg += " => %s" % self._dump_results(result._result)
|
||||||
self._display.display(msg, color=C.COLOR_SKIP)
|
self._display.display(msg, color=C.COLOR_SKIP)
|
||||||
|
|
||||||
|
@ -298,6 +299,6 @@ class CallbackModule(CallbackBase):
|
||||||
def v2_runner_retry(self, result):
|
def v2_runner_retry(self, result):
|
||||||
task_name = result.task_name or result._task
|
task_name = result.task_name or result._task
|
||||||
msg = "FAILED - RETRYING: %s (%d retries left)." % (task_name, result._result['retries'] - result._result['attempts'])
|
msg = "FAILED - RETRYING: %s (%d retries left)." % (task_name, result._result['retries'] - result._result['attempts'])
|
||||||
if (self._display.verbosity > 2 or '_ansible_verbose_always' in result._result) and not '_ansible_verbose_override' in result._result:
|
if (self._display.verbosity > 2 or '_ansible_verbose_always' in result._result) and '_ansible_verbose_override' not in result._result:
|
||||||
msg += "Result was: %s" % self._dump_results(result._result)
|
msg += "Result was: %s" % self._dump_results(result._result)
|
||||||
self._display.display(msg, color=C.COLOR_DEBUG)
|
self._display.display(msg, color=C.COLOR_DEBUG)
|
||||||
|
|
|
@ -146,6 +146,7 @@ colors = dict(
|
||||||
|
|
||||||
states = ('skipped', 'ok', 'changed', 'failed', 'unreachable')
|
states = ('skipped', 'ok', 'changed', 'failed', 'unreachable')
|
||||||
|
|
||||||
|
|
||||||
class CallbackModule_dense(CallbackModule_default):
|
class CallbackModule_dense(CallbackModule_default):
|
||||||
|
|
||||||
'''
|
'''
|
||||||
|
@ -156,7 +157,6 @@ class CallbackModule_dense(CallbackModule_default):
|
||||||
CALLBACK_TYPE = 'stdout'
|
CALLBACK_TYPE = 'stdout'
|
||||||
CALLBACK_NAME = 'dense'
|
CALLBACK_NAME = 'dense'
|
||||||
|
|
||||||
|
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
|
|
||||||
# From CallbackModule
|
# From CallbackModule
|
||||||
|
|
|
@ -123,11 +123,17 @@ class CallbackModule(CallbackBase):
|
||||||
level = 'err'
|
level = 'err'
|
||||||
else:
|
else:
|
||||||
level = 'notice' if 'changed' in msg and msg['changed'] else 'info'
|
level = 'notice' if 'changed' in msg and msg['changed'] else 'info'
|
||||||
logs.append({"log": {
|
logs.append({
|
||||||
'sources': {'source': source},
|
"log": {
|
||||||
'messages': {'message': json.dumps(msg)},
|
'sources': {
|
||||||
|
'source': source
|
||||||
|
},
|
||||||
|
'messages': {
|
||||||
|
'message': json.dumps(msg)
|
||||||
|
},
|
||||||
'level': level
|
'level': level
|
||||||
}})
|
}
|
||||||
|
})
|
||||||
return logs
|
return logs
|
||||||
|
|
||||||
def send_reports(self, stats):
|
def send_reports(self, stats):
|
||||||
|
|
|
@ -94,4 +94,3 @@ class CallbackModule(CallbackBase):
|
||||||
else:
|
else:
|
||||||
out = self.debug
|
out = self.debug
|
||||||
self.send_msg("Great! \n Playbook %s completed:\n%s \n Last task debug:\n %s" % (name, s, out))
|
self.send_msg("Great! \n Playbook %s completed:\n%s \n Last task debug:\n %s" % (name, s, out))
|
||||||
|
|
||||||
|
|
|
@ -33,6 +33,7 @@ except ImportError:
|
||||||
|
|
||||||
from ansible.plugins.callback import CallbackBase
|
from ansible.plugins.callback import CallbackBase
|
||||||
|
|
||||||
|
|
||||||
class CallbackModule(CallbackBase):
|
class CallbackModule(CallbackBase):
|
||||||
"""
|
"""
|
||||||
ansible logstash callback plugin
|
ansible logstash callback plugin
|
||||||
|
|
Some files were not shown because too many files have changed in this diff Show more
Loading…
Add table
Add a link
Reference in a new issue