mirror of
https://github.com/ansible-collections/community.general.git
synced 2025-05-31 05:19: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)
|
||||
__metaclass__ = type
|
||||
|
||||
import getpass
|
||||
import operator
|
||||
import optparse
|
||||
import os
|
||||
import subprocess
|
||||
import re
|
||||
import sys
|
||||
import time
|
||||
import yaml
|
||||
import re
|
||||
import getpass
|
||||
import subprocess
|
||||
|
||||
from abc import ABCMeta, abstractmethod
|
||||
|
||||
import ansible
|
||||
from ansible.release import __version__
|
||||
from ansible import constants as C
|
||||
from ansible.errors import AnsibleError, AnsibleOptionsError
|
||||
from ansible.inventory.manager import InventoryManager
|
||||
from ansible.module_utils.six import with_metaclass, string_types
|
||||
from ansible.module_utils._text import to_bytes, to_text
|
||||
from ansible.parsing.dataloader import DataLoader
|
||||
from ansible.release import __version__
|
||||
from ansible.utils.path import unfrackpath
|
||||
from ansible.utils.vars import load_extra_vars, load_options_vars
|
||||
from ansible.vars.manager import VariableManager
|
||||
|
@ -93,6 +94,7 @@ class InvalidOptsParser(SortedOptParser):
|
|||
except optparse.BadOptionError:
|
||||
pass
|
||||
|
||||
|
||||
class CLI(with_metaclass(ABCMeta, object)):
|
||||
''' code behind bin/ansible* programs '''
|
||||
|
||||
|
@ -298,7 +300,8 @@ class CLI(with_metaclass(ABCMeta, object)):
|
|||
|
||||
if inventory_opts:
|
||||
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',
|
||||
help='outputs a list of matching hosts; does not execute anything else')
|
||||
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',
|
||||
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,
|
||||
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',
|
||||
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
|
||||
else:
|
||||
offset = time.altzone
|
||||
result = "({0} {1}) last updated {2} (GMT {3:+04d})".format(branch, commit,
|
||||
time.strftime("%Y/%m/%d %H:%M:%S", date), int(offset / -36))
|
||||
result = "({0} {1}) last updated {2} (GMT {3:+04d})".format(branch, commit, time.strftime("%Y/%m/%d %H:%M:%S", date), int(offset / -36))
|
||||
else:
|
||||
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))
|
||||
|
||||
return loader, inventory, variable_manager
|
||||
|
||||
|
|
|
@ -59,7 +59,7 @@ class ConsoleCLI(CLI, cmd.Cmd):
|
|||
|
||||
modules = []
|
||||
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):
|
||||
|
||||
|
|
|
@ -21,8 +21,8 @@ __metaclass__ = type
|
|||
|
||||
import datetime
|
||||
import os
|
||||
import traceback
|
||||
import textwrap
|
||||
import traceback
|
||||
import yaml
|
||||
|
||||
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',
|
||||
help='Show documentation for all plugins')
|
||||
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()
|
||||
|
||||
|
|
|
@ -23,11 +23,11 @@ from __future__ import (absolute_import, division, print_function)
|
|||
__metaclass__ = type
|
||||
|
||||
import os.path
|
||||
import sys
|
||||
import yaml
|
||||
import time
|
||||
import re
|
||||
import shutil
|
||||
import sys
|
||||
import time
|
||||
import yaml
|
||||
|
||||
from jinja2 import Environment, FileSystemLoader
|
||||
|
||||
|
@ -36,11 +36,11 @@ from ansible.cli import CLI
|
|||
from ansible.errors import AnsibleError, AnsibleOptionsError
|
||||
from ansible.galaxy import Galaxy
|
||||
from ansible.galaxy.api import GalaxyAPI
|
||||
from ansible.galaxy.role import GalaxyRole
|
||||
from ansible.galaxy.login import GalaxyLogin
|
||||
from ansible.galaxy.role import GalaxyRole
|
||||
from ansible.galaxy.token import GalaxyToken
|
||||
from ansible.playbook.role.requirement import RoleRequirement
|
||||
from ansible.module_utils._text import to_text
|
||||
from ansible.playbook.role.requirement import RoleRequirement
|
||||
|
||||
try:
|
||||
from __main__ import display
|
||||
|
@ -64,7 +64,6 @@ class GalaxyCLI(CLI):
|
|||
|
||||
super(GalaxyCLI, self).set_action()
|
||||
|
||||
|
||||
# specific to actions
|
||||
if self.action == "delete":
|
||||
self.parser.set_usage("usage: %prog delete [options] github_user github_repo")
|
||||
|
@ -297,7 +296,7 @@ class GalaxyCLI(CLI):
|
|||
role_info.update(role_spec)
|
||||
|
||||
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
|
||||
if not data:
|
||||
data = u"\n- the role %s was not found" % role
|
||||
|
@ -692,4 +691,3 @@ class GalaxyCLI(CLI):
|
|||
if os.pathsep in data:
|
||||
data = data.split(os.pathsep)[0]
|
||||
return data
|
||||
|
||||
|
|
|
@ -36,13 +36,10 @@ except ImportError:
|
|||
display = Display()
|
||||
|
||||
|
||||
#---------------------------------------------------------------------------------------------------
|
||||
|
||||
class PlaybookCLI(CLI):
|
||||
''' 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. '''
|
||||
|
||||
|
||||
def parse(self):
|
||||
|
||||
# create parser for CLI options
|
||||
|
@ -122,7 +119,6 @@ class PlaybookCLI(CLI):
|
|||
# Invalid limit
|
||||
raise AnsibleError("Specified --limit does not match any hosts")
|
||||
|
||||
|
||||
# flush fact cache if requested
|
||||
if self.options.flush_cache:
|
||||
self._flush_cache(inventory, variable_manager)
|
||||
|
|
|
@ -28,8 +28,8 @@ import socket
|
|||
import sys
|
||||
import time
|
||||
|
||||
from ansible.errors import AnsibleOptionsError
|
||||
from ansible.cli import CLI
|
||||
from ansible.errors import AnsibleOptionsError
|
||||
from ansible.module_utils._text import to_native
|
||||
from ansible.plugins import module_loader
|
||||
from ansible.utils.cmd_functions import run_cmd
|
||||
|
@ -59,7 +59,7 @@ class PullCLI(CLI):
|
|||
DEFAULT_PLAYBOOK = 'local.yml'
|
||||
PLAYBOOK_ERRORS = {
|
||||
1: 'File does not exist',
|
||||
2: 'File is not readable'
|
||||
2: 'File is not readable',
|
||||
}
|
||||
SUPPORTED_REPO_MODULES = ['git']
|
||||
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',
|
||||
help='only run the playbook if the repository has been updated')
|
||||
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',
|
||||
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')
|
||||
|
|
|
@ -22,11 +22,11 @@ __metaclass__ = type
|
|||
import os
|
||||
import sys
|
||||
|
||||
from ansible.cli import CLI
|
||||
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.vault import VaultEditor
|
||||
from ansible.cli import CLI
|
||||
from ansible.module_utils._text import to_text, to_bytes
|
||||
|
||||
try:
|
||||
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',
|
||||
'eyes', 'hellokitty', 'kitty', 'luke-koala', 'meow', 'milk', 'moofasa', 'moose', 'ren', 'sheep',
|
||||
'small', 'stegosaurus', 'stimpy', 'supermilker', 'three-eyes', 'turkey', 'turtle', 'tux', 'udder',
|
||||
'vader-koala', 'vader', 'www', ]
|
||||
'vader-koala', 'vader', 'www']
|
||||
|
||||
# sections in config file
|
||||
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
|
||||
|
||||
#### 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 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!
|
||||
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_VERBOSITY = get_config(p, DEFAULTS, 'verbosity', 'ANSIBLE_VERBOSITY', 0, value_type='integer')
|
||||
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
|
||||
|
||||
import os
|
||||
import sys
|
||||
import re
|
||||
import sys
|
||||
|
||||
from ansible import constants as C
|
||||
from ansible.errors import AnsibleError
|
||||
|
@ -39,6 +39,7 @@ except ImportError:
|
|||
from ansible.utils.display import Display
|
||||
display = Display()
|
||||
|
||||
|
||||
class InventoryData(object):
|
||||
"""
|
||||
Holds inventory data (host and group objects).
|
||||
|
@ -103,7 +104,6 @@ class InventoryData(object):
|
|||
|
||||
return new_host
|
||||
|
||||
|
||||
def _scan_groups_for_host(self, hostname, localhost=False):
|
||||
''' in case something did not update inventory correctly, fallback to group scan '''
|
||||
|
||||
|
@ -121,7 +121,6 @@ class InventoryData(object):
|
|||
|
||||
return found
|
||||
|
||||
|
||||
def reconcile_inventory(self):
|
||||
''' Ensure inventory basic rules, run after updates '''
|
||||
|
||||
|
@ -190,7 +189,6 @@ class InventoryData(object):
|
|||
|
||||
return matching_host
|
||||
|
||||
|
||||
def add_group(self, group):
|
||||
''' adds a group to inventory if not there already '''
|
||||
|
||||
|
@ -238,7 +236,6 @@ class InventoryData(object):
|
|||
self._groups_dict_cache = {}
|
||||
display.debug("Added host %s to group %s" % (host, group))
|
||||
|
||||
|
||||
def set_variable(self, entity, varname, value):
|
||||
''' sets a varible for an inventory object '''
|
||||
|
||||
|
@ -252,7 +249,6 @@ class InventoryData(object):
|
|||
inv_object.set_variable(varname, value)
|
||||
display.debug('set %s for %s' % (varname, entity))
|
||||
|
||||
|
||||
def add_child(self, group, child):
|
||||
''' 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()]
|
||||
|
||||
return self._groups_dict_cache
|
||||
|
||||
|
|
|
@ -20,6 +20,7 @@ __metaclass__ = type
|
|||
from ansible.errors import AnsibleError
|
||||
from ansible.utils.vars import combine_vars
|
||||
|
||||
|
||||
class Group:
|
||||
''' a group of ansible hosts '''
|
||||
|
||||
|
@ -182,4 +183,3 @@ class Group:
|
|||
except TypeError:
|
||||
# FIXME: warn about invalid priority
|
||||
pass
|
||||
|
||||
|
|
|
@ -24,6 +24,7 @@ from ansible.utils.vars import combine_vars, get_unique_id
|
|||
|
||||
__all__ = ['Host']
|
||||
|
||||
|
||||
class Host:
|
||||
''' a single ansible host '''
|
||||
|
||||
|
@ -100,7 +101,6 @@ class Host:
|
|||
def get_name(self):
|
||||
return self.name
|
||||
|
||||
|
||||
def populate_ancestors(self):
|
||||
# populate ancestors
|
||||
for group in self.groups:
|
||||
|
@ -131,7 +131,6 @@ class Host:
|
|||
else:
|
||||
self.remove_group(oldg)
|
||||
|
||||
|
||||
def set_variable(self, key, value):
|
||||
self.vars[key] = value
|
||||
|
||||
|
@ -148,4 +147,3 @@ class Host:
|
|||
|
||||
def get_vars(self):
|
||||
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))
|
||||
|
||||
|
||||
def order_patterns(patterns):
|
||||
''' 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]
|
||||
|
||||
|
||||
class InventoryManager(object):
|
||||
''' Creates and manages inventory '''
|
||||
|
||||
|
@ -365,7 +367,6 @@ class InventoryManager(object):
|
|||
|
||||
return hosts
|
||||
|
||||
|
||||
def _evaluate_patterns(self, patterns):
|
||||
"""
|
||||
Takes a list of patterns and returns a list of matching host names,
|
||||
|
|
|
@ -44,6 +44,7 @@ AXAPI_VPORT_PROTOCOLS = {
|
|||
'https': 12,
|
||||
}
|
||||
|
||||
|
||||
def a10_argument_spec():
|
||||
return dict(
|
||||
host=dict(type='str', required=True),
|
||||
|
@ -52,11 +53,13 @@ def a10_argument_spec():
|
|||
write_config=dict(type='bool', default=False)
|
||||
)
|
||||
|
||||
|
||||
def axapi_failure(result):
|
||||
if 'response' in result and result['response'].get('status') == 'fail':
|
||||
return True
|
||||
return False
|
||||
|
||||
|
||||
def axapi_call(module, url, post=None):
|
||||
'''
|
||||
Returns a datastructure based on the result of the API call
|
||||
|
@ -81,6 +84,7 @@ def axapi_call(module, url, post=None):
|
|||
rsp.close()
|
||||
return data
|
||||
|
||||
|
||||
def axapi_authenticate(module, base_url, username, password):
|
||||
url = '%s&method=authenticate&username=%s&password=%s' % (base_url, username, password)
|
||||
result = axapi_call(module, url)
|
||||
|
@ -89,6 +93,7 @@ def axapi_authenticate(module, base_url, username, password):
|
|||
sessid = result['session_id']
|
||||
return base_url + '&session_id=' + sessid
|
||||
|
||||
|
||||
def axapi_authenticate_v3(module, base_url, username, password):
|
||||
url = base_url
|
||||
auth_payload = {"credentials": {"username": username, "password": password}}
|
||||
|
@ -98,6 +103,7 @@ def axapi_authenticate_v3(module, base_url, username, password):
|
|||
signature = result['authresponse']['signature']
|
||||
return signature
|
||||
|
||||
|
||||
def axapi_call_v3(module, url, method=None, body=None, signature=None):
|
||||
'''
|
||||
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()
|
||||
return data
|
||||
|
||||
|
||||
def axapi_enabled_disabled(flag):
|
||||
'''
|
||||
The axapi uses 0/1 integer values for flags, rather than strings
|
||||
|
@ -137,8 +144,10 @@ def axapi_enabled_disabled(flag):
|
|||
else:
|
||||
return 0
|
||||
|
||||
|
||||
def axapi_get_port_protocol(protocol):
|
||||
return AXAPI_PORT_PROTOCOLS.get(protocol.lower(), None)
|
||||
|
||||
|
||||
def axapi_get_vport_protocol(protocol):
|
||||
return AXAPI_VPORT_PROTOCOLS.get(protocol.lower(), None)
|
||||
|
|
|
@ -37,8 +37,8 @@ from ansible.module_utils.aos import *
|
|||
"""
|
||||
import json
|
||||
|
||||
from distutils.version import LooseVersion
|
||||
from ansible.module_utils.pycompat24 import get_exception
|
||||
from distutils.version import LooseVersion
|
||||
|
||||
try:
|
||||
import yaml
|
||||
|
@ -53,6 +53,7 @@ try:
|
|||
except ImportError:
|
||||
HAS_AOS_PYEZ = False
|
||||
|
||||
|
||||
def check_aos_version(module, min=False):
|
||||
"""
|
||||
Check if the library aos-pyez is present.
|
||||
|
@ -71,6 +72,7 @@ def check_aos_version(module, min=False):
|
|||
|
||||
return True
|
||||
|
||||
|
||||
def get_aos_session(module, auth):
|
||||
"""
|
||||
Resume an existing session and return an AOS object.
|
||||
|
@ -94,6 +96,7 @@ def get_aos_session(module, auth):
|
|||
|
||||
return aos
|
||||
|
||||
|
||||
def find_collection_item(collection, item_name=False, item_id=False):
|
||||
"""
|
||||
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:
|
||||
return my_dict
|
||||
|
||||
|
||||
def content_to_dict(module, content):
|
||||
"""
|
||||
Convert 'content' into a Python Dict based on 'content_format'
|
||||
|
@ -144,12 +148,12 @@ def content_to_dict(module, content):
|
|||
except:
|
||||
module.fail_json(msg="Unable to convert 'content' to a dict, please check if valid")
|
||||
|
||||
|
||||
# replace the string with the dict
|
||||
module.params['content'] = content_dict
|
||||
|
||||
return content_dict
|
||||
|
||||
|
||||
def do_load_resource(module, collection, name):
|
||||
"""
|
||||
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'")
|
||||
|
||||
if item.exists:
|
||||
module.exit_json( changed=False,
|
||||
name=item.name,
|
||||
id=item.id,
|
||||
value=item.value )
|
||||
module.exit_json(changed=False, name=item.name, id=item.id, value=item.value)
|
||||
|
||||
# If not in check mode, apply the changes
|
||||
if not module.check_mode:
|
||||
|
@ -175,7 +176,4 @@ def do_load_resource(module, collection, name):
|
|||
e = get_exception()
|
||||
module.fail_json(msg="Unable to write item content : %r" % e)
|
||||
|
||||
module.exit_json( changed=True,
|
||||
name=item.name,
|
||||
id=item.id,
|
||||
value=item.value )
|
||||
module.exit_json(changed=True, name=item.name, id=item.id, value=item.value)
|
||||
|
|
|
@ -40,6 +40,7 @@ The 'api' module provides the following common argument specs:
|
|||
"""
|
||||
import time
|
||||
|
||||
|
||||
def rate_limit_argument_spec(spec=None):
|
||||
"""Creates an argument spec for working with rate limiting"""
|
||||
arg_spec = (dict(
|
||||
|
@ -50,6 +51,7 @@ def rate_limit_argument_spec(spec=None):
|
|||
arg_spec.update(spec)
|
||||
return arg_spec
|
||||
|
||||
|
||||
def retry_argument_spec(spec=None):
|
||||
"""Creates an argument spec for working with retrying"""
|
||||
arg_spec = (dict(
|
||||
|
@ -60,24 +62,28 @@ def retry_argument_spec(spec=None):
|
|||
arg_spec.update(spec)
|
||||
return arg_spec
|
||||
|
||||
|
||||
def basic_auth_argument_spec(spec=None):
|
||||
arg_spec = (dict(
|
||||
api_username=dict(type='str', required=False),
|
||||
api_password=dict(type='str', required=False, no_log=True),
|
||||
api_url=dict(type='str', required=False),
|
||||
api_username=dict(type='str'),
|
||||
api_password=dict(type='str', no_log=True),
|
||||
api_url=dict(type='str'),
|
||||
validate_certs=dict(type='bool', default=True)
|
||||
))
|
||||
if spec:
|
||||
arg_spec.update(spec)
|
||||
return arg_spec
|
||||
|
||||
|
||||
def rate_limit(rate=None, rate_limit=None):
|
||||
"""rate limiting decorator"""
|
||||
minrate = None
|
||||
if rate is not None and rate_limit is not None:
|
||||
minrate = float(rate_limit) / float(rate)
|
||||
|
||||
def wrapper(f):
|
||||
last = [0.0]
|
||||
|
||||
def ratelimited(*args, **kwargs):
|
||||
if minrate is not None:
|
||||
elapsed = time.clock() - last[0]
|
||||
|
@ -87,13 +93,16 @@ def rate_limit(rate=None, rate_limit=None):
|
|||
last[0] = time.clock()
|
||||
ret = f(*args, **kwargs)
|
||||
return ret
|
||||
|
||||
return ratelimited
|
||||
return wrapper
|
||||
|
||||
|
||||
def retry(retries=None, retry_pause=1):
|
||||
"""Retry decorator"""
|
||||
def wrapper(f):
|
||||
retry_count = 0
|
||||
|
||||
def retried(*args, **kwargs):
|
||||
if retries is not None:
|
||||
ret = None
|
||||
|
@ -109,6 +118,6 @@ def retry(retries=None, retry_pause=1):
|
|||
break
|
||||
time.sleep(retry_pause)
|
||||
return ret
|
||||
|
||||
return retried
|
||||
return wrapper
|
||||
|
||||
|
|
|
@ -25,7 +25,6 @@
|
|||
# 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
|
||||
# USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
#
|
||||
|
||||
# This module initially matched the namespace of network module avi. However,
|
||||
# that causes namespace import error when other modules from avi namespaces
|
||||
|
@ -40,8 +39,7 @@ HAS_AVI = True
|
|||
try:
|
||||
import avi.sdk
|
||||
sdk_version = getattr(avi.sdk, '__version__', None)
|
||||
if ((sdk_version is None) or (sdk_version and
|
||||
(parse_version(sdk_version) < parse_version('17.1')))):
|
||||
if ((sdk_version is None) or (sdk_version and (parse_version(sdk_version) < parse_version('17.1')))):
|
||||
# It allows the __version__ to be '' as that value is used in development builds
|
||||
raise ImportError
|
||||
from avi.sdk.utils.ansible_utils import avi_ansible_api
|
||||
|
|
|
@ -1,4 +1,3 @@
|
|||
#
|
||||
# Copyright (c) 2016 Matt Davis, <mdavis@ansible.com>
|
||||
# Chris Houseknecht, <house@redhat.com>
|
||||
#
|
||||
|
@ -16,7 +15,6 @@
|
|||
#
|
||||
# You should have received a copy of the GNU General Public License
|
||||
# along with Ansible. If not, see <http://www.gnu.org/licenses/>.
|
||||
#
|
||||
|
||||
import json
|
||||
import os
|
||||
|
@ -102,6 +100,7 @@ except ImportError as exc:
|
|||
HAS_AZURE_EXC = exc
|
||||
HAS_AZURE = False
|
||||
|
||||
|
||||
def azure_id_to_dict(id):
|
||||
pieces = re.sub(r'^\/', '', id).split('/')
|
||||
result = {}
|
||||
|
@ -121,6 +120,7 @@ AZURE_EXPECTED_VERSIONS = dict(
|
|||
|
||||
AZURE_MIN_RELEASE = '2.0.0rc5'
|
||||
|
||||
|
||||
class AzureRMModuleBase(object):
|
||||
|
||||
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 = 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 = {
|
||||
'A': 'noatime',
|
||||
|
@ -161,8 +171,16 @@ except ImportError:
|
|||
pass
|
||||
|
||||
from ansible.module_utils.pycompat24 import get_exception, literal_eval
|
||||
from ansible.module_utils.six import (PY2, PY3, b, binary_type, integer_types,
|
||||
iteritems, text_type, string_types)
|
||||
from ansible.module_utils.six import (
|
||||
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._text import to_native, to_bytes, to_text
|
||||
|
||||
|
@ -242,6 +260,7 @@ def get_platform():
|
|||
''' what's the platform? example: Linux is a platform. '''
|
||||
return platform.system()
|
||||
|
||||
|
||||
def get_distribution():
|
||||
''' return the distribution name '''
|
||||
if platform.system() == 'Linux':
|
||||
|
@ -261,6 +280,7 @@ def get_distribution():
|
|||
distribution = None
|
||||
return distribution
|
||||
|
||||
|
||||
def get_distribution_version():
|
||||
''' return the distribution version '''
|
||||
if platform.system() == 'Linux':
|
||||
|
@ -275,6 +295,7 @@ def get_distribution_version():
|
|||
distribution_version = None
|
||||
return distribution_version
|
||||
|
||||
|
||||
def get_all_subclasses(cls):
|
||||
'''
|
||||
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:
|
||||
return d
|
||||
|
||||
|
||||
def json_dict_bytes_to_unicode(d, encoding='utf-8', errors='surrogate_or_strict'):
|
||||
''' 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:
|
||||
return d
|
||||
|
||||
|
||||
def return_values(obj):
|
||||
""" Return native stringified values from datastructures.
|
||||
|
||||
|
@ -381,6 +404,7 @@ def return_values(obj):
|
|||
else:
|
||||
raise TypeError('Unknown parameter type: %s, %s' % (type(obj), obj))
|
||||
|
||||
|
||||
def remove_values(value, no_log_strings):
|
||||
""" Remove strings in no_log_strings from value. If value is a container
|
||||
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)
|
||||
return output
|
||||
|
||||
|
||||
def bytes_to_human(size, isbits=False, unit=None):
|
||||
|
||||
base = 'Bytes'
|
||||
|
@ -507,6 +532,7 @@ def bytes_to_human(size, isbits=False, unit=None):
|
|||
|
||||
return '%.2f %s' % (float(size) / limit, suffix)
|
||||
|
||||
|
||||
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))
|
||||
|
||||
|
||||
def is_executable(path):
|
||||
'''is the given path executable?
|
||||
|
||||
|
@ -568,6 +595,7 @@ def is_executable(path):
|
|||
# execute bits are set.
|
||||
return ((stat.S_IXUSR | stat.S_IXGRP | stat.S_IXOTH) & os.stat(path)[stat.ST_MODE])
|
||||
|
||||
|
||||
def _load_params():
|
||||
''' read the modules parameters and store them globally.
|
||||
|
||||
|
@ -623,6 +651,7 @@ def _load_params():
|
|||
'"failed": true}')
|
||||
sys.exit(1)
|
||||
|
||||
|
||||
def env_fallback(*args, **kwargs):
|
||||
''' Load value from environment '''
|
||||
for arg in args:
|
||||
|
@ -631,6 +660,7 @@ def env_fallback(*args, **kwargs):
|
|||
else:
|
||||
raise AnsibleFallbackNotFound
|
||||
|
||||
|
||||
def _lenient_lowercase(lst):
|
||||
"""Lowercase elements of a list.
|
||||
|
||||
|
@ -644,6 +674,7 @@ def _lenient_lowercase(lst):
|
|||
lowered.append(value)
|
||||
return lowered
|
||||
|
||||
|
||||
def format_attributes(attributes):
|
||||
attribute_list = []
|
||||
for attr in attributes:
|
||||
|
@ -651,6 +682,7 @@ def format_attributes(attributes):
|
|||
attribute_list.append(FILE_ATTRIBUTES[attr])
|
||||
return attribute_list
|
||||
|
||||
|
||||
def get_flags_from_attributes(attributes):
|
||||
flags = []
|
||||
for key, attr in FILE_ATTRIBUTES.items():
|
||||
|
@ -658,6 +690,7 @@ def get_flags_from_attributes(attributes):
|
|||
flags.append(key)
|
||||
return ''.join(flags)
|
||||
|
||||
|
||||
class AnsibleFallbackNotFound(Exception):
|
||||
pass
|
||||
|
||||
|
@ -834,7 +867,6 @@ class AnsibleModule(object):
|
|||
selevel=selevel, secontext=secontext, attributes=attributes,
|
||||
)
|
||||
|
||||
|
||||
# Detect whether using selinux that is MLS-aware.
|
||||
# While this means you can set the level/range with
|
||||
# selinux.lsetfilecon(), it may or may not mean that you
|
||||
|
@ -1194,7 +1226,6 @@ class AnsibleModule(object):
|
|||
pass
|
||||
return output
|
||||
|
||||
|
||||
def _symbolic_mode_to_octal(self, path_stat, symbolic_mode):
|
||||
new_mode = stat.S_IMODE(path_stat.st_mode)
|
||||
|
||||
|
@ -1247,13 +1278,13 @@ class AnsibleModule(object):
|
|||
X_perms = {
|
||||
'u': {'X': stat.S_IXUSR},
|
||||
'g': {'X': stat.S_IXGRP},
|
||||
'o': {'X': stat.S_IXOTH}
|
||||
'o': {'X': stat.S_IXOTH},
|
||||
}
|
||||
else:
|
||||
X_perms = {
|
||||
'u': {'X': 0},
|
||||
'g': {'X': 0},
|
||||
'o': {'X': 0}
|
||||
'o': {'X': 0},
|
||||
}
|
||||
|
||||
user_perms_to_modes = {
|
||||
|
@ -1265,7 +1296,8 @@ class AnsibleModule(object):
|
|||
't': 0,
|
||||
'u': prev_mode & stat.S_IRWXU,
|
||||
'g': (prev_mode & stat.S_IRWXG) << 3,
|
||||
'o': (prev_mode & stat.S_IRWXO) << 6 },
|
||||
'o': (prev_mode & stat.S_IRWXO) << 6,
|
||||
},
|
||||
'g': {
|
||||
'r': stat.S_IRGRP,
|
||||
'w': stat.S_IWGRP,
|
||||
|
@ -1274,7 +1306,8 @@ class AnsibleModule(object):
|
|||
't': 0,
|
||||
'u': (prev_mode & stat.S_IRWXU) >> 3,
|
||||
'g': prev_mode & stat.S_IRWXG,
|
||||
'o': (prev_mode & stat.S_IRWXO) << 3 },
|
||||
'o': (prev_mode & stat.S_IRWXO) << 3,
|
||||
},
|
||||
'o': {
|
||||
'r': stat.S_IROTH,
|
||||
'w': stat.S_IWOTH,
|
||||
|
@ -1283,14 +1316,17 @@ class AnsibleModule(object):
|
|||
't': stat.S_ISVTX,
|
||||
'u': (prev_mode & stat.S_IRWXU) >> 6,
|
||||
'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
|
||||
for key, value in X_perms.items():
|
||||
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)
|
||||
|
||||
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):
|
||||
return value
|
||||
|
||||
|
||||
def _check_type_bytes(self, value):
|
||||
try:
|
||||
self.human_to_bytes(value)
|
||||
except ValueError:
|
||||
raise TypeError('%s cannot be converted to a Byte value' % type(value))
|
||||
|
||||
|
||||
def _check_type_bits(self, value):
|
||||
try:
|
||||
self.human_to_bytes(value, isbits=True)
|
||||
|
@ -1773,7 +1807,7 @@ class AnsibleModule(object):
|
|||
self.params[k] = default
|
||||
|
||||
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_strategy = fallback[0]
|
||||
fallback_args = []
|
||||
|
@ -1863,9 +1897,7 @@ class AnsibleModule(object):
|
|||
if self.boolean(no_log):
|
||||
log_args[param] = 'NOT_LOGGING_PARAMETER'
|
||||
# try to capture all passwords/passphrase named fields missed by no_log
|
||||
elif PASSWORD_MATCH.search(param) and \
|
||||
arg_opts.get('type', 'str') != 'bool' and \
|
||||
not arg_opts.get('choices', False):
|
||||
elif PASSWORD_MATCH.search(param) and arg_opts.get('type', 'str') != 'bool' and not arg_opts.get('choices', False):
|
||||
# skip boolean and enums as they are about 'password' state
|
||||
log_args[param] = 'NOT_LOGGING_PASSWORD'
|
||||
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)
|
||||
|
||||
|
||||
def _set_cwd(self):
|
||||
try:
|
||||
cwd = os.getcwd()
|
||||
|
@ -2011,7 +2042,7 @@ class AnsibleModule(object):
|
|||
def exit_json(self, **kwargs):
|
||||
''' return from the module, without error '''
|
||||
|
||||
if not 'changed' in kwargs:
|
||||
if 'changed' not in kwargs:
|
||||
kwargs['changed'] = False
|
||||
|
||||
self.do_cleanup_files()
|
||||
|
@ -2024,7 +2055,7 @@ class AnsibleModule(object):
|
|||
assert 'msg' in kwargs, "implementation error -- msg to explain the error is required"
|
||||
kwargs['failed'] = True
|
||||
|
||||
if not 'changed' in kwargs:
|
||||
if 'changed' not in kwargs:
|
||||
kwargs['changed'] = False
|
||||
|
||||
self.do_cleanup_files()
|
||||
|
@ -2261,7 +2292,6 @@ class AnsibleModule(object):
|
|||
e = get_exception()
|
||||
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):
|
||||
data = b('')
|
||||
if file_descriptor in rfds:
|
||||
|
@ -2387,9 +2417,9 @@ class AnsibleModule(object):
|
|||
# Clean out python paths set by ansiballz
|
||||
if 'PYTHONPATH' in os.environ:
|
||||
pypaths = os.environ['PYTHONPATH'].split(':')
|
||||
pypaths = [x for x in pypaths \
|
||||
if not x.endswith('/ansible_modlib.zip') \
|
||||
and not x.endswith('/debug_dir')]
|
||||
pypaths = [x for x in pypaths
|
||||
if not x.endswith('/ansible_modlib.zip') and
|
||||
not x.endswith('/debug_dir')]
|
||||
os.environ['PYTHONPATH'] = ':'.join(pypaths)
|
||||
if not os.environ['PYTHONPATH']:
|
||||
del os.environ['PYTHONPATH']
|
||||
|
|
|
@ -25,9 +25,12 @@
|
|||
# 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
|
||||
# USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
import json
|
||||
|
||||
from ansible.module_utils.urls import fetch_url
|
||||
|
||||
|
||||
class Response(object):
|
||||
|
||||
def __init__(self, resp, info):
|
||||
|
|
|
@ -25,18 +25,20 @@
|
|||
# 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
|
||||
# USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
#
|
||||
|
||||
import signal
|
||||
import socket
|
||||
import struct
|
||||
import signal
|
||||
|
||||
from ansible.module_utils.basic import get_exception
|
||||
from ansible.module_utils._text import to_bytes, to_native
|
||||
|
||||
|
||||
def send_data(s, data):
|
||||
packed_len = struct.pack('!Q', len(data))
|
||||
return s.sendall(packed_len + data)
|
||||
|
||||
|
||||
def recv_data(s):
|
||||
header_len = 8 # size of a packed unsigned long long
|
||||
data = to_bytes("")
|
||||
|
@ -54,6 +56,7 @@ def recv_data(s):
|
|||
data += d
|
||||
return data
|
||||
|
||||
|
||||
def exec_command(module, command):
|
||||
try:
|
||||
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
|
||||
# USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
|
||||
class SQLParseError(Exception):
|
||||
pass
|
||||
|
||||
|
||||
class UnclosedQuoteError(SQLParseError):
|
||||
pass
|
||||
|
||||
|
@ -38,6 +40,7 @@ class UnclosedQuoteError(SQLParseError):
|
|||
_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)
|
||||
|
||||
|
||||
def _find_end_quote(identifier, quote_char):
|
||||
accumulate = 0
|
||||
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]))
|
||||
return '.'.join(identifier_fragments)
|
||||
|
||||
|
||||
def mysql_quote_identifier(identifier, id_type):
|
||||
identifier_fragments = _identifier_parse(identifier, quote_char='`')
|
||||
if len(identifier_fragments) > _MYSQL_IDENTIFIER_TO_DOT_LEVEL[id_type]:
|
||||
|
|
|
@ -327,11 +327,10 @@ class AnsibleDockerClient(Client):
|
|||
def _handle_ssl_error(self, error):
|
||||
match = re.match(r"hostname.*doesn\'t match (\'.*\')", str(error))
|
||||
if match:
|
||||
msg = "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. " \
|
||||
"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.fail(msg)
|
||||
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. "
|
||||
"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.fail("SSL Exception: %s" % (error))
|
||||
|
||||
def get_container(self, name=None):
|
||||
|
@ -448,5 +447,3 @@ class AnsibleDockerClient(Client):
|
|||
new_tag = self.find_image(name, 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
|
||||
|
||||
|
||||
class AnsibleAWSError(Exception):
|
||||
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 '
|
||||
'parameter in the boto3_conn function call')
|
||||
|
||||
|
||||
def _boto3_conn(conn_type=None, resource=None, region=None, endpoint=None, **params):
|
||||
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
|
||||
|
||||
|
||||
def aws_common_argument_spec():
|
||||
return dict(
|
||||
ec2_url=dict(),
|
||||
|
@ -291,6 +294,7 @@ def ec2_connect(module):
|
|||
|
||||
return ec2
|
||||
|
||||
|
||||
def paging(pause=0, marker_property='marker'):
|
||||
""" Adds paging to boto retrieval functions that support a 'marker'
|
||||
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()
|
||||
|
||||
|
||||
def value_is_list(camel_list):
|
||||
|
||||
checked_list = []
|
||||
|
@ -344,7 +347,6 @@ def camel_dict_to_snake_dict(camel_dict):
|
|||
|
||||
return checked_list
|
||||
|
||||
|
||||
snake_dict = {}
|
||||
for k, v in camel_dict.items():
|
||||
if isinstance(v, dict):
|
||||
|
@ -491,7 +493,6 @@ def get_ec2_security_group_ids_from_names(sec_group_list, ec2_connection, vpc_id
|
|||
else:
|
||||
return sg.name
|
||||
|
||||
|
||||
def get_sg_id(sg, boto3):
|
||||
|
||||
if boto3:
|
||||
|
|
|
@ -56,7 +56,6 @@ def f5_argument_spec():
|
|||
server_port=dict(
|
||||
type='int',
|
||||
default=443,
|
||||
required=False,
|
||||
fallback=(env_fallback, ['F5_SERVER_PORT'])
|
||||
),
|
||||
state=dict(
|
||||
|
@ -80,7 +79,7 @@ def f5_parse_arguments(module):
|
|||
import ssl
|
||||
if not hasattr(ssl, 'SSLContext'):
|
||||
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'")
|
||||
|
||||
return (
|
||||
|
@ -135,13 +134,9 @@ def fq_list_names(partition,list_names):
|
|||
return map(lambda x: fq_name(partition, x), list_names)
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
# New style
|
||||
|
||||
from abc import ABCMeta, abstractproperty
|
||||
from ansible.module_utils.six import with_metaclass
|
||||
from collections import defaultdict
|
||||
|
||||
try:
|
||||
|
@ -158,7 +153,7 @@ except ImportError:
|
|||
|
||||
|
||||
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(
|
||||
|
@ -187,7 +182,6 @@ F5_COMMON_ARGS = dict(
|
|||
server_port=dict(
|
||||
type='int',
|
||||
default=443,
|
||||
required=False,
|
||||
fallback=(env_fallback, ['F5_SERVER_PORT'])
|
||||
),
|
||||
state=dict(
|
||||
|
|
|
@ -48,7 +48,7 @@ fortios_argument_spec = dict(
|
|||
username=dict(),
|
||||
password=dict(type='str', no_log=True),
|
||||
timeout=dict(type='int', default=60),
|
||||
vdom = dict(type='str', default=None ),
|
||||
vdom=dict(type='str'),
|
||||
backup=dict(type='bool', default=False),
|
||||
backup_path=dict(type='path'),
|
||||
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))
|
||||
|
||||
|
||||
|
||||
|
||||
class AnsibleFortios(object):
|
||||
def __init__(self, module):
|
||||
if not HAS_PYFG:
|
||||
|
@ -103,7 +101,6 @@ class AnsibleFortios(object):
|
|||
}
|
||||
self.module = module
|
||||
|
||||
|
||||
def _connect(self):
|
||||
if self.module.params['file_mode']:
|
||||
self.forti_device = FortiOS('')
|
||||
|
@ -122,7 +119,6 @@ class AnsibleFortios(object):
|
|||
e = get_exception()
|
||||
self.module.fail_json(msg='Error connecting device. %s' % e)
|
||||
|
||||
|
||||
def load_config(self, path):
|
||||
self.path = path
|
||||
self._connect()
|
||||
|
@ -154,7 +150,6 @@ class AnsibleFortios(object):
|
|||
if self.module.params['backup']:
|
||||
backup(self.module, self.forti_device.running_config.to_text())
|
||||
|
||||
|
||||
def apply_changes(self):
|
||||
change_string = self.forti_device.compare_config()
|
||||
if change_string:
|
||||
|
@ -184,15 +179,12 @@ class AnsibleFortios(object):
|
|||
self.forti_device.close()
|
||||
self.module.exit_json(**self.result)
|
||||
|
||||
|
||||
def del_block(self, block_id):
|
||||
self.forti_device.candidate_config[self.path].del_block(block_id)
|
||||
|
||||
|
||||
def add_block(self, block_id, block):
|
||||
self.forti_device.candidate_config[self.path][block_id] = block
|
||||
|
||||
|
||||
def get_error_infos(self, cli_errors):
|
||||
error_list = []
|
||||
for errors in cli_errors.args:
|
||||
|
@ -206,4 +198,3 @@ class AnsibleFortios(object):
|
|||
|
||||
def get_empty_configuration_block(self, 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.
|
||||
#
|
||||
|
||||
from ansible.module_utils.gcp import gcp_connect
|
||||
from ansible.module_utils.gcp import unexpected_error_msg as gcp_error
|
||||
|
||||
try:
|
||||
from libcloud.dns.types import Provider
|
||||
from libcloud.dns.providers import get_driver
|
||||
|
@ -37,9 +34,13 @@ try:
|
|||
except ImportError:
|
||||
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_VERSION = "v1"
|
||||
|
||||
|
||||
def gcdns_connect(module, provider=None):
|
||||
"""Return a GCP connection for Google Cloud DNS."""
|
||||
if not HAS_LIBCLOUD_BASE:
|
||||
|
@ -48,6 +49,7 @@ def gcdns_connect(module, provider=None):
|
|||
provider = provider or Provider.GOOGLE
|
||||
return gcp_connect(module, provider, get_driver, USER_AGENT_PRODUCT, USER_AGENT_VERSION)
|
||||
|
||||
|
||||
def unexpected_error_msg(error):
|
||||
"""Create an error string based on passed in error."""
|
||||
return gcp_error(error)
|
||||
|
|
|
@ -25,10 +25,6 @@
|
|||
# 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
|
||||
# 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:
|
||||
from libcloud.compute.types import Provider
|
||||
|
@ -37,9 +33,13 @@ try:
|
|||
except ImportError:
|
||||
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_VERSION = "v1"
|
||||
|
||||
|
||||
def gce_connect(module, provider=None):
|
||||
"""Return a GCP connection for Google Compute Engine."""
|
||||
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)
|
||||
|
||||
|
||||
def unexpected_error_msg(error):
|
||||
"""Create an error string based on passed in error."""
|
||||
return gcp_error(error)
|
||||
|
|
|
@ -502,8 +502,7 @@ class GCPUtils(object):
|
|||
|
||||
@staticmethod
|
||||
def underscore_to_camel(txt):
|
||||
return txt.split('_')[0] + ''.join(x.capitalize()
|
||||
or '_' for x in txt.split('_')[1:])
|
||||
return txt.split('_')[0] + ''.join(x.capitalize() or '_' for x in txt.split('_')[1:])
|
||||
|
||||
@staticmethod
|
||||
def remove_non_gcp_params(params):
|
||||
|
@ -626,7 +625,7 @@ class GCPUtils(object):
|
|||
# TODO(supertom): Isolate 'build-new-request' stuff.
|
||||
resource_name_singular = GCPUtils.get_entity_name_from_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'])[
|
||||
'entity_name']
|
||||
args = {'project': project_id,
|
||||
|
|
|
@ -29,6 +29,7 @@ try:
|
|||
except ImportError:
|
||||
import simplejson as json
|
||||
|
||||
|
||||
# NB: a copy of this function exists in ../../modules/core/async_wrapper.py. Ensure any
|
||||
# changes are propagated there.
|
||||
def _filter_non_json_lines(data):
|
||||
|
|
|
@ -47,6 +47,7 @@ ARGS_DEFAULT_VALUE = {
|
|||
'timeout': 10
|
||||
}
|
||||
|
||||
|
||||
def check_args(module, warnings):
|
||||
provider = module.params['provider'] or {}
|
||||
for key in junos_argument_spec:
|
||||
|
@ -66,6 +67,7 @@ def check_args(module, warnings):
|
|||
if provider.get(param):
|
||||
module.no_log_values.update(return_values(provider[param]))
|
||||
|
||||
|
||||
def _validate_rollback_id(module, value):
|
||||
try:
|
||||
if not 0 <= int(value) <= 49:
|
||||
|
@ -73,6 +75,7 @@ def _validate_rollback_id(module, value):
|
|||
except ValueError:
|
||||
module.fail_json(msg='rollback must be between 0 and 49')
|
||||
|
||||
|
||||
def load_configuration(module, candidate=None, action='merge', rollback=None, format='xml'):
|
||||
|
||||
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)
|
||||
return send_request(module, obj)
|
||||
|
||||
|
||||
def get_configuration(module, compare=False, format='xml', rollback='0'):
|
||||
if format not in CONFIG_FORMATS:
|
||||
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)
|
||||
return send_request(module, Element('get-configuration', xattrs))
|
||||
|
||||
|
||||
def commit_configuration(module, confirm=False, check=False, comment=None, confirm_timeout=None):
|
||||
obj = Element('commit-configuration')
|
||||
if confirm:
|
||||
|
@ -141,6 +146,7 @@ def commit_configuration(module, confirm=False, check=False, comment=None, confi
|
|||
subele.text = str(confirm_timeout)
|
||||
return send_request(module, obj)
|
||||
|
||||
|
||||
def command(module, command, format='text', rpc_only=False):
|
||||
xattrs = {'format': format}
|
||||
if rpc_only:
|
||||
|
@ -148,8 +154,14 @@ def command(module, command, format='text', rpc_only=False):
|
|||
xattrs['format'] = 'text'
|
||||
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
|
||||
def locked_config(module):
|
||||
|
@ -159,6 +171,7 @@ def locked_config(module):
|
|||
finally:
|
||||
unlock_configuration(module)
|
||||
|
||||
|
||||
def get_diff(module):
|
||||
|
||||
reply = get_configuration(module, compare=True, format='text')
|
||||
|
@ -166,6 +179,7 @@ def get_diff(module):
|
|||
if output is not None:
|
||||
return to_text(output.text, encoding='latin1').strip()
|
||||
|
||||
|
||||
def load_config(module, candidate, warnings, action='merge', commit=False, format='xml',
|
||||
comment=None, confirm=False, confirm_timeout=None):
|
||||
|
||||
|
@ -192,5 +206,6 @@ def load_config(module, candidate, warnings, action='merge', commit=False, forma
|
|||
|
||||
return diff
|
||||
|
||||
|
||||
def get_param(module, 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
|
||||
import socket
|
||||
import ssl
|
||||
|
||||
try:
|
||||
from httplib import HTTPConnection, HTTPSConnection
|
||||
except ImportError:
|
||||
# Python 3
|
||||
from http.client import HTTPConnection, HTTPSConnection
|
||||
|
||||
|
||||
class UnixHTTPConnection(HTTPConnection):
|
||||
def __init__(self, path):
|
||||
HTTPConnection.__init__(self, 'localhost')
|
||||
|
@ -54,11 +56,13 @@ class UnixHTTPConnection(HTTPConnection):
|
|||
sock.connect(self.path)
|
||||
self.sock = sock
|
||||
|
||||
|
||||
class LXDClientException(Exception):
|
||||
def __init__(self, msg, **kwargs):
|
||||
self.msg = msg
|
||||
self.kwargs = kwargs
|
||||
|
||||
|
||||
class LXDClient(object):
|
||||
def __init__(self, url, key_file=None, cert_file=None, debug=False):
|
||||
"""LXD Client.
|
||||
|
|
|
@ -35,6 +35,7 @@ try:
|
|||
except ImportError:
|
||||
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,
|
||||
connect_timeout=30):
|
||||
config = {}
|
||||
|
|
|
@ -92,13 +92,20 @@ class ConfigLine(object):
|
|||
assert isinstance(obj, ConfigLine), 'child must be of type `ConfigLine`'
|
||||
self._children.append(obj)
|
||||
|
||||
|
||||
def ignore_line(text, tokens=None):
|
||||
for item in (tokens or DEFAULT_COMMENT_TOKENS):
|
||||
if text.startswith(item):
|
||||
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):
|
||||
items = list()
|
||||
|
@ -110,6 +117,7 @@ def _obj_to_block(objects, visited=None):
|
|||
items.append(child)
|
||||
return _obj_to_raw(items)
|
||||
|
||||
|
||||
def dumps(objects, output='block', comments=False):
|
||||
if output == 'block':
|
||||
items = _obj_to_block(objects)
|
||||
|
@ -130,6 +138,7 @@ def dumps(objects, output='block', comments=False):
|
|||
|
||||
return '\n'.join(items)
|
||||
|
||||
|
||||
class NetworkConfig(object):
|
||||
|
||||
def __init__(self, indent=1, contents=None):
|
||||
|
@ -328,7 +337,7 @@ class NetworkConfig(object):
|
|||
offset = 0
|
||||
obj = None
|
||||
|
||||
## global config command
|
||||
# global config command
|
||||
if not parents:
|
||||
for line in lines:
|
||||
item = ConfigLine(line)
|
||||
|
|
|
@ -24,17 +24,16 @@
|
|||
# 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
|
||||
# USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
#
|
||||
|
||||
import re
|
||||
import time
|
||||
import shlex
|
||||
import time
|
||||
|
||||
from ansible.module_utils.basic import BOOLEANS_TRUE, BOOLEANS_FALSE
|
||||
from ansible.module_utils.basic import get_exception
|
||||
from ansible.module_utils.basic import BOOLEANS_TRUE, BOOLEANS_FALSE, get_exception
|
||||
from ansible.module_utils.six import string_types, text_type
|
||||
from ansible.module_utils.six.moves import zip
|
||||
|
||||
|
||||
def to_list(val):
|
||||
if isinstance(val, (list, tuple)):
|
||||
return list(val)
|
||||
|
@ -49,16 +48,19 @@ class FailedConditionsError(Exception):
|
|||
super(FailedConditionsError, self).__init__(msg)
|
||||
self.failed_conditions = failed_conditions
|
||||
|
||||
|
||||
class FailedConditionalError(Exception):
|
||||
def __init__(self, msg, failed_conditional):
|
||||
super(FailedConditionalError, self).__init__(msg)
|
||||
self.failed_conditional = failed_conditional
|
||||
|
||||
|
||||
class AddCommandError(Exception):
|
||||
def __init__(self, msg, command):
|
||||
super(AddCommandError, self).__init__(msg)
|
||||
self.command = command
|
||||
|
||||
|
||||
class AddConditionError(Exception):
|
||||
def __init__(self, msg, condition):
|
||||
super(AddConditionError, self).__init__(msg)
|
||||
|
@ -105,6 +107,7 @@ class Cli(object):
|
|||
|
||||
return responses
|
||||
|
||||
|
||||
class Command(object):
|
||||
|
||||
def __init__(self, command, output=None, prompt=None, response=None,
|
||||
|
@ -122,6 +125,7 @@ class Command(object):
|
|||
def __str__(self):
|
||||
return self.command_string
|
||||
|
||||
|
||||
class CommandRunner(object):
|
||||
|
||||
def __init__(self, module):
|
||||
|
|
|
@ -26,14 +26,13 @@
|
|||
# USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
#
|
||||
from contextlib import contextmanager
|
||||
from xml.etree.ElementTree import Element, SubElement
|
||||
from xml.etree.ElementTree import tostring, fromstring
|
||||
from xml.etree.ElementTree import Element, SubElement, fromstring, tostring
|
||||
|
||||
from ansible.module_utils.connection import exec_command
|
||||
|
||||
|
||||
NS_MAP = {'nc': "urn:ietf:params:xml:ns:netconf:base:1.0"}
|
||||
|
||||
|
||||
def send_request(module, obj, check_rc=True):
|
||||
request = tostring(obj)
|
||||
rc, out, err = exec_command(module, request)
|
||||
|
@ -58,6 +57,7 @@ def send_request(module, obj, check_rc=True):
|
|||
return warnings
|
||||
return fromstring(out)
|
||||
|
||||
|
||||
def children(root, iterable):
|
||||
for item in iterable:
|
||||
try:
|
||||
|
@ -65,33 +65,40 @@ def children(root, iterable):
|
|||
except NameError:
|
||||
ele = SubElement(root, item)
|
||||
|
||||
|
||||
def lock(module, target='candidate'):
|
||||
obj = Element('lock')
|
||||
children(obj, ('target', target))
|
||||
return send_request(module, obj)
|
||||
|
||||
|
||||
def unlock(module, target='candidate'):
|
||||
obj = Element('unlock')
|
||||
children(obj, ('target', target))
|
||||
return send_request(module, obj)
|
||||
|
||||
|
||||
def commit(module):
|
||||
return send_request(module, Element('commit'))
|
||||
|
||||
|
||||
def discard_changes(module):
|
||||
return send_request(module, Element('discard-changes'))
|
||||
|
||||
|
||||
def validate(module):
|
||||
obj = Element('validate')
|
||||
children(obj, ('source', 'candidate'))
|
||||
return send_request(module, obj)
|
||||
|
||||
|
||||
def get_config(module, source='running', filter=None):
|
||||
obj = Element('get-config')
|
||||
children(obj, ('source', source))
|
||||
children(obj, ('filter', filter))
|
||||
return send_request(module, obj)
|
||||
|
||||
|
||||
@contextmanager
|
||||
def locked_config(module):
|
||||
try:
|
||||
|
|
|
@ -52,6 +52,7 @@ NET_CONNECTION_ARGS = dict()
|
|||
|
||||
NET_CONNECTIONS = dict()
|
||||
|
||||
|
||||
def _transitional_argument_spec():
|
||||
argument_spec = {}
|
||||
for key, value in iteritems(NET_TRANSPORT_ARGS):
|
||||
|
@ -59,6 +60,7 @@ def _transitional_argument_spec():
|
|||
argument_spec[key] = value
|
||||
return argument_spec
|
||||
|
||||
|
||||
def to_list(val):
|
||||
if isinstance(val, (list, tuple)):
|
||||
return list(val)
|
||||
|
@ -75,12 +77,14 @@ class ModuleStub(object):
|
|||
self.params[key] = value.get('default')
|
||||
self.fail_json = fail_json
|
||||
|
||||
|
||||
class NetworkError(Exception):
|
||||
|
||||
def __init__(self, msg, **kwargs):
|
||||
super(NetworkError, self).__init__(msg)
|
||||
self.kwargs = kwargs
|
||||
|
||||
|
||||
class Config(object):
|
||||
|
||||
def __init__(self, connection):
|
||||
|
@ -185,6 +189,7 @@ class NetworkModule(AnsibleModule):
|
|||
exc = get_exception()
|
||||
self.fail_json(msg=to_native(exc))
|
||||
|
||||
|
||||
def register_transport(transport, default=False):
|
||||
def register(cls):
|
||||
NET_CONNECTIONS[transport] = cls
|
||||
|
@ -193,6 +198,6 @@ def register_transport(transport, default=False):
|
|||
return cls
|
||||
return register
|
||||
|
||||
|
||||
def add_argument(key, value):
|
||||
NET_CONNECTION_ARGS[key] = value
|
||||
|
||||
|
|
|
@ -24,9 +24,10 @@
|
|||
# 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
|
||||
# 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.six import iteritems
|
||||
|
||||
|
||||
def to_list(val):
|
||||
if isinstance(val, (list, tuple, set)):
|
||||
|
@ -36,6 +37,7 @@ def to_list(val):
|
|||
else:
|
||||
return list()
|
||||
|
||||
|
||||
class ComplexDict(object):
|
||||
"""Transforms a dict to with an argument spec
|
||||
|
||||
|
@ -88,7 +90,6 @@ class ComplexDict(object):
|
|||
self_has_key = True
|
||||
attr['required'] = True
|
||||
|
||||
|
||||
def _dict(self, value):
|
||||
obj = {}
|
||||
for name, attr in iteritems(self._attributes):
|
||||
|
@ -131,8 +132,7 @@ class ComplexDict(object):
|
|||
|
||||
if 'choices' in attr:
|
||||
if value[name] not in attr['choices']:
|
||||
raise ValueError('%s must be one of %s, got %s' % \
|
||||
(name, ', '.join(attr['choices']), value[name]))
|
||||
raise ValueError('%s must be one of %s, got %s' % (name, ', '.join(attr['choices']), value[name]))
|
||||
|
||||
if value[name] is not None:
|
||||
value_type = attr.get('type', 'str')
|
||||
|
@ -141,6 +141,7 @@ class ComplexDict(object):
|
|||
|
||||
return value
|
||||
|
||||
|
||||
class ComplexList(ComplexDict):
|
||||
"""Extends ```ComplexDict``` to handle a list of dicts """
|
||||
|
||||
|
@ -148,4 +149,3 @@ class ComplexList(ComplexDict):
|
|||
if not isinstance(values, (list, tuple)):
|
||||
raise TypeError('value must be an ordered iterable')
|
||||
return [(super(ComplexList, self).__call__(v)) for v in values]
|
||||
|
||||
|
|
|
@ -30,6 +30,7 @@ import os
|
|||
|
||||
from ansible.module_utils.six import iteritems
|
||||
|
||||
|
||||
def openstack_argument_spec():
|
||||
# DEPRECATED: This argument spec is only used for the deprecated old
|
||||
# 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),
|
||||
auth_url=dict(default=OS_AUTH_URL),
|
||||
region_name=dict(default=OS_REGION_NAME),
|
||||
availability_zone = dict(default=None),
|
||||
availability_zone=dict(),
|
||||
)
|
||||
if OS_PASSWORD:
|
||||
spec['login_password'] = dict(default=OS_PASSWORD)
|
||||
|
@ -59,6 +60,7 @@ def openstack_argument_spec():
|
|||
spec['login_tenant_name'] = dict(required=True)
|
||||
return spec
|
||||
|
||||
|
||||
def openstack_find_nova_addresses(addresses, ext_tag, key_name=None):
|
||||
|
||||
ret = []
|
||||
|
@ -71,6 +73,7 @@ def openstack_find_nova_addresses(addresses, ext_tag, key_name=None):
|
|||
ret.append(interface_spec['addr'])
|
||||
return ret
|
||||
|
||||
|
||||
def openstack_full_argument_spec(**kwargs):
|
||||
spec = dict(
|
||||
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('validate_certs', dict(default=True, type='bool'))
|
||||
|
||||
|
||||
def get_opsidl():
|
||||
extschema = restparser.parseSchema(settings.get('ext_schema'))
|
||||
ovsschema = settings.get('ovs_schema')
|
||||
|
@ -129,7 +130,7 @@ class Rest(object):
|
|||
def authorize(self, params, **kwargs):
|
||||
raise NotImplementedError
|
||||
|
||||
### REST methods ###
|
||||
# REST methods
|
||||
|
||||
def _url_builder(self, path):
|
||||
if path[0] == '/':
|
||||
|
@ -160,12 +161,12 @@ class Rest(object):
|
|||
def delete(self, path, data=None, headers=None):
|
||||
return self.request('DELETE', path, data, headers)
|
||||
|
||||
### Command methods ###
|
||||
# Command methods
|
||||
|
||||
def run_commands(self, commands):
|
||||
raise NotImplementedError
|
||||
|
||||
### Config methods ###
|
||||
# Config methods
|
||||
|
||||
def configure(self, commands):
|
||||
path = '/system/full-configuration'
|
||||
|
@ -212,7 +213,7 @@ class Cli(CliBase):
|
|||
|
||||
NET_PASSWD_RE = re.compile(r"[\r\n]?password: $", re.I)
|
||||
|
||||
### Config methods ###
|
||||
# Config methods
|
||||
|
||||
def configure(self, commands, **kwargs):
|
||||
cmds = ['configure terminal']
|
||||
|
|
|
@ -1,5 +1,6 @@
|
|||
_DEVICE_CONFIGS = {}
|
||||
|
||||
|
||||
def get_config(module, flags=[]):
|
||||
cmd = 'show running-config '
|
||||
cmd += ' '.join(flags)
|
||||
|
|
|
@ -504,7 +504,6 @@ class BaseModule(object):
|
|||
after[k] = update[k]
|
||||
return after
|
||||
|
||||
|
||||
def create(
|
||||
self,
|
||||
entity=None,
|
||||
|
@ -579,9 +578,14 @@ class BaseModule(object):
|
|||
# Wait for the entity to be created and to be in the defined state:
|
||||
entity_service = self._service.service(entity.id)
|
||||
|
||||
state_condition = lambda entity: entity
|
||||
def state_condition(entity):
|
||||
return entity
|
||||
|
||||
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(
|
||||
service=entity_service,
|
||||
condition=state_condition,
|
||||
|
|
|
@ -27,24 +27,21 @@
|
|||
# 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.
|
||||
|
||||
# standard ansible imports
|
||||
from ansible.module_utils.basic import get_exception
|
||||
|
||||
# standard PG imports
|
||||
HAS_PSYCOPG2 = False
|
||||
try:
|
||||
import psycopg2
|
||||
import psycopg2.extras
|
||||
except ImportError:
|
||||
pass
|
||||
else:
|
||||
HAS_PSYCOPG2 = True
|
||||
except ImportError:
|
||||
HAS_PSYCOPG2 = False
|
||||
|
||||
from ansible.module_utils.basic import get_exception
|
||||
from ansible.module_utils.six import iteritems
|
||||
|
||||
|
||||
class LibraryError(Exception):
|
||||
pass
|
||||
|
||||
|
||||
def ensure_libs(sslrootcert=None):
|
||||
if not HAS_PSYCOPG2:
|
||||
raise LibraryError('psycopg2 is not installed. we need psycopg2.')
|
||||
|
@ -54,6 +51,7 @@ def ensure_libs(sslrootcert=None):
|
|||
# no problems
|
||||
return None
|
||||
|
||||
|
||||
def postgres_common_argument_spec():
|
||||
return dict(
|
||||
login_user=dict(default='postgres'),
|
||||
|
@ -62,6 +60,5 @@ def postgres_common_argument_spec():
|
|||
login_unix_socket=dict(default=''),
|
||||
port=dict(type='int', default=5432),
|
||||
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
|
||||
# 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.
|
||||
#
|
||||
|
||||
import sys
|
||||
|
||||
|
||||
def get_exception():
|
||||
"""Get the current exception.
|
||||
|
||||
|
|
|
@ -277,4 +277,3 @@ class RhsmPools(object):
|
|||
for product in self.products:
|
||||
if r.search(product._name):
|
||||
yield product
|
||||
|
||||
|
|
|
@ -25,20 +25,20 @@
|
|||
# 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
|
||||
# USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
#
|
||||
|
||||
import os
|
||||
import shlex
|
||||
import subprocess
|
||||
import glob
|
||||
import select
|
||||
import os
|
||||
import pickle
|
||||
import platform
|
||||
import select
|
||||
import shlex
|
||||
import subprocess
|
||||
import traceback
|
||||
|
||||
from ansible.module_utils.six import PY2, b
|
||||
from ansible.module_utils._text import to_bytes, to_text
|
||||
|
||||
|
||||
def sysv_is_enabled(name):
|
||||
'''
|
||||
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))
|
||||
|
||||
|
||||
def get_sysv_script(name):
|
||||
'''
|
||||
This function will return the expected path for an init script
|
||||
|
@ -62,6 +63,7 @@ def get_sysv_script(name):
|
|||
|
||||
return result
|
||||
|
||||
|
||||
def sysv_exists(name):
|
||||
'''
|
||||
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))
|
||||
|
||||
|
||||
def fail_if_missing(module, found, service, msg=''):
|
||||
'''
|
||||
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:
|
||||
module.fail_json(msg='Could not find the requested service %s: %s' % (service, msg))
|
||||
|
||||
|
||||
def daemonize(module, cmd):
|
||||
'''
|
||||
Execute a command while detaching as a deamon, returns rc, stdout, and stderr.
|
||||
|
@ -207,6 +211,7 @@ def daemonize(module, cmd):
|
|||
# py2 and py3)
|
||||
return pickle.loads(to_bytes(return_data, errors=errors))
|
||||
|
||||
|
||||
def check_ps(module, pattern):
|
||||
|
||||
# Set ps flags
|
||||
|
|
|
@ -281,5 +281,8 @@ class CliBase(object):
|
|||
exc = get_exception()
|
||||
raise NetworkError(to_native(exc))
|
||||
|
||||
run_commands = lambda self, x: self.execute(to_list(x))
|
||||
exec_command = lambda self, x: self.shell.send(self.to_command(x))
|
||||
def run_commands(self, 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
|
||||
# USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
|
||||
def _get_quote_state(token, quote_char):
|
||||
'''
|
||||
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
|
||||
return quote_char
|
||||
|
||||
|
||||
def _count_jinja2_blocks(token, cur_depth, open_token, close_token):
|
||||
'''
|
||||
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
|
||||
return cur_depth
|
||||
|
||||
|
||||
def split_args(args):
|
||||
'''
|
||||
Splits args on whitespace, but intelligently reassembles
|
||||
|
@ -201,12 +204,13 @@ def split_args(args):
|
|||
|
||||
return params
|
||||
|
||||
|
||||
def is_quoted(data):
|
||||
return len(data) > 0 and (data[0] == '"' and data[-1] == '"' or data[0] == "'" and data[-1] == "'")
|
||||
|
||||
|
||||
def unquote(data):
|
||||
''' removes first and last quotes from a string, if the string starts and ends with the same quotes '''
|
||||
if is_quoted(data):
|
||||
return data[1:-1]
|
||||
return data
|
||||
|
||||
|
|
|
@ -118,7 +118,7 @@ def uldap():
|
|||
base=base_dn(),
|
||||
binddn=bind_dn,
|
||||
bindpw=pwd,
|
||||
start_tls = 1
|
||||
start_tls=1,
|
||||
)
|
||||
|
||||
return _singleton('uldap', construct)
|
||||
|
|
|
@ -206,17 +206,14 @@ except ImportError:
|
|||
HAS_MATCH_HOSTNAME = False
|
||||
|
||||
if not HAS_MATCH_HOSTNAME:
|
||||
###
|
||||
### The following block of code is under the terms and conditions of the
|
||||
### Python Software Foundation License
|
||||
###
|
||||
# The following block of code is under the terms and conditions of the
|
||||
# Python Software Foundation License
|
||||
|
||||
"""The match_hostname() function from Python 3.4, essential when using SSL."""
|
||||
|
||||
class CertificateError(ValueError):
|
||||
pass
|
||||
|
||||
|
||||
def _dnsname_match(dn, hostname, max_wildcards=1):
|
||||
"""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)
|
||||
return pat.match(hostname)
|
||||
|
||||
|
||||
def match_hostname(cert, hostname):
|
||||
"""Verify that *cert* (in decoded format as returned by
|
||||
SSLSocket.getpeercert()) matches the *hostname*. RFC 2818 and RFC 6125
|
||||
|
@ -299,20 +295,13 @@ if not HAS_MATCH_HOSTNAME:
|
|||
return
|
||||
dnsnames.append(value)
|
||||
if len(dnsnames) > 1:
|
||||
raise CertificateError("hostname %r "
|
||||
"doesn't match either of %s"
|
||||
% (hostname, ', '.join(map(repr, dnsnames))))
|
||||
raise CertificateError("hostname %r " "doesn't match either of %s" % (hostname, ', '.join(map(repr, dnsnames))))
|
||||
elif len(dnsnames) == 1:
|
||||
raise CertificateError("hostname %r "
|
||||
"doesn't match %r"
|
||||
% (hostname, dnsnames[0]))
|
||||
raise CertificateError("hostname %r doesn't match %r" % (hostname, dnsnames[0]))
|
||||
else:
|
||||
raise CertificateError("no appropriate commonName or "
|
||||
"subjectAltName fields were found")
|
||||
raise CertificateError("no appropriate commonName or subjectAltName fields were found")
|
||||
|
||||
###
|
||||
### End of Python Software Foundation Licensed code
|
||||
###
|
||||
# End of Python Software Foundation Licensed code
|
||||
|
||||
HAS_MATCH_HOSTNAME = True
|
||||
|
||||
|
@ -552,8 +541,7 @@ def RedirectHandlerFactory(follow_redirects=None, validate_certs=True):
|
|||
# be conciliant with URIs containing a space
|
||||
newurl = newurl.replace(' ', '%20')
|
||||
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:
|
||||
# Python 2-3.3
|
||||
origin_req_host = req.get_origin_req_host()
|
||||
|
|
|
@ -15,6 +15,7 @@
|
|||
# along with Ansible. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
import os
|
||||
|
||||
try:
|
||||
from pyvcloud.vcloudair import VCA
|
||||
HAS_PYVCLOUD = True
|
||||
|
@ -29,12 +30,14 @@ LOGIN_HOST = {'vca': 'vca.vmware.com', 'vchs': 'vchs.vmware.com'}
|
|||
DEFAULT_SERVICE_TYPE = 'vca'
|
||||
DEFAULT_VERSION = '5.7'
|
||||
|
||||
|
||||
class VcaError(Exception):
|
||||
|
||||
def __init__(self, msg, **kwargs):
|
||||
self.kwargs = kwargs
|
||||
super(VcaError, self).__init__(msg)
|
||||
|
||||
|
||||
def vca_argument_spec():
|
||||
return dict(
|
||||
username=dict(type='str', aliases=['user'], required=True),
|
||||
|
@ -50,6 +53,7 @@ def vca_argument_spec():
|
|||
verify_certs=dict(type='bool', default=True)
|
||||
)
|
||||
|
||||
|
||||
class VcaAnsibleModule(AnsibleModule):
|
||||
|
||||
def __init__(self, *args, **kwargs):
|
||||
|
@ -193,7 +197,6 @@ class VcaAnsibleModule(AnsibleModule):
|
|||
self.exit_json(**kwargs)
|
||||
|
||||
|
||||
|
||||
# -------------------------------------------------------------
|
||||
# 9/18/2015 @privateip
|
||||
# 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']
|
||||
VCD_REQ_ARGS = []
|
||||
|
||||
|
||||
def _validate_module(module):
|
||||
if not HAS_PYVCLOUD:
|
||||
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']))
|
||||
return instances
|
||||
|
||||
|
||||
def _vca_login(vca, password, instance):
|
||||
if not vca.login(password=password):
|
||||
raise VcaError("Login Failed: Please check username or password",
|
||||
|
@ -249,6 +254,7 @@ def _vca_login(vca, password, instance):
|
|||
|
||||
return vca
|
||||
|
||||
|
||||
def _vchs_login(vca, password, service, org):
|
||||
if not vca.login(password=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):
|
||||
raise VcaError("Failed to login to org", error=vca.response.content)
|
||||
|
||||
|
||||
def vca_login(module):
|
||||
service_type = module.params.get('service_type')
|
||||
username = module.params.get('username')
|
||||
|
@ -323,8 +330,3 @@ def vca_login(module):
|
|||
module.fail_json(msg=e.message, **e.kwargs)
|
||||
|
||||
return vca
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
|
|
@ -21,6 +21,7 @@ __metaclass__ = type
|
|||
|
||||
from copy import deepcopy
|
||||
|
||||
|
||||
class Attribute:
|
||||
|
||||
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:
|
||||
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:
|
||||
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. "
|
||||
|
|
|
@ -29,6 +29,7 @@ except ImportError:
|
|||
from ansible.utils.display import Display
|
||||
display = Display()
|
||||
|
||||
|
||||
class Become:
|
||||
|
||||
# Privilege escalation
|
||||
|
@ -101,4 +102,3 @@ class Become:
|
|||
become_method = C.DEFAULT_BECOME_METHOD
|
||||
if become_user is None:
|
||||
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.taggable import Taggable
|
||||
|
||||
|
||||
class Block(Base, Become, Conditional, Taggable):
|
||||
|
||||
# main block fields containing the task lists
|
||||
|
@ -385,4 +386,3 @@ class Block(Base, Become, Conditional, Taggable):
|
|||
return self._parent.all_parents_static()
|
||||
|
||||
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*\(')
|
||||
VALID_VAR_REGEX = re.compile("^[_A-Za-z][_a-zA-Z0-9]*$")
|
||||
|
||||
|
||||
class Conditional:
|
||||
|
||||
'''
|
||||
|
@ -234,7 +235,4 @@ class Conditional:
|
|||
# trigger the AnsibleUndefinedVariable exception again below
|
||||
raise
|
||||
except Exception as new_e:
|
||||
raise AnsibleUndefinedVariable(
|
||||
"error while evaluating conditional (%s): %s" % (original, e)
|
||||
)
|
||||
|
||||
raise AnsibleUndefinedVariable("error while evaluating conditional (%s): %s" % (original, e))
|
||||
|
|
|
@ -22,6 +22,7 @@ __metaclass__ = type
|
|||
from ansible.playbook.attribute import FieldAttribute
|
||||
from ansible.playbook.task import Task
|
||||
|
||||
|
||||
class Handler(Task):
|
||||
|
||||
_listen = FieldAttribute(isa='list')
|
||||
|
|
|
@ -20,8 +20,9 @@ from __future__ import (absolute_import, division, print_function)
|
|||
__metaclass__ = type
|
||||
|
||||
# from ansible.inventory.host import Host
|
||||
from ansible.playbook.task_include import TaskInclude
|
||||
from ansible.playbook.handler import Handler
|
||||
from ansible.playbook.task_include import 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):
|
||||
t = HandlerTaskInclude(block=block, role=role, task_include=task_include)
|
||||
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'])
|
||||
except AnsibleUndefinedVariable:
|
||||
raise AnsibleParserError(
|
||||
"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" \
|
||||
"or extra-vars passed in from the command line. Static includes cannot use variables from inventory\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"
|
||||
"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'],
|
||||
obj=task_ds,
|
||||
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:
|
||||
raise
|
||||
display.deprecated(
|
||||
"Included file '%s' not found, however since this include is not " \
|
||||
"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 " \
|
||||
"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 " \
|
||||
"Included file '%s' not found, however since this include is not "
|
||||
"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 "
|
||||
"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 "
|
||||
"options to make all inclues static for tasks and/or handlers" % include_file, version="2.7"
|
||||
)
|
||||
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(ti_copy.tags) > 0:
|
||||
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",
|
||||
obj=task_ds,
|
||||
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,
|
||||
task_include=None,
|
||||
variable_manager=variable_manager,
|
||||
loader=loader
|
||||
loader=loader,
|
||||
)
|
||||
|
||||
# 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]):
|
||||
needs_templating = True
|
||||
break
|
||||
is_static = C.DEFAULT_TASK_INCLUDES_STATIC or \
|
||||
(use_handlers and C.DEFAULT_HANDLER_INCLUDES_STATIC) or \
|
||||
is_static = (
|
||||
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)
|
||||
)
|
||||
display.debug('Determined that if include_role static is %s' % str(is_static))
|
||||
if is_static:
|
||||
# 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)
|
||||
|
||||
return roles
|
||||
|
||||
|
|
|
@ -30,6 +30,7 @@ except ImportError:
|
|||
from ansible.utils.display import Display
|
||||
display = Display()
|
||||
|
||||
|
||||
class IncludedFile:
|
||||
|
||||
def __init__(self, filename, args, task):
|
||||
|
|
|
@ -36,4 +36,3 @@ class LoopControl(Base):
|
|||
def load(data, variable_manager=None, loader=None):
|
||||
t = LoopControl()
|
||||
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
|
||||
|
||||
from ansible import constants as C
|
||||
|
||||
from ansible.errors import AnsibleParserError
|
||||
from ansible.module_utils.six import string_types
|
||||
|
||||
from ansible.playbook.attribute import FieldAttribute
|
||||
from ansible.playbook.base import Base
|
||||
from ansible.playbook.become import Become
|
||||
|
|
|
@ -155,6 +155,7 @@ RESET_VARS = (
|
|||
'ansible_port',
|
||||
)
|
||||
|
||||
|
||||
class PlayContext(Base):
|
||||
|
||||
'''
|
||||
|
@ -243,7 +244,6 @@ class PlayContext(Base):
|
|||
if play:
|
||||
self.set_play(play)
|
||||
|
||||
|
||||
def set_play(self, play):
|
||||
'''
|
||||
Configures this connection information instance with data from
|
||||
|
@ -464,7 +464,6 @@ class PlayContext(Base):
|
|||
if task.check_mode is not None:
|
||||
new_info.check_mode = task.check_mode
|
||||
|
||||
|
||||
return new_info
|
||||
|
||||
def make_become_cmd(self, cmd, executable=None):
|
||||
|
@ -490,18 +489,22 @@ class PlayContext(Base):
|
|||
command = success_cmd
|
||||
|
||||
# set executable to use for the privilege escalation method, with various overrides
|
||||
exe = self.become_exe or \
|
||||
getattr(self, '%s_exe' % self.become_method, None) or \
|
||||
C.DEFAULT_BECOME_EXE or \
|
||||
getattr(C, 'DEFAULT_%s_EXE' % self.become_method.upper(), None) or \
|
||||
exe = (
|
||||
self.become_exe or
|
||||
getattr(self, '%s_exe' % self.become_method, None) or
|
||||
C.DEFAULT_BECOME_EXE or
|
||||
getattr(C, 'DEFAULT_%s_EXE' % self.become_method.upper(), None) or
|
||||
self.become_method
|
||||
)
|
||||
|
||||
# set flags to use for the privilege escalation method, with various overrides
|
||||
flags = self.become_flags or \
|
||||
getattr(self, '%s_flags' % self.become_method, None) or \
|
||||
C.DEFAULT_BECOME_FLAGS or \
|
||||
getattr(C, 'DEFAULT_%s_FLAGS' % self.become_method.upper(), None) or \
|
||||
flags = (
|
||||
self.become_flags or
|
||||
getattr(self, '%s_flags' % self.become_method, None) or
|
||||
C.DEFAULT_BECOME_FLAGS or
|
||||
getattr(C, 'DEFAULT_%s_FLAGS' % self.become_method.upper(), None) or
|
||||
''
|
||||
)
|
||||
|
||||
if self.become_method == 'sudo':
|
||||
# If we have a password, we run sudo with a randomly-generated
|
||||
|
@ -521,7 +524,6 @@ class PlayContext(Base):
|
|||
else:
|
||||
becomecmd = '%s %s -u %s %s' % (exe, flags, self.become_user, command)
|
||||
|
||||
|
||||
elif self.become_method == '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
|
||||
|
||||
return self._attributes['connection']
|
||||
|
||||
|
|
|
@ -152,4 +152,3 @@ class PlaybookInclude(Base, Conditional, Taggable):
|
|||
if 'vars' in new_ds:
|
||||
raise AnsibleParserError("include parameters cannot be mixed with 'vars' entries for include statements", obj=ds)
|
||||
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
|
||||
# strategies (ansible/plugins/strategy/__init__.py)
|
||||
|
||||
|
||||
def hash_params(params):
|
||||
"""
|
||||
Construct a data structure of parameters that is hashable.
|
||||
|
@ -286,7 +287,6 @@ class Role(Base, Become, Conditional, Taggable):
|
|||
|
||||
return deps
|
||||
|
||||
#------------------------------------------------------------------------------
|
||||
# other functions
|
||||
|
||||
def add_parent(self, parent_role):
|
||||
|
@ -488,4 +488,3 @@ class Role(Base, Become, Conditional, Taggable):
|
|||
parent.set_loader(loader)
|
||||
for dep in self.get_direct_dependencies():
|
||||
dep.set_loader(loader)
|
||||
|
||||
|
|
|
@ -205,8 +205,8 @@ class RoleDefinition(Base, Become, Conditional, Taggable):
|
|||
# remember to update it manually.
|
||||
if key not in base_attribute_names or 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 + \
|
||||
"In the future, these values should be entered in the `vars:` " + \
|
||||
display.deprecated("Using '%s' as a role param has been deprecated. " % key +
|
||||
"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")
|
||||
role_def[key] = value
|
||||
# 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)
|
||||
return ri.load_data(data, variable_manager=variable_manager, loader=loader)
|
||||
|
||||
|
|
|
@ -46,6 +46,7 @@ except ImportError:
|
|||
from ansible.utils.display import Display
|
||||
display = Display()
|
||||
|
||||
|
||||
class RoleRequirement(RoleDefinition):
|
||||
|
||||
"""
|
||||
|
@ -228,4 +229,3 @@ class RoleRequirement(RoleDefinition):
|
|||
|
||||
shutil.rmtree(tempdir, ignore_errors=True)
|
||||
return temp_file.name
|
||||
|
||||
|
|
|
@ -60,7 +60,6 @@ class IncludeRole(Task):
|
|||
self._parent_role = role
|
||||
self._role_name = None
|
||||
|
||||
|
||||
def get_block_list(self, play=None, variable_manager=None, loader=None):
|
||||
|
||||
# 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)
|
||||
|
||||
### Process options
|
||||
# Process options
|
||||
# name is needed, or use role as alias
|
||||
ir._role_name = ir.args.get('name', ir.args.get('role'))
|
||||
if ir._role_name is None:
|
||||
|
|
|
@ -76,4 +76,3 @@ class TaskInclude(Task):
|
|||
del all_vars['when']
|
||||
|
||||
return all_vars
|
||||
|
||||
|
|
|
@ -271,7 +271,7 @@ class PluginLoader:
|
|||
|
||||
# HACK: We have no way of executing python byte
|
||||
# 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
|
||||
# bew valid
|
||||
if full_path.endswith(('.pyc', '.pyo')):
|
||||
|
@ -550,4 +550,3 @@ vars_loader = PluginLoader(
|
|||
C.DEFAULT_VARS_PLUGIN_PATH,
|
||||
'vars_plugins',
|
||||
)
|
||||
|
||||
|
|
|
@ -309,8 +309,8 @@ class ActionBase(with_metaclass(ABCMeta, object)):
|
|||
|
||||
tmp_rm_data = self._parse_returned_data(tmp_rm_res)
|
||||
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'),
|
||||
tmp_rm_res.get('stderr', 'No error string available.')))
|
||||
display.warning('Error deleting remote temporary files (rc: %s, stderr: %s})'
|
||||
% (tmp_rm_res.get('rc'), tmp_rm_res.get('stderr', 'No error string available.')))
|
||||
|
||||
def _transfer_file(self, 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'
|
||||
else:
|
||||
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
|
||||
# start to we'll have to fix this.
|
||||
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'])))
|
||||
else:
|
||||
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,'
|
||||
' see https://docs.ansible.com/ansible/become.html#becoming-an-unprivileged-user'.format(res['rc'], to_native(res['stderr'])))
|
||||
'(rc: %s, err: %s}). For information on working around this, see '
|
||||
'https://docs.ansible.com/ansible/become.html#becoming-an-unprivileged-user'
|
||||
% (res['rc'], to_native(res['stderr'])))
|
||||
elif execute:
|
||||
# Can't depend on the file being transferred with execute permissions.
|
||||
# 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
|
||||
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):
|
||||
'''
|
||||
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):
|
||||
|
||||
# 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()
|
||||
|
||||
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]:
|
||||
del data[key]
|
||||
|
||||
|
||||
def _clean_returned_data(self, data):
|
||||
remove_keys = set()
|
||||
fact_keys = set(data.keys())
|
||||
|
|
|
@ -22,7 +22,6 @@ __metaclass__ = type
|
|||
from ansible.plugins.action import ActionBase
|
||||
from ansible.plugins.action.net_config import ActionModule as NetActionModule
|
||||
|
||||
|
||||
class ActionModule(NetActionModule, ActionBase):
|
||||
pass
|
||||
|
||||
|
||||
|
|
|
@ -22,5 +22,6 @@ __metaclass__ = type
|
|||
from ansible.plugins.action import ActionBase
|
||||
from ansible.plugins.action.net_template import ActionModule as NetActionModule
|
||||
|
||||
|
||||
class ActionModule(NetActionModule, ActionBase):
|
||||
pass
|
||||
|
|
|
@ -27,6 +27,7 @@ import urlparse
|
|||
from ansible.module_utils._text import to_text
|
||||
from ansible.plugins.action.eos import ActionModule as _ActionModule
|
||||
|
||||
|
||||
class ActionModule(_ActionModule):
|
||||
|
||||
def run(self, tmp=None, task_vars=None):
|
||||
|
|
|
@ -23,7 +23,7 @@ from ansible.plugins.action import ActionBase
|
|||
class ActionModule(ActionBase):
|
||||
''' 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
|
||||
|
||||
def run(self, tmp=None, task_vars=None):
|
||||
|
|
|
@ -27,6 +27,7 @@ import urlparse
|
|||
from ansible.module_utils._text import to_text
|
||||
from ansible.plugins.action.ios import ActionModule as _ActionModule
|
||||
|
||||
|
||||
class ActionModule(_ActionModule):
|
||||
|
||||
def run(self, tmp=None, task_vars=None):
|
||||
|
|
|
@ -27,6 +27,7 @@ import urlparse
|
|||
from ansible.module_utils._text import to_text
|
||||
from ansible.plugins.action.iosxr import ActionModule as _ActionModule
|
||||
|
||||
|
||||
class ActionModule(_ActionModule):
|
||||
|
||||
def run(self, tmp=None, task_vars=None):
|
||||
|
@ -100,4 +101,3 @@ class ActionModule(_ActionModule):
|
|||
searchpath.append(os.path.dirname(source))
|
||||
self._templar.environment.loader.searchpath = searchpath
|
||||
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.plugins.action.junos import ActionModule as _ActionModule
|
||||
|
||||
|
||||
class ActionModule(_ActionModule):
|
||||
|
||||
def run(self, tmp=None, task_vars=None):
|
||||
|
|
|
@ -27,6 +27,7 @@ import urlparse
|
|||
from ansible.module_utils._text import to_text
|
||||
from ansible.plugins.action.nxos import ActionModule as _ActionModule
|
||||
|
||||
|
||||
class ActionModule(_ActionModule):
|
||||
|
||||
def run(self, tmp=None, task_vars=None):
|
||||
|
|
|
@ -22,7 +22,6 @@ __metaclass__ = type
|
|||
from ansible.plugins.action import ActionBase
|
||||
from ansible.plugins.action.net_config import ActionModule as NetActionModule
|
||||
|
||||
|
||||
class ActionModule(NetActionModule, ActionBase):
|
||||
pass
|
||||
|
||||
|
||||
|
|
|
@ -48,5 +48,3 @@ class ActionModule(NetActionModule, ActionBase):
|
|||
del result['_backup']
|
||||
|
||||
return result
|
||||
|
||||
|
||||
|
|
|
@ -163,7 +163,6 @@ class ActionModule(ActionBase):
|
|||
else:
|
||||
raise AnsibleError('user requested abort!')
|
||||
|
||||
|
||||
except AnsibleTimeoutExceeded:
|
||||
# this is the exception we expect when the alarm signal
|
||||
# fires, so we simply ignore it to move into the cleanup
|
||||
|
|
|
@ -19,14 +19,14 @@
|
|||
from __future__ import (absolute_import, division, print_function)
|
||||
__metaclass__ = type
|
||||
|
||||
import glob
|
||||
import os
|
||||
import re
|
||||
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._text import to_text
|
||||
from ansible.plugins.action.sros import ActionModule as _ActionModule
|
||||
from ansible.utils.vars import merge_hash
|
||||
|
||||
PRIVATE_KEYS_RE = re.compile('__.+__')
|
||||
|
@ -110,4 +110,3 @@ class ActionModule(_ActionModule):
|
|||
searchpath.append(os.path.dirname(source))
|
||||
self._templar.environment.loader.searchpath = searchpath
|
||||
self._task.args['src'] = self._templar.template(template_data)
|
||||
|
||||
|
|
|
@ -308,8 +308,7 @@ class ActionModule(ActionBase):
|
|||
src = _tmp_args.get('src', None)
|
||||
dest = _tmp_args.get('dest', None)
|
||||
if src is None or dest is None:
|
||||
return dict(failed=True,
|
||||
msg="synchronize requires both src and dest parameters are set")
|
||||
return dict(failed=True, msg="synchronize requires both src and dest parameters are set")
|
||||
|
||||
if not dest_is_local:
|
||||
# Private key handling
|
||||
|
|
|
@ -23,11 +23,12 @@ from ansible import constants as C
|
|||
from ansible.errors import AnsibleError
|
||||
from ansible.module_utils._text import to_bytes, to_native, to_text
|
||||
from ansible.plugins.action import ActionBase
|
||||
from ansible.utils.hashing import checksum_s
|
||||
from ansible.template import generate_ansible_template_vars
|
||||
from ansible.utils.hashing import checksum_s
|
||||
|
||||
boolean = C.mk_boolean
|
||||
|
||||
|
||||
class ActionModule(ActionBase):
|
||||
|
||||
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
|
||||
|
||||
|
||||
class FactCache(MutableMapping):
|
||||
|
||||
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.
|
||||
self._display = display
|
||||
|
||||
|
||||
def __getitem__(self, key):
|
||||
if not self._plugin.contains(key):
|
||||
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
|
||||
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.plugins.cache import BaseFileCacheModule
|
||||
|
||||
|
||||
class CacheModule(BaseFileCacheModule):
|
||||
"""
|
||||
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
|
||||
|
||||
|
||||
class CacheModule(BaseCacheModule):
|
||||
|
||||
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.plugins.cache import BaseFileCacheModule
|
||||
|
||||
|
||||
class CacheModule(BaseFileCacheModule):
|
||||
"""
|
||||
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:
|
||||
raise AnsibleError("The 'redis' python module is required for the redis fact cache, 'pip install redis'")
|
||||
|
||||
|
||||
class CacheModule(BaseCacheModule):
|
||||
"""
|
||||
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.plugins.cache import BaseFileCacheModule
|
||||
|
||||
|
||||
class CacheModule(BaseFileCacheModule):
|
||||
"""
|
||||
A caching module backed by yaml files.
|
||||
|
|
|
@ -213,7 +213,6 @@ class CallbackBase:
|
|||
if remove_key in result:
|
||||
del result[remove_key]
|
||||
|
||||
|
||||
def set_play_context(self, play_context):
|
||||
pass
|
||||
|
||||
|
@ -280,7 +279,7 @@ class CallbackBase:
|
|||
def on_file_diff(self, host, diff):
|
||||
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):
|
||||
self.on_any(args, kwargs)
|
||||
|
||||
|
|
|
@ -21,6 +21,7 @@ __metaclass__ = type
|
|||
|
||||
from ansible.plugins.callback.default import CallbackModule as CallbackModule_default
|
||||
|
||||
|
||||
class CallbackModule(CallbackModule_default):
|
||||
|
||||
CALLBACK_VERSION = 2.0
|
||||
|
@ -76,4 +77,3 @@ class CallbackModule(CallbackModule_default):
|
|||
def v2_runner_item_on_failed(self, result):
|
||||
self.display_task_banner()
|
||||
self.super_ref.v2_runner_item_on_failed(result)
|
||||
|
||||
|
|
|
@ -21,6 +21,7 @@ __metaclass__ = type
|
|||
|
||||
from ansible.plugins.callback import CallbackBase
|
||||
|
||||
|
||||
class CallbackModule(CallbackBase):
|
||||
"""
|
||||
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.utils.color import colorize, hostcolor
|
||||
|
||||
|
||||
class CallbackModule(CallbackBase):
|
||||
|
||||
'''
|
||||
|
@ -100,7 +101,7 @@ class CallbackModule(CallbackBase):
|
|||
self._process_items(result)
|
||||
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),)
|
||||
self._display.display(msg, color=color)
|
||||
|
||||
|
@ -113,7 +114,7 @@ class CallbackModule(CallbackBase):
|
|||
self._process_items(result)
|
||||
else:
|
||||
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)
|
||||
self._display.display(msg, color=C.COLOR_SKIP)
|
||||
|
||||
|
@ -209,7 +210,7 @@ class CallbackModule(CallbackBase):
|
|||
|
||||
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)
|
||||
self._display.display(msg, color=color)
|
||||
|
||||
|
@ -230,7 +231,7 @@ class CallbackModule(CallbackBase):
|
|||
def v2_runner_item_on_skipped(self, result):
|
||||
if C.DISPLAY_SKIPPED_HOSTS:
|
||||
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)
|
||||
self._display.display(msg, color=C.COLOR_SKIP)
|
||||
|
||||
|
@ -298,6 +299,6 @@ class CallbackModule(CallbackBase):
|
|||
def v2_runner_retry(self, result):
|
||||
task_name = result.task_name or result._task
|
||||
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)
|
||||
self._display.display(msg, color=C.COLOR_DEBUG)
|
||||
|
|
|
@ -146,6 +146,7 @@ colors = dict(
|
|||
|
||||
states = ('skipped', 'ok', 'changed', 'failed', 'unreachable')
|
||||
|
||||
|
||||
class CallbackModule_dense(CallbackModule_default):
|
||||
|
||||
'''
|
||||
|
@ -156,7 +157,6 @@ class CallbackModule_dense(CallbackModule_default):
|
|||
CALLBACK_TYPE = 'stdout'
|
||||
CALLBACK_NAME = 'dense'
|
||||
|
||||
|
||||
def __init__(self):
|
||||
|
||||
# From CallbackModule
|
||||
|
|
|
@ -123,11 +123,17 @@ class CallbackModule(CallbackBase):
|
|||
level = 'err'
|
||||
else:
|
||||
level = 'notice' if 'changed' in msg and msg['changed'] else 'info'
|
||||
logs.append({"log": {
|
||||
'sources': {'source': source},
|
||||
'messages': {'message': json.dumps(msg)},
|
||||
logs.append({
|
||||
"log": {
|
||||
'sources': {
|
||||
'source': source
|
||||
},
|
||||
'messages': {
|
||||
'message': json.dumps(msg)
|
||||
},
|
||||
'level': level
|
||||
}})
|
||||
}
|
||||
})
|
||||
return logs
|
||||
|
||||
def send_reports(self, stats):
|
||||
|
|
|
@ -94,4 +94,3 @@ class CallbackModule(CallbackBase):
|
|||
else:
|
||||
out = self.debug
|
||||
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
|
||||
|
||||
|
||||
class CallbackModule(CallbackBase):
|
||||
"""
|
||||
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