mirror of
https://github.com/ansible-collections/community.general.git
synced 2025-07-22 04:40:22 -07:00
Remove Deprecated Template network modules (#27076)
* removed deprecated networking template modules * update changelog * update changelog
This commit is contained in:
parent
0fb64214a4
commit
81151ef02c
86 changed files with 8 additions and 3420 deletions
|
@ -1,232 +0,0 @@
|
|||
#!/usr/bin/python
|
||||
#
|
||||
# This file is part of Ansible
|
||||
#
|
||||
# Ansible is free software: you can redistribute it and/or modify
|
||||
# it under the terms of the GNU General Public License as published by
|
||||
# the Free Software Foundation, either version 3 of the License, or
|
||||
# (at your option) any later version.
|
||||
#
|
||||
# Ansible is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
# GNU General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU General Public License
|
||||
# along with Ansible. If not, see <http://www.gnu.org/licenses/>.
|
||||
#
|
||||
ANSIBLE_METADATA = {'metadata_version': '1.0',
|
||||
'status': ['deprecated'],
|
||||
'supported_by': 'community'}
|
||||
|
||||
|
||||
DOCUMENTATION = """
|
||||
---
|
||||
module: eos_template
|
||||
version_added: "2.1"
|
||||
author: "Peter Sprygada (@privateip)"
|
||||
short_description: Manage Arista EOS device configurations
|
||||
description:
|
||||
- Manages network device configurations over SSH or eos_local. This module
|
||||
allows implementers to work with the device running-config. It
|
||||
provides a way to push a set of commands onto a network device
|
||||
by evaluating the current running-config and only pushing configuration
|
||||
commands that are not already configured. The config source can
|
||||
be a set of commands or a template.
|
||||
extends_documentation_fragment: eos
|
||||
deprecated: Deprecated in 2.2. Use M(eos_config) instead
|
||||
options:
|
||||
src:
|
||||
description:
|
||||
- The path to the config source. The source can be either a
|
||||
file with config or a template that will be merged during
|
||||
runtime. By default the task will search for the source
|
||||
file in role or playbook root folder in templates directory.
|
||||
required: true
|
||||
force:
|
||||
description:
|
||||
- The force argument instructs the module to not consider the
|
||||
current devices running-config. When set to true, this will
|
||||
cause the module to push the contents of I(src) into the device
|
||||
without first checking if already configured.
|
||||
required: false
|
||||
default: false
|
||||
choices: ['yes', 'no']
|
||||
include_defaults:
|
||||
description:
|
||||
- By default when the M(eos_template) connects to the remote
|
||||
device to retrieve the configuration it will issue the C(show
|
||||
running-config) command. If this option is set to True then
|
||||
the issued command will be C(show running-config all).
|
||||
required: false
|
||||
default: false
|
||||
choices: ['yes', 'no']
|
||||
backup:
|
||||
description:
|
||||
- When this argument is configured true, the module will backup
|
||||
the running-config from the node prior to making any changes.
|
||||
The backup file will be written to backup_{{ hostname }} in
|
||||
the root of the playbook directory.
|
||||
required: false
|
||||
default: false
|
||||
choices: ['yes', 'no']
|
||||
replace:
|
||||
description:
|
||||
- This argument will cause the provided configuration to be replaced
|
||||
on the destination node. The use of the replace argument will
|
||||
always cause the task to set changed to true and will implies
|
||||
C(force=true). This argument is only valid with C(transport=eos_local).
|
||||
required: false
|
||||
default: false
|
||||
choices: ['yes', 'no']
|
||||
config:
|
||||
description:
|
||||
- The module, by default, will connect to the remote device and
|
||||
retrieve the current running-config to use as a base for comparing
|
||||
against the contents of source. There are times when it is not
|
||||
desirable to have the task get the current running-config for
|
||||
every task in a playbook. The I(config) argument allows the
|
||||
implementer to pass in the configuration to use as the base
|
||||
config for comparison.
|
||||
required: false
|
||||
default: null
|
||||
"""
|
||||
|
||||
EXAMPLES = """
|
||||
- name: Push a configuration onto the device
|
||||
eos_template:
|
||||
src: config.j2
|
||||
|
||||
- name: Forceable push a configuration onto the device
|
||||
eos_template:
|
||||
src: config.j2
|
||||
force: yes
|
||||
|
||||
- name: Provide the base configuration for comparison
|
||||
eos_template:
|
||||
src: candidate_config.txt
|
||||
config: current_config.txt
|
||||
"""
|
||||
|
||||
RETURN = """
|
||||
updates:
|
||||
description: The set of commands that will be pushed to the remote device
|
||||
returned: always
|
||||
type: list
|
||||
sample: ['...', '...']
|
||||
|
||||
responses:
|
||||
description: The set of responses from issuing the commands on the device
|
||||
returned: when not check_mode
|
||||
type: list
|
||||
sample: ['...', '...']
|
||||
"""
|
||||
import re
|
||||
|
||||
from ansible.module_utils.basic import AnsibleModule
|
||||
from ansible.module_utils.eos import load_config, get_config
|
||||
from ansible.module_utils.eos import eos_argument_spec
|
||||
from ansible.module_utils.eos import check_args as eos_check_args
|
||||
from ansible.module_utils.netcfg import NetworkConfig, dumps
|
||||
|
||||
def check_args(module, warnings):
|
||||
eos_check_args(module, warnings)
|
||||
|
||||
transport = module.params['transport']
|
||||
provider_transport = (module.params['provider'] or {}).get('transport')
|
||||
|
||||
if module.params['replace'] and 'eapi' in (transport, provider_transport):
|
||||
module.fail_json(msg='config replace is only supported over cli')
|
||||
|
||||
def get_current_config(module):
|
||||
config = module.params.get('config')
|
||||
if not config and not module.params['force']:
|
||||
flags = []
|
||||
if module.params['include_defaults']:
|
||||
flags.append('all')
|
||||
config = get_config(module, flags)
|
||||
return config
|
||||
|
||||
def filter_exit(commands):
|
||||
# Filter out configuration mode commands followed immediately by an
|
||||
# exit command indented by one level only, e.g.
|
||||
# - route-map map01 permit 10
|
||||
# - exit
|
||||
#
|
||||
# Build a temporary list as we filter, then copy the temp list
|
||||
# back onto the commands list.
|
||||
temp = []
|
||||
ind_prev = 999
|
||||
count = 0
|
||||
for c in commands:
|
||||
ind_this = c.count(' ')
|
||||
if re.search(r"^\s*exit$", c) and ind_this == ind_prev + 1:
|
||||
temp.pop()
|
||||
count -= 1
|
||||
if count != 0:
|
||||
ind_prev = temp[-1].count(' ')
|
||||
continue
|
||||
temp.append(c)
|
||||
ind_prev = ind_this
|
||||
count += 1
|
||||
return temp
|
||||
|
||||
def main():
|
||||
""" main entry point for module execution
|
||||
"""
|
||||
|
||||
argument_spec = dict(
|
||||
src=dict(required=True),
|
||||
force=dict(default=False, type='bool'),
|
||||
include_defaults=dict(default=False, type='bool'),
|
||||
backup=dict(default=False, type='bool'),
|
||||
replace=dict(default=False, type='bool'),
|
||||
config=dict()
|
||||
)
|
||||
|
||||
argument_spec.update(eos_argument_spec)
|
||||
|
||||
mutually_exclusive = [('config', 'backup'), ('config', 'force')]
|
||||
|
||||
module = AnsibleModule(argument_spec=argument_spec,
|
||||
mutually_exclusive=mutually_exclusive,
|
||||
supports_check_mode=True)
|
||||
|
||||
warnings = list()
|
||||
check_args(module, warnings)
|
||||
|
||||
result = {'changed': False}
|
||||
if warnings:
|
||||
result['warnings'] = warnings
|
||||
|
||||
src = module.params['src']
|
||||
candidate = NetworkConfig(contents=src, indent=3)
|
||||
|
||||
if module.params['backup']:
|
||||
result['__backup__'] = get_config(module)
|
||||
|
||||
if not module.params['force']:
|
||||
contents = get_current_config(module)
|
||||
configobj = NetworkConfig(contents=contents, indent=3)
|
||||
commands = candidate.difference(configobj)
|
||||
commands = dumps(commands, 'commands').split('\n')
|
||||
commands = [str(c).strip() for c in commands if c]
|
||||
else:
|
||||
commands = [c.strip() for c in str(candidate).split('\n')]
|
||||
|
||||
#commands = str(candidate).split('\n')
|
||||
|
||||
if commands:
|
||||
commands = filter_exit(commands)
|
||||
commit = not module.check_mode
|
||||
replace = module.params['replace'] or False
|
||||
load_config(module, commands, commit=commit, replace=replace)
|
||||
result['changed'] = True
|
||||
|
||||
result['commands'] = commands
|
||||
result['updates'] = commands
|
||||
|
||||
module.exit_json(**result)
|
||||
|
||||
if __name__ == '__main__':
|
||||
main()
|
|
@ -1,175 +0,0 @@
|
|||
#!/usr/bin/python
|
||||
#
|
||||
# This file is part of Ansible
|
||||
#
|
||||
# Ansible is free software: you can redistribute it and/or modify
|
||||
# it under the terms of the GNU General Public License as published by
|
||||
# the Free Software Foundation, either version 3 of the License, or
|
||||
# (at your option) any later version.
|
||||
#
|
||||
# Ansible is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
# GNU General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU General Public License
|
||||
# along with Ansible. If not, see <http://www.gnu.org/licenses/>.
|
||||
#
|
||||
ANSIBLE_METADATA = {'metadata_version': '1.0',
|
||||
'status': ['deprecated'],
|
||||
'supported_by': 'community'}
|
||||
|
||||
|
||||
DOCUMENTATION = """
|
||||
---
|
||||
module: ios_template
|
||||
version_added: "2.1"
|
||||
author: "Peter Sprygada (@privateip)"
|
||||
short_description: Manage Cisco IOS device configurations over SSH
|
||||
description:
|
||||
- Manages Cisco IOS network device configurations over SSH. This module
|
||||
allows implementers to work with the device running-config. It
|
||||
provides a way to push a set of commands onto a network device
|
||||
by evaluating the current running-config and only pushing configuration
|
||||
commands that are not already configured. The config source can
|
||||
be a set of commands or a template.
|
||||
deprecated: Deprecated in 2.2. Use M(ios_config) instead.
|
||||
extends_documentation_fragment: ios
|
||||
options:
|
||||
src:
|
||||
description:
|
||||
- The path to the config source. The source can be either a
|
||||
file with config or a template that will be merged during
|
||||
runtime. By default the task will first search for the source
|
||||
file in role or playbook root folder in templates unless a full
|
||||
path to the file is given.
|
||||
required: true
|
||||
force:
|
||||
description:
|
||||
- The force argument instructs the module not to consider the
|
||||
current device running-config. When set to true, this will
|
||||
cause the module to push the contents of I(src) into the device
|
||||
without first checking if already configured.
|
||||
required: false
|
||||
default: false
|
||||
choices: [ "true", "false" ]
|
||||
include_defaults:
|
||||
description:
|
||||
- The module, by default, will collect the current device
|
||||
running-config to use as a base for comparison to the commands
|
||||
in I(src). Setting this value to true will cause the command
|
||||
issued to add any necessary flags to collect all defaults as
|
||||
well as the device configuration. If the destination device
|
||||
does not support such a flag, this argument is silently ignored.
|
||||
required: true
|
||||
choices: [ "true", "false" ]
|
||||
backup:
|
||||
description:
|
||||
- When this argument is configured true, the module will backup
|
||||
the running-config from the node prior to making any changes.
|
||||
The backup file will be written to backup_{{ hostname }} in
|
||||
the root of the playbook directory.
|
||||
required: false
|
||||
default: false
|
||||
choices: [ "true", "false" ]
|
||||
config:
|
||||
description:
|
||||
- The module, by default, will connect to the remote device and
|
||||
retrieve the current running-config to use as a base for comparing
|
||||
against the contents of source. There are times when it is not
|
||||
desirable to have the task get the current running-config for
|
||||
every task. The I(config) argument allows the implementer to
|
||||
pass in the configuration to use as the base config for
|
||||
comparison.
|
||||
required: false
|
||||
default: null
|
||||
"""
|
||||
|
||||
EXAMPLES = """
|
||||
- name: push a configuration onto the device
|
||||
ios_template:
|
||||
src: config.j2
|
||||
|
||||
- name: forceable push a configuration onto the device
|
||||
ios_template:
|
||||
src: config.j2
|
||||
force: yes
|
||||
|
||||
- name: provide the base configuration for comparison
|
||||
ios_template:
|
||||
src: candidate_config.txt
|
||||
config: current_config.txt
|
||||
"""
|
||||
|
||||
RETURN = """
|
||||
updates:
|
||||
description: The set of commands that will be pushed to the remote device
|
||||
returned: always
|
||||
type: list
|
||||
sample: ['...', '...']
|
||||
"""
|
||||
from ansible.module_utils.ios import load_config, get_config
|
||||
from ansible.module_utils.ios import ios_argument_spec, check_args
|
||||
from ansible.module_utils.basic import AnsibleModule
|
||||
from ansible.module_utils.netcli import Conditional
|
||||
from ansible.module_utils.netcfg import NetworkConfig, dumps
|
||||
|
||||
def get_current_config(module):
|
||||
if module.params['config']:
|
||||
return module.params['config']
|
||||
if module.params['include_defaults']:
|
||||
flags = ['all']
|
||||
else:
|
||||
flags = []
|
||||
return get_config(module=module, flags=flags)
|
||||
|
||||
def main():
|
||||
""" main entry point for module execution
|
||||
"""
|
||||
argument_spec = dict(
|
||||
src=dict(),
|
||||
force=dict(default=False, type='bool'),
|
||||
include_defaults=dict(default=True, type='bool'),
|
||||
backup=dict(default=False, type='bool'),
|
||||
config=dict(),
|
||||
)
|
||||
|
||||
argument_spec.update(ios_argument_spec)
|
||||
|
||||
mutually_exclusive = [('config', 'backup'), ('config', 'force')]
|
||||
|
||||
module = AnsibleModule(argument_spec=argument_spec,
|
||||
mutually_exclusive=mutually_exclusive,
|
||||
supports_check_mode=True)
|
||||
|
||||
candidate = NetworkConfig(contents=module.params['src'], indent=1)
|
||||
|
||||
result = {'changed': False}
|
||||
warnings = list()
|
||||
check_args(module, warnings)
|
||||
result['warnings'] = warnings
|
||||
|
||||
if module.params['backup']:
|
||||
result['__backup__'] = get_config(module=module)
|
||||
|
||||
if not module.params['force']:
|
||||
contents = get_current_config(module)
|
||||
configobj = NetworkConfig(contents=contents, indent=1)
|
||||
commands = candidate.difference(configobj)
|
||||
commands = dumps(commands, 'commands').split('\n')
|
||||
commands = [str(c).strip() for c in commands if c]
|
||||
else:
|
||||
commands = [c.strip() for c in str(candidate).split('\n')]
|
||||
|
||||
if commands:
|
||||
if not module.check_mode:
|
||||
load_config(module, commands)
|
||||
result['changed'] = True
|
||||
|
||||
result['updates'] = commands
|
||||
result['commands'] = commands
|
||||
|
||||
module.exit_json(**result)
|
||||
|
||||
if __name__ == '__main__':
|
||||
main()
|
|
@ -1,158 +0,0 @@
|
|||
#!/usr/bin/python
|
||||
#
|
||||
# This file is part of Ansible
|
||||
#
|
||||
# Ansible is free software: you can redistribute it and/or modify
|
||||
# it under the terms of the GNU General Public License as published by
|
||||
# the Free Software Foundation, either version 3 of the License, or
|
||||
# (at your option) any later version.
|
||||
#
|
||||
# Ansible is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
# GNU General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU General Public License
|
||||
# along with Ansible. If not, see <http://www.gnu.org/licenses/>.
|
||||
#
|
||||
ANSIBLE_METADATA = {'metadata_version': '1.0',
|
||||
'status': ['deprecated'],
|
||||
'supported_by': 'community'}
|
||||
|
||||
|
||||
|
||||
DOCUMENTATION = """
|
||||
---
|
||||
module: iosxr_template
|
||||
version_added: "2.1"
|
||||
author: "Ricardo Carrillo Cruz (@rcarrillocruz)"
|
||||
short_description: Manage Cisco IOS XR device configurations over SSH
|
||||
description:
|
||||
- Manages network device configurations over SSH. This module
|
||||
allows implementers to work with the device running-config. It
|
||||
provides a way to push a set of commands onto a network device
|
||||
by evaluating the current running-config and only pushing configuration
|
||||
commands that are not already configured. The config source can
|
||||
be a set of commands or a template.
|
||||
deprecated: Deprecated in 2.2. Use M(iosxr_config) instead.
|
||||
extends_documentation_fragment: iosxr
|
||||
options:
|
||||
src:
|
||||
description:
|
||||
- The path to the config source. The source can be either a
|
||||
file with config or a template that will be merged during
|
||||
runtime. By default the task will first search for the source
|
||||
file in role or playbook root folder in templates unless a full
|
||||
path to the file is given.
|
||||
required: false
|
||||
default: null
|
||||
force:
|
||||
description:
|
||||
- The force argument instructs the module not to consider the
|
||||
current device running-config. When set to true, this will
|
||||
cause the module to push the contents of I(src) into the device
|
||||
without first checking if already configured.
|
||||
required: false
|
||||
default: false
|
||||
choices: [ "true", "false" ]
|
||||
backup:
|
||||
description:
|
||||
- When this argument is configured true, the module will backup
|
||||
the running-config from the node prior to making any changes.
|
||||
The backup file will be written to backup_{{ hostname }} in
|
||||
the root of the playbook directory.
|
||||
required: false
|
||||
default: false
|
||||
choices: [ "true", "false" ]
|
||||
config:
|
||||
description:
|
||||
- The module, by default, will connect to the remote device and
|
||||
retrieve the current running-config to use as a base for comparing
|
||||
against the contents of source. There are times when it is not
|
||||
desirable to have the task get the current running-config for
|
||||
every task. The I(config) argument allows the implementer to
|
||||
pass in the configuration to use as the base config for
|
||||
comparison.
|
||||
required: false
|
||||
default: null
|
||||
"""
|
||||
|
||||
EXAMPLES = """
|
||||
|
||||
- name: push a configuration onto the device
|
||||
iosxr_template:
|
||||
src: config.j2
|
||||
|
||||
- name: forceable push a configuration onto the device
|
||||
iosxr_template:
|
||||
src: config.j2
|
||||
force: yes
|
||||
|
||||
- name: provide the base configuration for comparison
|
||||
iosxr_template:
|
||||
src: candidate_config.txt
|
||||
config: current_config.txt
|
||||
"""
|
||||
|
||||
RETURN = """
|
||||
updates:
|
||||
description: The set of commands that will be pushed to the remote device
|
||||
returned: always
|
||||
type: list
|
||||
sample: ['...', '...']
|
||||
"""
|
||||
from ansible.module_utils.basic import AnsibleModule
|
||||
from ansible.module_utils.netcfg import NetworkConfig, dumps
|
||||
from ansible.module_utils.iosxr import get_config, load_config
|
||||
from ansible.module_utils.iosxr import iosxr_argument_spec, check_args
|
||||
|
||||
|
||||
def main():
|
||||
""" main entry point for module execution
|
||||
"""
|
||||
|
||||
argument_spec = dict(
|
||||
src=dict(),
|
||||
force=dict(default=False, type='bool'),
|
||||
backup=dict(default=False, type='bool'),
|
||||
config=dict(),
|
||||
)
|
||||
|
||||
argument_spec.update(iosxr_argument_spec)
|
||||
|
||||
mutually_exclusive = [('config', 'backup'), ('config', 'force')]
|
||||
|
||||
module = AnsibleModule(argument_spec=argument_spec,
|
||||
mutually_exclusive=mutually_exclusive,
|
||||
supports_check_mode=True)
|
||||
|
||||
warnings = list()
|
||||
check_args(module, warnings)
|
||||
|
||||
result = dict(changed=False, warnings=warnings)
|
||||
|
||||
candidate = NetworkConfig(contents=module.params['src'], indent=1)
|
||||
|
||||
if module.params['backup']:
|
||||
result['__backup__'] = get_config(module)
|
||||
|
||||
if not module.params['force']:
|
||||
contents = get_config(module)
|
||||
configobj = NetworkConfig(contents=contents, indent=1)
|
||||
commands = candidate.difference(configobj)
|
||||
commands = dumps(commands, 'commands').split('\n')
|
||||
commands = [str(c).strip() for c in commands if c]
|
||||
else:
|
||||
commands = [c.strip() for c in str(candidate).split('\n')]
|
||||
|
||||
if commands:
|
||||
load_config(module, commands, result['warnings'], not module.check_mode)
|
||||
result['changed'] = not module.check_mode
|
||||
|
||||
result['updates'] = commands
|
||||
result['commands'] = commands
|
||||
module.exit_json(**result)
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
main()
|
|
@ -1,173 +0,0 @@
|
|||
#!/usr/bin/python
|
||||
#
|
||||
# This file is part of Ansible
|
||||
#
|
||||
# Ansible is free software: you can redistribute it and/or modify
|
||||
# it under the terms of the GNU General Public License as published by
|
||||
# the Free Software Foundation, either version 3 of the License, or
|
||||
# (at your option) any later version.
|
||||
#
|
||||
# Ansible is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
# GNU General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU General Public License
|
||||
# along with Ansible. If not, see <http://www.gnu.org/licenses/>.
|
||||
#
|
||||
|
||||
ANSIBLE_METADATA = {'metadata_version': '1.0',
|
||||
'status': ['deprecated'],
|
||||
'supported_by': 'community'}
|
||||
|
||||
|
||||
DOCUMENTATION = """
|
||||
---
|
||||
module: junos_template
|
||||
version_added: "2.1"
|
||||
author: "Peter Sprygada (@privateip)"
|
||||
short_description: Manage configuration on remote devices running Juniper JUNOS
|
||||
description:
|
||||
- This module will load a candidate configuration
|
||||
from a template file onto a remote device running Junos. The
|
||||
module will return the differences in configuration if the diff
|
||||
option is specified on the Ansible command line
|
||||
deprecated: Deprecated in 2.2. Use M(junos_config) instead.
|
||||
extends_documentation_fragment: junos
|
||||
options:
|
||||
src:
|
||||
description:
|
||||
- The path to the config source. The source can be either a
|
||||
file with config or a template that will be merged during
|
||||
runtime. By default the task will search for the source
|
||||
file in role or playbook root folder in templates directory.
|
||||
required: true
|
||||
default: null
|
||||
backup:
|
||||
description:
|
||||
- When this argument is configured true, the module will backup
|
||||
the configuration from the node prior to making any changes.
|
||||
The backup file will be written to backup_{{ hostname }} in
|
||||
the root of the playbook directory.
|
||||
required: false
|
||||
default: false
|
||||
choices: ["true", "false"]
|
||||
confirm:
|
||||
description:
|
||||
- The C(confirm) argument will configure a time out value for
|
||||
the commit to be confirmed before it is automatically
|
||||
rolled back. If the C(confirm) argument is set to False, this
|
||||
argument is silently ignored. If the value for this argument
|
||||
is set to 0, the commit is confirmed immediately.
|
||||
required: false
|
||||
default: 0
|
||||
comment:
|
||||
description:
|
||||
- The C(comment) argument specifies a text string to be used
|
||||
when committing the configuration. If the C(confirm) argument
|
||||
is set to False, this argument is silently ignored.
|
||||
required: false
|
||||
default: configured by junos_template
|
||||
action:
|
||||
description:
|
||||
- The C(action) argument specifies how the module will apply changes.
|
||||
required: false
|
||||
default: merge
|
||||
choices: ['merge', 'overwrite', 'replace']
|
||||
version_added: "2.2"
|
||||
config_format:
|
||||
description:
|
||||
- The C(format) argument specifies the format of the configuration
|
||||
template specified in C(src). If the format argument is not
|
||||
specified, the module will attempt to infer the configuration
|
||||
format based of file extension. Files that end in I(xml) will set
|
||||
the format to xml. Files that end in I(set) will set the format
|
||||
to set and all other files will default the format to text.
|
||||
required: false
|
||||
default: null
|
||||
choices: ['text', 'xml', 'set']
|
||||
requirements:
|
||||
- ncclient (>=v0.5.2)
|
||||
notes:
|
||||
- This module requires the netconf system service be enabled on
|
||||
the remote device being managed
|
||||
"""
|
||||
|
||||
EXAMPLES = """
|
||||
- junos_template:
|
||||
src: config.j2
|
||||
comment: update system config
|
||||
|
||||
- name: replace config hierarchy
|
||||
junos_template:
|
||||
src: config.j2
|
||||
action: replace
|
||||
|
||||
- name: overwrite the config
|
||||
junos_template:
|
||||
src: config.j2
|
||||
action: overwrite
|
||||
"""
|
||||
|
||||
from ansible.module_utils.basic import AnsibleModule
|
||||
from ansible.module_utils.junos import check_args, junos_argument_spec
|
||||
from ansible.module_utils.junos import get_configuration, load_config
|
||||
from ansible.module_utils.junos import commit_configuration, discard_changes, locked_config
|
||||
|
||||
USE_PERSISTENT_CONNECTION = True
|
||||
DEFAULT_COMMENT = 'configured by junos_template'
|
||||
|
||||
|
||||
def main():
|
||||
|
||||
argument_spec = dict(
|
||||
src=dict(required=True, type='path'),
|
||||
confirm=dict(default=0, type='int'),
|
||||
comment=dict(default=DEFAULT_COMMENT),
|
||||
action=dict(default='merge', choices=['merge', 'overwrite', 'replace']),
|
||||
config_format=dict(choices=['text', 'set', 'xml'], default='text'),
|
||||
backup=dict(default=False, type='bool'),
|
||||
)
|
||||
|
||||
argument_spec.update(junos_argument_spec)
|
||||
|
||||
module = AnsibleModule(argument_spec=argument_spec,
|
||||
supports_check_mode=True)
|
||||
|
||||
warnings = list()
|
||||
check_args(module, warnings)
|
||||
|
||||
result = {'changed': False, 'warnings': warnings}
|
||||
|
||||
commit = not module.check_mode
|
||||
action = module.params['action']
|
||||
src = module.params['src']
|
||||
fmt = module.params['config_format']
|
||||
|
||||
if action == 'overwrite' and fmt == 'set':
|
||||
module.fail_json(msg="overwrite cannot be used when format is set per junos-pyez documentation")
|
||||
|
||||
if module.params['backup']:
|
||||
reply = get_configuration(module, format='set')
|
||||
match = reply.find('.//configuration-set')
|
||||
if match is None:
|
||||
module.fail_json(msg='unable to retrieve device configuration')
|
||||
result['__backup__'] = str(match.text).strip()
|
||||
|
||||
with locked_config(module):
|
||||
diff = load_config(module, src, warnings, action=action, format=fmt)
|
||||
if diff:
|
||||
if commit:
|
||||
commit_configuration(module)
|
||||
else:
|
||||
discard_changes(module)
|
||||
result['changed'] = True
|
||||
|
||||
if module._diff:
|
||||
result['diff'] = {'prepared': diff}
|
||||
|
||||
module.exit_json(**result)
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
main()
|
|
@ -1,178 +0,0 @@
|
|||
#!/usr/bin/python
|
||||
#
|
||||
# This file is part of Ansible
|
||||
#
|
||||
# Ansible is free software: you can redistribute it and/or modify
|
||||
# it under the terms of the GNU General Public License as published by
|
||||
# the Free Software Foundation, either version 3 of the License, or
|
||||
# (at your option) any later version.
|
||||
#
|
||||
# Ansible is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
# GNU General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU General Public License
|
||||
# along with Ansible. If not, see <http://www.gnu.org/licenses/>.
|
||||
#
|
||||
|
||||
ANSIBLE_METADATA = {'metadata_version': '1.0',
|
||||
'status': ['deprecated'],
|
||||
'supported_by': 'community'}
|
||||
|
||||
|
||||
DOCUMENTATION = """
|
||||
---
|
||||
module: nxos_template
|
||||
version_added: "2.1"
|
||||
author: "Peter Sprygada (@privateip)"
|
||||
short_description: Manage Cisco NXOS device configurations
|
||||
description:
|
||||
- Manages network device configurations over SSH or NXAPI. This module
|
||||
allows implementers to work with the device running-config. It
|
||||
provides a way to push a set of commands onto a network device
|
||||
by evaluating the current running-config and only pushing configuration
|
||||
commands that are not already configured. The config source can
|
||||
be a set of commands or a template.
|
||||
deprecated: Deprecated in 2.2. Use M(nxos_config) instead.
|
||||
options:
|
||||
src:
|
||||
description:
|
||||
- The path to the config source. The source can be either a
|
||||
file with config or a template that will be merged during
|
||||
runtime. By default the task will search for the source
|
||||
file in role or playbook root folder in templates directory.
|
||||
required: false
|
||||
default: null
|
||||
force:
|
||||
description:
|
||||
- The force argument instructs the module to not consider the
|
||||
current devices running-config. When set to true, this will
|
||||
cause the module to push the contents of I(src) into the device
|
||||
without first checking if already configured.
|
||||
required: false
|
||||
default: false
|
||||
choices: [ "true", "false" ]
|
||||
include_defaults:
|
||||
description:
|
||||
- The module, by default, will collect the current device
|
||||
running-config to use as a base for comparisons to the commands
|
||||
in I(src). Setting this value to true will cause the module
|
||||
to issue the command C(show running-config all) to include all
|
||||
device settings.
|
||||
required: false
|
||||
default: false
|
||||
choices: [ "true", "false" ]
|
||||
backup:
|
||||
description:
|
||||
- When this argument is configured true, the module will backup
|
||||
the running-config from the node prior to making any changes.
|
||||
The backup file will be written to backup_{{ hostname }} in
|
||||
the root of the playbook directory.
|
||||
required: false
|
||||
default: false
|
||||
choices: [ "true", "false" ]
|
||||
config:
|
||||
description:
|
||||
- The module, by default, will connect to the remote device and
|
||||
retrieve the current running-config to use as a base for comparing
|
||||
against the contents of source. There are times when it is not
|
||||
desirable to have the task get the current running-config for
|
||||
every task in a playbook. The I(config) argument allows the
|
||||
implementer to pass in the configuration to use as the base
|
||||
config for comparison.
|
||||
required: false
|
||||
default: null
|
||||
"""
|
||||
|
||||
EXAMPLES = """
|
||||
- name: push a configuration onto the device
|
||||
nxos_template:
|
||||
src: config.j2
|
||||
|
||||
- name: forceable push a configuration onto the device
|
||||
nxos_template:
|
||||
src: config.j2
|
||||
force: yes
|
||||
|
||||
- name: provide the base configuration for comparison
|
||||
nxos_template:
|
||||
src: candidate_config.txt
|
||||
config: current_config.txt
|
||||
"""
|
||||
|
||||
RETURN = """
|
||||
updates:
|
||||
description: The set of commands that will be pushed to the remote device
|
||||
returned: always
|
||||
type: list
|
||||
sample: ['...', '...']
|
||||
|
||||
responses:
|
||||
description: The set of responses from issuing the commands on the device
|
||||
returned: when not check_mode
|
||||
type: list
|
||||
sample: ['...', '...']
|
||||
"""
|
||||
from ansible.module_utils.nxos import load_config, get_config
|
||||
from ansible.module_utils.nxos import nxos_argument_spec
|
||||
from ansible.module_utils.basic import AnsibleModule
|
||||
from ansible.module_utils.netcfg import NetworkConfig, dumps
|
||||
|
||||
def get_current_config(module):
|
||||
config = module.params.get('config')
|
||||
if not config and not module.params['force']:
|
||||
flags = []
|
||||
if module.params['include_defaults']:
|
||||
flags.append('all')
|
||||
config = get_config(module, flags)
|
||||
return config
|
||||
|
||||
def main():
|
||||
""" main entry point for module execution
|
||||
"""
|
||||
argument_spec = dict(
|
||||
src=dict(),
|
||||
force=dict(default=False, type='bool'),
|
||||
include_defaults=dict(default=True, type='bool'),
|
||||
backup=dict(default=False, type='bool'),
|
||||
config=dict(),
|
||||
)
|
||||
|
||||
argument_spec.update(nxos_argument_spec)
|
||||
|
||||
mutually_exclusive = [('config', 'backup'), ('config', 'force')]
|
||||
|
||||
module = AnsibleModule(argument_spec=argument_spec,
|
||||
mutually_exclusive=mutually_exclusive,
|
||||
supports_check_mode=True)
|
||||
|
||||
result = dict(changed=False)
|
||||
|
||||
candidate = NetworkConfig(contents=module.params['src'], indent=2)
|
||||
|
||||
contents = get_current_config(module)
|
||||
if contents:
|
||||
config = NetworkConfig(contents=contents, indent=2)
|
||||
result['__backup__'] = str(contents)
|
||||
|
||||
if not module.params['force']:
|
||||
commands = candidate.difference(config)
|
||||
commands = dumps(commands, 'commands').split('\n')
|
||||
commands = [str(c) for c in commands if c]
|
||||
else:
|
||||
commands = str(candidate).split('\n')
|
||||
|
||||
if commands:
|
||||
if not module.check_mode:
|
||||
load_config(module, commands)
|
||||
result['changed'] = True
|
||||
|
||||
result['updates'] = commands
|
||||
result['commands'] = commands
|
||||
|
||||
module.exit_json(**result)
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
main()
|
|
@ -1,227 +0,0 @@
|
|||
#!/usr/bin/python
|
||||
#
|
||||
# This file is part of Ansible
|
||||
#
|
||||
# Ansible is free software: you can redistribute it and/or modify
|
||||
# it under the terms of the GNU General Public License as published by
|
||||
# the Free Software Foundation, either version 3 of the License, or
|
||||
# (at your option) any later version.
|
||||
#
|
||||
# Ansible is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
# GNU General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU General Public License
|
||||
# along with Ansible. If not, see <http://www.gnu.org/licenses/>.
|
||||
#
|
||||
ANSIBLE_METADATA = {'metadata_version': '1.0',
|
||||
'status': ['deprecated'],
|
||||
'supported_by': 'community'}
|
||||
|
||||
|
||||
|
||||
DOCUMENTATION = """
|
||||
---
|
||||
module: ops_template
|
||||
version_added: "2.1"
|
||||
author: "Peter Sprygada (@privateip)"
|
||||
short_description: Push configuration to OpenSwitch
|
||||
description:
|
||||
- The OpenSwitch platform provides a library for pushing JSON structured
|
||||
configuration files into the current running-config. This module
|
||||
will read the current configuration from OpenSwitch and compare it
|
||||
against a provided candidate configuration. If there are changes, the
|
||||
candidate configuration is merged with the current configuration and
|
||||
pushed into OpenSwitch
|
||||
deprecated: Deprecated in 2.2. Use M(ops_config) instead.
|
||||
extends_documentation_fragment: openswitch
|
||||
options:
|
||||
src:
|
||||
description:
|
||||
- The path to the config source. The source can be either a
|
||||
file with config or a template that will be merged during
|
||||
runtime. By default the task will search for the source
|
||||
file in role or playbook root folder in templates directory.
|
||||
required: true
|
||||
force:
|
||||
description:
|
||||
- The force argument instructs the module to not consider the
|
||||
current devices running-config. When set to true, this will
|
||||
cause the module to push the contents of I(src) into the device
|
||||
without first checking if already configured.
|
||||
required: false
|
||||
default: false
|
||||
choices: ['yes', 'no']
|
||||
backup:
|
||||
description:
|
||||
- When this argument is configured true, the module will backup
|
||||
the running-config from the node prior to making any changes.
|
||||
The backup file will be written to backups/ in
|
||||
the root of the playbook directory.
|
||||
required: false
|
||||
default: false
|
||||
choices: ['yes', 'no']
|
||||
config:
|
||||
description:
|
||||
- The module, by default, will connect to the remote device and
|
||||
retrieve the current running-config to use as a base for comparing
|
||||
against the contents of source. There are times when it is not
|
||||
desirable to have the task get the current running-config for
|
||||
every task in a playbook. The I(config) argument allows the
|
||||
implementer to pass in the configuration to use as the base
|
||||
config for comparison.
|
||||
required: false
|
||||
default: null
|
||||
"""
|
||||
|
||||
EXAMPLES = """
|
||||
- name: set hostname with file lookup
|
||||
ops_template:
|
||||
src: ./hostname.json
|
||||
backup: yes
|
||||
remote_user: admin
|
||||
become: yes
|
||||
|
||||
- name: set hostname with var
|
||||
ops_template:
|
||||
src: "{{ config }}"
|
||||
remote_user: admin
|
||||
become: yes
|
||||
"""
|
||||
|
||||
RETURN = """
|
||||
updates:
|
||||
description: The list of configuration updates to be merged
|
||||
returned: always
|
||||
type: dict
|
||||
sample: {obj, obj}
|
||||
responses:
|
||||
description: returns the responses when configuring using cli
|
||||
returned: when transport == cli
|
||||
type: list
|
||||
sample: [...]
|
||||
"""
|
||||
|
||||
import ansible.module_utils.openswitch
|
||||
from ansible.module_utils.netcfg import NetworkConfig, dumps
|
||||
from ansible.module_utils.network import NetworkModule
|
||||
from ansible.module_utils.openswitch import HAS_OPS
|
||||
|
||||
|
||||
def get_config(module):
|
||||
config = module.params['config'] or dict()
|
||||
if not config and not module.params['force']:
|
||||
config = module.config.get_config()
|
||||
return config
|
||||
|
||||
|
||||
def sort(val):
|
||||
if isinstance(val, (list, set)):
|
||||
return sorted(val)
|
||||
return val
|
||||
|
||||
|
||||
def diff(this, other, path=None):
|
||||
updates = list()
|
||||
path = path or list()
|
||||
for key, value in this.items():
|
||||
if key not in other:
|
||||
other_value = other.get(key)
|
||||
updates.append((list(path), key, value, other_value))
|
||||
else:
|
||||
if isinstance(this[key], dict):
|
||||
path.append(key)
|
||||
updates.extend(diff(this[key], other[key], list(path)))
|
||||
path.pop()
|
||||
else:
|
||||
other_value = other.get(key)
|
||||
if sort(this[key]) != sort(other_value):
|
||||
updates.append((list(path), key, value, other_value))
|
||||
return updates
|
||||
|
||||
|
||||
def merge(changeset, config=None):
|
||||
config = config or dict()
|
||||
for path, key, value, _ in changeset:
|
||||
current_level = config
|
||||
for part in path:
|
||||
if part not in current_level:
|
||||
current_level[part] = dict()
|
||||
current_level = current_level[part]
|
||||
current_level[key] = value
|
||||
return config
|
||||
|
||||
def main():
|
||||
""" main entry point for module execution
|
||||
"""
|
||||
|
||||
argument_spec = dict(
|
||||
src=dict(type='str'),
|
||||
force=dict(default=False, type='bool'),
|
||||
backup=dict(default=False, type='bool'),
|
||||
config=dict(type='dict'),
|
||||
)
|
||||
|
||||
mutually_exclusive = [('config', 'backup'), ('config', 'force')]
|
||||
|
||||
module = NetworkModule(argument_spec=argument_spec,
|
||||
mutually_exclusive=mutually_exclusive,
|
||||
supports_check_mode=True)
|
||||
|
||||
if not module.params['transport'] and not HAS_OPS:
|
||||
module.fail_json(msg='unable to import ops.dc library')
|
||||
|
||||
result = dict(changed=False)
|
||||
|
||||
contents = get_config(module)
|
||||
result['_backup'] = contents
|
||||
|
||||
if module.params['transport'] in ['ssh', 'rest']:
|
||||
config = contents
|
||||
|
||||
try:
|
||||
src = module.from_json(module.params['src'])
|
||||
except ValueError:
|
||||
module.fail_json(msg='unable to load src due to json parsing error')
|
||||
|
||||
changeset = diff(src, config)
|
||||
candidate = merge(changeset, config)
|
||||
|
||||
updates = dict()
|
||||
for path, key, new_value, old_value in changeset:
|
||||
path = '%s.%s' % ('.'.join(path), key)
|
||||
updates[path] = str(new_value)
|
||||
result['updates'] = updates
|
||||
|
||||
if changeset:
|
||||
if not module.check_mode:
|
||||
module.config(config)
|
||||
result['changed'] = True
|
||||
|
||||
else:
|
||||
candidate = NetworkConfig(contents=module.params['src'], indent=4)
|
||||
|
||||
if contents:
|
||||
config = NetworkConfig(contents=contents, indent=4)
|
||||
|
||||
if not module.params['force']:
|
||||
commands = candidate.difference(config)
|
||||
commands = dumps(commands, 'commands').split('\n')
|
||||
commands = [str(c) for c in commands if c]
|
||||
else:
|
||||
commands = str(candidate).split('\n')
|
||||
|
||||
if commands:
|
||||
if not module.check_mode:
|
||||
response = module.config(commands)
|
||||
result['responses'] = response
|
||||
result['changed'] = True
|
||||
|
||||
result['updates'] = commands
|
||||
|
||||
module.exit_json(**result)
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
main()
|
Loading…
Add table
Add a link
Reference in a new issue