diff --git a/lib/ansible/module_utils/network/common/utils.py b/lib/ansible/module_utils/network/common/utils.py index 76275b26186..03f978e3053 100644 --- a/lib/ansible/module_utils/network/common/utils.py +++ b/lib/ansible/module_utils/network/common/utils.py @@ -80,6 +80,7 @@ def transform_commands(module): output=dict(), prompt=dict(type='list'), answer=dict(type='list'), + newline=dict(type='bool', default=True), sendonly=dict(type='bool', default=False), check_all=dict(type='bool', default=False), ), module) diff --git a/lib/ansible/modules/network/cli/cli_command.py b/lib/ansible/modules/network/cli/cli_command.py index 9354cb0c4d3..9eecf54cef2 100644 --- a/lib/ansible/modules/network/cli/cli_command.py +++ b/lib/ansible/modules/network/cli/cli_command.py @@ -46,6 +46,14 @@ options: type: bool default: false required: false + newline: + description: + - The boolean value, that when set to false will send I(answer) to the + device without a trailing newline. + type: bool + default: true + required: false + version_added: 2.9 check_all: description: - By default if any one of the prompts mentioned in C(prompt) option is matched it won't check @@ -71,6 +79,13 @@ EXAMPLES = """ prompt: This commit will replace or remove the entire running configuration answer: yes +- name: run command expecting user confirmation + cli_command: + command: show interface summary + prompt: Press any key to continue + answer: y + newline: false + - name: run config mode command and handle prompt/answer cli_command: command: "{{ item }}" @@ -129,6 +144,7 @@ def main(): command=dict(type='str', required=True), prompt=dict(type='list', required=False), answer=dict(type='list', required=False), + newline=dict(type='bool', default=True, required=False), sendonly=dict(type='bool', default=False, required=False), check_all=dict(type='bool', default=False, required=False), ) diff --git a/lib/ansible/plugins/cliconf/aireos.py b/lib/ansible/plugins/cliconf/aireos.py index 453683f4492..8e84da26e7c 100644 --- a/lib/ansible/plugins/cliconf/aireos.py +++ b/lib/ansible/plugins/cliconf/aireos.py @@ -79,8 +79,8 @@ class Cliconf(CliconfBase): for cmd in chain(['config'], to_list(command), ['end']): self.send_command(cmd) - def get(self, command, prompt=None, answer=None, sendonly=False, check_all=False): - return self.send_command(command=command, prompt=prompt, answer=answer, sendonly=sendonly, check_all=check_all) + def get(self, command, prompt=None, answer=None, sendonly=False, newline=True, check_all=False): + return self.send_command(command=command, prompt=prompt, answer=answer, sendonly=sendonly, newline=newline, check_all=check_all) def get_capabilities(self): result = super(Cliconf, self).get_capabilities() diff --git a/lib/ansible/plugins/cliconf/aruba.py b/lib/ansible/plugins/cliconf/aruba.py index e8e0674336e..cb5c4219ac0 100644 --- a/lib/ansible/plugins/cliconf/aruba.py +++ b/lib/ansible/plugins/cliconf/aruba.py @@ -80,8 +80,8 @@ class Cliconf(CliconfBase): for cmd in chain(['configure terminal'], to_list(command), ['end']): self.send_command(cmd) - def get(self, command, prompt=None, answer=None, sendonly=False, check_all=False): - return self.send_command(command=command, prompt=prompt, answer=answer, sendonly=sendonly, check_all=check_all) + def get(self, command, prompt=None, answer=None, sendonly=False, newline=True, check_all=False): + return self.send_command(command=command, prompt=prompt, answer=answer, sendonly=sendonly, newline=newline, check_all=check_all) def get_capabilities(self): result = super(Cliconf, self).get_capabilities() diff --git a/lib/ansible/plugins/cliconf/asa.py b/lib/ansible/plugins/cliconf/asa.py index 2c12fcff30c..5d8080ca50f 100644 --- a/lib/ansible/plugins/cliconf/asa.py +++ b/lib/ansible/plugins/cliconf/asa.py @@ -77,8 +77,8 @@ class Cliconf(CliconfBase): for cmd in chain(['configure terminal'], to_list(command), ['end']): self.send_command(cmd) - def get(self, command, prompt=None, answer=None, sendonly=False, check_all=False): - return self.send_command(command=command, prompt=prompt, answer=answer, sendonly=sendonly, check_all=check_all) + def get(self, command, prompt=None, answer=None, sendonly=False, newline=True, check_all=False): + return self.send_command(command=command, prompt=prompt, answer=answer, sendonly=sendonly, newline=newline, check_all=check_all) def get_capabilities(self): result = super(Cliconf, self).get_capabilities() diff --git a/lib/ansible/plugins/cliconf/ce.py b/lib/ansible/plugins/cliconf/ce.py index d10c30cbc30..859cfd6704d 100644 --- a/lib/ansible/plugins/cliconf/ce.py +++ b/lib/ansible/plugins/cliconf/ce.py @@ -92,8 +92,8 @@ class Cliconf(CliconfBase): results.append(self.send_command(command, prompt, answer, False, newline)) return results[1:-1] - def get(self, command, prompt=None, answer=None, sendonly=False, check_all=False): - return self.send_command(command=command, prompt=prompt, answer=answer, sendonly=sendonly, check_all=check_all) + def get(self, command, prompt=None, answer=None, sendonly=False, newline=True, check_all=False): + return self.send_command(command=command, prompt=prompt, answer=answer, sendonly=sendonly, newline=newline, check_all=check_all) def get_capabilities(self): result = super(Cliconf, self).get_capabilities() diff --git a/lib/ansible/plugins/cliconf/cnos.py b/lib/ansible/plugins/cliconf/cnos.py index 52fa83abd02..254c743b471 100644 --- a/lib/ansible/plugins/cliconf/cnos.py +++ b/lib/ansible/plugins/cliconf/cnos.py @@ -110,10 +110,8 @@ class Cliconf(CliconfBase): resp['response'] = results return resp - def get(self, command, prompt=None, answer=None, sendonly=False, - check_all=False): - return self.send_command(command=command, prompt=prompt, answer=answer, - sendonly=sendonly, check_all=check_all) + def get(self, command, prompt=None, answer=None, sendonly=False, newline=True, check_all=False): + return self.send_command(command=command, prompt=prompt, answer=answer, sendonly=sendonly, newline=newline, check_all=check_all) def get_capabilities(self): result = super(Cliconf, self).get_capabilities() diff --git a/lib/ansible/plugins/cliconf/dellos10.py b/lib/ansible/plugins/cliconf/dellos10.py index 032d463323c..e6b818cc383 100644 --- a/lib/ansible/plugins/cliconf/dellos10.py +++ b/lib/ansible/plugins/cliconf/dellos10.py @@ -81,8 +81,8 @@ class Cliconf(CliconfBase): for cmd in chain(['configure terminal'], to_list(command), ['end']): self.send_command(to_bytes(cmd)) - def get(self, command, prompt=None, answer=None, sendonly=False, check_all=False): - return self.send_command(command=command, prompt=prompt, answer=answer, sendonly=sendonly, check_all=check_all) + def get(self, command, prompt=None, answer=None, sendonly=False, newline=True, check_all=False): + return self.send_command(command=command, prompt=prompt, answer=answer, sendonly=sendonly, newline=newline, check_all=check_all) def get_capabilities(self): result = super(Cliconf, self).get_capabilities() diff --git a/lib/ansible/plugins/cliconf/dellos6.py b/lib/ansible/plugins/cliconf/dellos6.py index 8bfe713905a..da0d8dcc5f0 100644 --- a/lib/ansible/plugins/cliconf/dellos6.py +++ b/lib/ansible/plugins/cliconf/dellos6.py @@ -81,8 +81,8 @@ class Cliconf(CliconfBase): for cmd in chain(['configure terminal'], to_list(command), ['end']): self.send_command(cmd) - def get(self, command, prompt=None, answer=None, sendonly=False, check_all=False): - return self.send_command(command=command, prompt=prompt, answer=answer, sendonly=sendonly, check_all=check_all) + def get(self, command, prompt=None, answer=None, sendonly=False, newline=True, check_all=False): + return self.send_command(command=command, prompt=prompt, answer=answer, sendonly=sendonly, newline=newline, check_all=check_all) def get_capabilities(self): result = super(Cliconf, self).get_capabilities() diff --git a/lib/ansible/plugins/cliconf/dellos9.py b/lib/ansible/plugins/cliconf/dellos9.py index ee72acf1a85..20df6a03d7a 100644 --- a/lib/ansible/plugins/cliconf/dellos9.py +++ b/lib/ansible/plugins/cliconf/dellos9.py @@ -81,8 +81,8 @@ class Cliconf(CliconfBase): for cmd in chain(['configure terminal'], to_list(command), ['end']): self.send_command(cmd) - def get(self, command, prompt=None, answer=None, sendonly=False, check_all=False): - return self.send_command(command=command, prompt=prompt, answer=answer, sendonly=sendonly, check_all=check_all) + def get(self, command, prompt=None, answer=None, sendonly=False, newline=True, check_all=False): + return self.send_command(command=command, prompt=prompt, answer=answer, sendonly=sendonly, newline=newline, check_all=check_all) def get_capabilities(self): result = super(Cliconf, self).get_capabilities() diff --git a/lib/ansible/plugins/cliconf/edgeos.py b/lib/ansible/plugins/cliconf/edgeos.py index af23df9a6ad..b30de4965c5 100644 --- a/lib/ansible/plugins/cliconf/edgeos.py +++ b/lib/ansible/plugins/cliconf/edgeos.py @@ -55,8 +55,8 @@ class Cliconf(CliconfBase): for cmd in chain(['configure'], to_list(candidate)): self.send_command(cmd) - def get(self, command, prompt=None, answer=None, sendonly=False, check_all=False): - return self.send_command(command=command, prompt=prompt, answer=answer, sendonly=sendonly, check_all=check_all) + def get(self, command, prompt=None, answer=None, sendonly=False, newline=True, check_all=False): + return self.send_command(command=command, prompt=prompt, answer=answer, sendonly=sendonly, newline=newline, check_all=check_all) def commit(self, comment=None): if comment: diff --git a/lib/ansible/plugins/cliconf/edgeswitch.py b/lib/ansible/plugins/cliconf/edgeswitch.py index c080a2470b3..d18122c57cd 100644 --- a/lib/ansible/plugins/cliconf/edgeswitch.py +++ b/lib/ansible/plugins/cliconf/edgeswitch.py @@ -104,13 +104,13 @@ class Cliconf(CliconfBase): resp['response'] = results return resp - def get(self, command=None, prompt=None, answer=None, sendonly=False, output=None, check_all=False): + def get(self, command=None, prompt=None, answer=None, sendonly=False, output=None, newline=True, check_all=False): if not command: raise ValueError('must provide value of command to execute') if output: raise ValueError("'output' value %s is not supported for get" % output) - return self.send_command(command=command, prompt=prompt, answer=answer, sendonly=sendonly, check_all=check_all) + return self.send_command(command=command, prompt=prompt, answer=answer, sendonly=sendonly, newline=newline, check_all=check_all) def get_capabilities(self): result = super(Cliconf, self).get_capabilities() diff --git a/lib/ansible/plugins/cliconf/enos.py b/lib/ansible/plugins/cliconf/enos.py index 272743f1c5e..0cf348a70c4 100644 --- a/lib/ansible/plugins/cliconf/enos.py +++ b/lib/ansible/plugins/cliconf/enos.py @@ -77,8 +77,8 @@ class Cliconf(CliconfBase): for cmd in chain(['configure terminal'], to_list(command), ['end']): self.send_command(cmd) - def get(self, command, prompt=None, answer=None, sendonly=False, check_all=False): - return self.send_command(command=command, prompt=prompt, answer=answer, sendonly=sendonly, check_all=check_all) + def get(self, command, prompt=None, answer=None, sendonly=False, newline=True, check_all=False): + return self.send_command(command=command, prompt=prompt, answer=answer, sendonly=sendonly, newline=newline, check_all=check_all) def get_capabilities(self): result = super(Cliconf, self).get_capabilities() diff --git a/lib/ansible/plugins/cliconf/eos.py b/lib/ansible/plugins/cliconf/eos.py index 291788d1962..4662f454916 100644 --- a/lib/ansible/plugins/cliconf/eos.py +++ b/lib/ansible/plugins/cliconf/eos.py @@ -138,10 +138,10 @@ class Cliconf(CliconfBase): self.send_command('end') return resp - def get(self, command, prompt=None, answer=None, sendonly=False, output=None, check_all=False): + def get(self, command, prompt=None, answer=None, sendonly=False, output=None, newline=True, check_all=False): if output: command = self._get_command_with_output(command, output) - return self.send_command(command, prompt=prompt, answer=answer, sendonly=sendonly, check_all=check_all) + return self.send_command(command=command, prompt=prompt, answer=answer, sendonly=sendonly, newline=newline, check_all=check_all) def commit(self): self.send_command('commit') diff --git a/lib/ansible/plugins/cliconf/exos.py b/lib/ansible/plugins/cliconf/exos.py index 0b486e25fd1..17bd044acf3 100644 --- a/lib/ansible/plugins/cliconf/exos.py +++ b/lib/ansible/plugins/cliconf/exos.py @@ -143,10 +143,10 @@ class Cliconf(CliconfBase): resp['response'] = results return resp - def get(self, command, prompt=None, answer=None, sendonly=False, output=None, check_all=False): + def get(self, command, prompt=None, answer=None, sendonly=False, output=None, newline=True, check_all=False): if output: command = self._get_command_with_output(command, output) - return self.send_command(command, prompt=prompt, answer=answer, sendonly=sendonly, check_all=check_all) + return self.send_command(command=command, prompt=prompt, answer=answer, sendonly=sendonly, newline=newline, check_all=check_all) def run_commands(self, commands=None, check_rc=True): if commands is None: diff --git a/lib/ansible/plugins/cliconf/frr.py b/lib/ansible/plugins/cliconf/frr.py index 37ba5ba4e03..d97577fcaa6 100644 --- a/lib/ansible/plugins/cliconf/frr.py +++ b/lib/ansible/plugins/cliconf/frr.py @@ -179,13 +179,13 @@ class Cliconf(CliconfBase): resp['response'] = results return resp - def get(self, command=None, prompt=None, answer=None, sendonly=False, output=None, check_all=False): + def get(self, command=None, prompt=None, answer=None, sendonly=False, output=None, newline=True, check_all=False): if not command: raise ValueError('must provide value of command to execute') if output: raise ValueError("'output' value %s is not supported for get" % output) - return self.send_command(command=command, prompt=prompt, answer=answer, sendonly=sendonly, check_all=check_all) + return self.send_command(command=command, prompt=prompt, answer=answer, sendonly=sendonly, newline=newline, check_all=check_all) def run_commands(self, commands=None, check_rc=True): if commands is None: diff --git a/lib/ansible/plugins/cliconf/ios.py b/lib/ansible/plugins/cliconf/ios.py index 9002aff6fe2..d2e4e480f73 100644 --- a/lib/ansible/plugins/cliconf/ios.py +++ b/lib/ansible/plugins/cliconf/ios.py @@ -189,13 +189,13 @@ class Cliconf(CliconfBase): resp['response'] = results return resp - def get(self, command=None, prompt=None, answer=None, sendonly=False, output=None, check_all=False): + def get(self, command=None, prompt=None, answer=None, sendonly=False, output=None, newline=True, check_all=False): if not command: raise ValueError('must provide value of command to execute') if output: raise ValueError("'output' value %s is not supported for get" % output) - return self.send_command(command=command, prompt=prompt, answer=answer, sendonly=sendonly, check_all=check_all) + return self.send_command(command=command, prompt=prompt, answer=answer, sendonly=sendonly, newline=newline, check_all=check_all) def get_device_info(self): device_info = {} diff --git a/lib/ansible/plugins/cliconf/ironware.py b/lib/ansible/plugins/cliconf/ironware.py index ecf35e8e481..21fd1fb3af6 100644 --- a/lib/ansible/plugins/cliconf/ironware.py +++ b/lib/ansible/plugins/cliconf/ironware.py @@ -80,8 +80,8 @@ class Cliconf(CliconfBase): for cmd in chain(['configure terminal'], to_list(command), ['end']): self.send_command(cmd) - def get(self, command, prompt=None, answer=None, sendonly=False, check_all=False): - return self.send_command(command=command, prompt=prompt, answer=answer, sendonly=sendonly, check_all=check_all) + def get(self, command, prompt=None, answer=None, sendonly=False, newline=True, check_all=False): + return self.send_command(command=command, prompt=prompt, answer=answer, sendonly=sendonly, newline=newline, check_all=check_all) def get_capabilities(self): result = super(Cliconf, self).get_capabilities() diff --git a/lib/ansible/plugins/cliconf/junos.py b/lib/ansible/plugins/cliconf/junos.py index a928fe8d1fc..c800539a722 100644 --- a/lib/ansible/plugins/cliconf/junos.py +++ b/lib/ansible/plugins/cliconf/junos.py @@ -140,10 +140,10 @@ class Cliconf(CliconfBase): resp['response'] = results return resp - def get(self, command, prompt=None, answer=None, sendonly=False, output=None, check_all=False): + def get(self, command, prompt=None, answer=None, sendonly=False, output=None, newline=True, check_all=False): if output: command = self._get_command_with_output(command, output) - return self.send_command(command, prompt=prompt, answer=answer, sendonly=sendonly, check_all=check_all) + return self.send_command(command=command, prompt=prompt, answer=answer, sendonly=sendonly, newline=newline, check_all=check_all) @configure def commit(self, comment=None, confirmed=False, at_time=None, synchronize=False): diff --git a/lib/ansible/plugins/cliconf/netvisor.py b/lib/ansible/plugins/cliconf/netvisor.py index 1b37b6950e7..4f0d504f300 100644 --- a/lib/ansible/plugins/cliconf/netvisor.py +++ b/lib/ansible/plugins/cliconf/netvisor.py @@ -35,13 +35,13 @@ from ansible.plugins.cliconf import CliconfBase class Cliconf(CliconfBase): - def get(self, command=None, prompt=None, answer=None, sendonly=False, output=None, check_all=False): + def get(self, command=None, prompt=None, answer=None, sendonly=False, output=None, newline=True, check_all=False): if not command: raise ValueError('must provide value of command to execute') if output: raise ValueError("'output' value %s is not supported for get" % output) - return self.send_command(command=command, prompt=prompt, answer=answer, sendonly=sendonly, check_all=check_all) + return self.send_command(command=command, prompt=prompt, answer=answer, sendonly=sendonly, newline=newline, check_all=check_all) def get_option_values(self): return { diff --git a/lib/ansible/plugins/cliconf/nos.py b/lib/ansible/plugins/cliconf/nos.py index 558f60ae8b9..c06b68942f3 100644 --- a/lib/ansible/plugins/cliconf/nos.py +++ b/lib/ansible/plugins/cliconf/nos.py @@ -105,8 +105,8 @@ class Cliconf(CliconfBase): resp['response'] = results return resp - def get(self, command, prompt=None, answer=None, sendonly=False, check_all=False): - return self.send_command(command, prompt=prompt, answer=answer, sendonly=sendonly, check_all=check_all) + def get(self, command, prompt=None, answer=None, sendonly=False, newline=True, check_all=False): + return self.send_command(command=command, prompt=prompt, answer=answer, sendonly=sendonly, newline=newline, check_all=check_all) def get_capabilities(self): result = super(Cliconf, self).get_capabilities() diff --git a/lib/ansible/plugins/cliconf/nxos.py b/lib/ansible/plugins/cliconf/nxos.py index 596caed3a63..c42d750cc7b 100644 --- a/lib/ansible/plugins/cliconf/nxos.py +++ b/lib/ansible/plugins/cliconf/nxos.py @@ -189,10 +189,10 @@ class Cliconf(CliconfBase): resp['response'] = results return resp - def get(self, command, prompt=None, answer=None, sendonly=False, output=None, check_all=False): + def get(self, command, prompt=None, answer=None, sendonly=False, output=None, newline=True, check_all=False): if output: command = self._get_command_with_output(command, output) - return self.send_command(command, prompt=prompt, answer=answer, sendonly=sendonly, check_all=check_all) + return self.send_command(command=command, prompt=prompt, answer=answer, sendonly=sendonly, newline=newline, check_all=check_all) def run_commands(self, commands=None, check_rc=True): if commands is None: diff --git a/lib/ansible/plugins/cliconf/onyx.py b/lib/ansible/plugins/cliconf/onyx.py index 8195634b65f..0c64b1e17a7 100644 --- a/lib/ansible/plugins/cliconf/onyx.py +++ b/lib/ansible/plugins/cliconf/onyx.py @@ -70,8 +70,8 @@ class Cliconf(CliconfBase): for cmd in chain(['configure terminal'], to_list(command), ['exit']): self.send_command(cmd) - def get(self, command, prompt=None, answer=None, sendonly=False, check_all=False): - return self.send_command(command=command, prompt=prompt, answer=answer, sendonly=sendonly, check_all=check_all) + def get(self, command, prompt=None, answer=None, sendonly=False, newline=True, check_all=False): + return self.send_command(command=command, prompt=prompt, answer=answer, sendonly=sendonly, newline=newline, check_all=check_all) def get_capabilities(self): result = super(Cliconf, self).get_capabilities() diff --git a/lib/ansible/plugins/cliconf/routeros.py b/lib/ansible/plugins/cliconf/routeros.py index 38b73fe5b04..09bed5c2d43 100644 --- a/lib/ansible/plugins/cliconf/routeros.py +++ b/lib/ansible/plugins/cliconf/routeros.py @@ -71,8 +71,8 @@ class Cliconf(CliconfBase): def edit_config(self, command): return - def get(self, command, prompt=None, answer=None, sendonly=False, check_all=False): - return self.send_command(command=command, prompt=prompt, answer=answer, sendonly=sendonly, check_all=check_all) + def get(self, command, prompt=None, answer=None, sendonly=False, newline=True, check_all=False): + return self.send_command(command=command, prompt=prompt, answer=answer, sendonly=sendonly, newline=newline, check_all=check_all) def get_capabilities(self): result = super(Cliconf, self).get_capabilities() diff --git a/lib/ansible/plugins/cliconf/slxos.py b/lib/ansible/plugins/cliconf/slxos.py index 5c71e2d23a1..db1c4a9cfec 100644 --- a/lib/ansible/plugins/cliconf/slxos.py +++ b/lib/ansible/plugins/cliconf/slxos.py @@ -97,8 +97,8 @@ class Cliconf(CliconfBase): self.send_command(command, prompt, answer, False, newline) - def get(self, command, prompt=None, answer=None, sendonly=False, check_all=False): - return self.send_command(command=command, prompt=prompt, answer=answer, sendonly=sendonly, check_all=check_all) + def get(self, command, prompt=None, answer=None, sendonly=False, newline=True, check_all=False): + return self.send_command(command=command, prompt=prompt, answer=answer, sendonly=sendonly, newline=newline, check_all=check_all) def get_capabilities(self): result = super(Cliconf, self).get_capabilities() diff --git a/lib/ansible/plugins/cliconf/voss.py b/lib/ansible/plugins/cliconf/voss.py index 7cf832d5fff..9610045a010 100644 --- a/lib/ansible/plugins/cliconf/voss.py +++ b/lib/ansible/plugins/cliconf/voss.py @@ -154,8 +154,8 @@ class Cliconf(CliconfBase): resp['response'] = results return resp - def get(self, command, prompt=None, answer=None, sendonly=False, check_all=False): - return self.send_command(command=command, prompt=prompt, answer=answer, sendonly=sendonly, check_all=check_all) + def get(self, command, prompt=None, answer=None, sendonly=False, newline=True, check_all=False): + return self.send_command(command=command, prompt=prompt, answer=answer, sendonly=sendonly, newline=newline, check_all=check_all) def get_device_info(self): device_info = {} diff --git a/lib/ansible/plugins/cliconf/vyos.py b/lib/ansible/plugins/cliconf/vyos.py index 74bb1a1b89e..73c0c7aa083 100644 --- a/lib/ansible/plugins/cliconf/vyos.py +++ b/lib/ansible/plugins/cliconf/vyos.py @@ -116,14 +116,13 @@ class Cliconf(CliconfBase): resp['request'] = requests return resp - def get(self, command=None, prompt=None, answer=None, sendonly=False, output=None, check_all=False): + def get(self, command=None, prompt=None, answer=None, sendonly=False, output=None, newline=True, check_all=False): if not command: raise ValueError('must provide value of command to execute') - if output: raise ValueError("'output' value %s is not supported for get" % output) - return self.send_command(command, prompt=prompt, answer=answer, sendonly=sendonly, check_all=check_all) + return self.send_command(command=command, prompt=prompt, answer=answer, sendonly=sendonly, newline=newline, check_all=check_all) def commit(self, comment=None): if comment: