add local directory option to nxos_file_copy (#43277)
* add local directory option to file_copy pull * shippable fix
This commit is contained in:
parent
7ea909418e
commit
e393d5d2b4
2 changed files with 34 additions and 7 deletions
|
@ -85,6 +85,13 @@ options:
|
||||||
type: bool
|
type: bool
|
||||||
default: False
|
default: False
|
||||||
version_added: "2.7"
|
version_added: "2.7"
|
||||||
|
local_file_directory:
|
||||||
|
description:
|
||||||
|
- When (file_pull is True) file is copied from a remote SCP server to the NXOS device,
|
||||||
|
and written to this directory on the NXOS device. If the directory does not exist, it
|
||||||
|
will be created under the file_system. This is an optional parameter.
|
||||||
|
- When (file_pull is False), this not used.
|
||||||
|
version_added: "2.7"
|
||||||
file_pull_timeout:
|
file_pull_timeout:
|
||||||
description:
|
description:
|
||||||
- Use this parameter to set timeout in seconds, when transferring
|
- Use this parameter to set timeout in seconds, when transferring
|
||||||
|
@ -121,6 +128,7 @@ EXAMPLES = '''
|
||||||
nxos_file_copy:
|
nxos_file_copy:
|
||||||
file_pull: True
|
file_pull: True
|
||||||
local_file: "xyz"
|
local_file: "xyz"
|
||||||
|
local_filr_directory: "dir1/dir2/dir3"
|
||||||
remote_file: "/mydir/abc"
|
remote_file: "/mydir/abc"
|
||||||
remote_scp_server: "192.168.0.1"
|
remote_scp_server: "192.168.0.1"
|
||||||
remote_scp_server_user: "myUser"
|
remote_scp_server_user: "myUser"
|
||||||
|
@ -276,7 +284,7 @@ def transfer_file_to_device(module, dest):
|
||||||
return True
|
return True
|
||||||
|
|
||||||
|
|
||||||
def copy_file_from_remote(module, local, file_system='bootflash:'):
|
def copy_file_from_remote(module, local, local_file_directory, file_system='bootflash:'):
|
||||||
hostname = module.params['host']
|
hostname = module.params['host']
|
||||||
username = module.params['username']
|
username = module.params['username']
|
||||||
password = module.params['password']
|
password = module.params['password']
|
||||||
|
@ -291,9 +299,18 @@ def copy_file_from_remote(module, local, file_system='bootflash:'):
|
||||||
child.expect('(?i)Password')
|
child.expect('(?i)Password')
|
||||||
child.sendline(password)
|
child.sendline(password)
|
||||||
child.expect('#')
|
child.expect('#')
|
||||||
|
ldir = '/'
|
||||||
|
if local_file_directory:
|
||||||
|
dir_array = local_file_directory.split('/')
|
||||||
|
for each in dir_array:
|
||||||
|
if each:
|
||||||
|
child.sendline('mkdir ' + ldir + each)
|
||||||
|
child.expect('#')
|
||||||
|
ldir += each + '/'
|
||||||
|
|
||||||
command = ('copy scp://' + module.params['remote_scp_server_user'] +
|
command = ('copy scp://' + module.params['remote_scp_server_user'] +
|
||||||
'@' + module.params['remote_scp_server'] + module.params['remote_file'] +
|
'@' + module.params['remote_scp_server'] + module.params['remote_file'] +
|
||||||
' ' + file_system + local + ' vrf management')
|
' ' + file_system + ldir + local + ' vrf management')
|
||||||
|
|
||||||
child.sendline(command)
|
child.sendline(command)
|
||||||
# response could be remote host connection time out,
|
# response could be remote host connection time out,
|
||||||
|
@ -316,14 +333,18 @@ def copy_file_from_remote(module, local, file_system='bootflash:'):
|
||||||
fpt = module.params['file_pull_timeout']
|
fpt = module.params['file_pull_timeout']
|
||||||
# response could be that there is no space left on device,
|
# response could be that there is no space left on device,
|
||||||
# permission denied due to wrong user/password,
|
# permission denied due to wrong user/password,
|
||||||
# remote file non-existent or success
|
# remote file non-existent or success,
|
||||||
index = child.expect(['No space', 'Permission denied', 'No such file', '#'], timeout=fpt)
|
# timeout due to large file transfer or network too slow,
|
||||||
|
# success
|
||||||
|
index = child.expect(['No space', 'Permission denied', 'No such file', pexpect.TIMEOUT, '#'], timeout=fpt)
|
||||||
if index == 0:
|
if index == 0:
|
||||||
module.fail_json(msg='File copy failed due to no space left on the device')
|
module.fail_json(msg='File copy failed due to no space left on the device')
|
||||||
elif index == 1:
|
elif index == 1:
|
||||||
module.fail_json(msg='Username/Password for remote scp server is wrong')
|
module.fail_json(msg='Username/Password for remote scp server is wrong')
|
||||||
elif index == 2:
|
elif index == 2:
|
||||||
module.fail_json(msg='File copy failed due to remote file not present')
|
module.fail_json(msg='File copy failed due to remote file not present')
|
||||||
|
elif index == 3:
|
||||||
|
module.fail_json(msg='Timeout occured, please increase "file_pull_timeout" and try again!')
|
||||||
except pexpect.ExceptionPexpect as e:
|
except pexpect.ExceptionPexpect as e:
|
||||||
module.fail_json(msg='%s' % to_native(e), exception=traceback.format_exc())
|
module.fail_json(msg='%s' % to_native(e), exception=traceback.format_exc())
|
||||||
|
|
||||||
|
@ -338,6 +359,7 @@ def main():
|
||||||
connect_ssh_port=dict(required=False, type='int', default=22),
|
connect_ssh_port=dict(required=False, type='int', default=22),
|
||||||
file_pull=dict(type='bool', default=False),
|
file_pull=dict(type='bool', default=False),
|
||||||
file_pull_timeout=dict(type='int', default=300),
|
file_pull_timeout=dict(type='int', default=300),
|
||||||
|
local_file_directory=dict(required=False, type='str'),
|
||||||
remote_scp_server=dict(type='str'),
|
remote_scp_server=dict(type='str'),
|
||||||
remote_scp_server_user=dict(type='str'),
|
remote_scp_server_user=dict(type='str'),
|
||||||
remote_scp_server_password=dict(no_log=True),
|
remote_scp_server_password=dict(no_log=True),
|
||||||
|
@ -384,6 +406,7 @@ def main():
|
||||||
local_file = module.params['local_file']
|
local_file = module.params['local_file']
|
||||||
remote_file = module.params['remote_file']
|
remote_file = module.params['remote_file']
|
||||||
file_system = module.params['file_system']
|
file_system = module.params['file_system']
|
||||||
|
local_file_directory = module.params['local_file_directory']
|
||||||
|
|
||||||
results['transfer_status'] = 'No Transfer'
|
results['transfer_status'] = 'No Transfer'
|
||||||
results['file_system'] = file_system
|
results['file_system'] = file_system
|
||||||
|
@ -393,7 +416,7 @@ def main():
|
||||||
local = local_file or src
|
local = local_file or src
|
||||||
|
|
||||||
if not module.check_mode:
|
if not module.check_mode:
|
||||||
copy_file_from_remote(module, local, file_system=file_system)
|
copy_file_from_remote(module, local, local_file_directory, file_system=file_system)
|
||||||
results['transfer_status'] = 'Received'
|
results['transfer_status'] = 'Received'
|
||||||
|
|
||||||
results['changed'] = True
|
results['changed'] = True
|
||||||
|
|
|
@ -6,7 +6,10 @@
|
||||||
commands:
|
commands:
|
||||||
- terminal dont-ask
|
- terminal dont-ask
|
||||||
- delete network-integration.cfg
|
- delete network-integration.cfg
|
||||||
- delete network-integration_copy.cfg
|
- delete bootflash:/dir1/dir2/dir3/network-integration_copy.cfg
|
||||||
|
- rmdir dir1/dir2/dir3
|
||||||
|
- rmdir dir1/dir2
|
||||||
|
- rmdir dir1
|
||||||
ignore_errors: yes
|
ignore_errors: yes
|
||||||
|
|
||||||
- name: "Setup - Turn on feature scp-server"
|
- name: "Setup - Turn on feature scp-server"
|
||||||
|
@ -58,8 +61,9 @@
|
||||||
nxos_file_copy: ©_pull
|
nxos_file_copy: ©_pull
|
||||||
file_pull: True
|
file_pull: True
|
||||||
file_pull_timeout: 1200
|
file_pull_timeout: 1200
|
||||||
local_file: "network-integration_copy.cfg"
|
|
||||||
remote_file: "/network-integration.cfg"
|
remote_file: "/network-integration.cfg"
|
||||||
|
local_file: "network-integration_copy.cfg"
|
||||||
|
local_file_directory: "dir1/dir2/dir3"
|
||||||
remote_scp_server: "{{ inventory_hostname_short }}"
|
remote_scp_server: "{{ inventory_hostname_short }}"
|
||||||
remote_scp_server_user: "{{ ansible_ssh_user }}"
|
remote_scp_server_user: "{{ ansible_ssh_user }}"
|
||||||
remote_scp_server_password: "{{ ansible_ssh_pass }}"
|
remote_scp_server_password: "{{ ansible_ssh_pass }}"
|
||||||
|
|
Loading…
Reference in a new issue