遗留网络设备可用(伪终端问题)

时间:2018-09-17 09:23:12

标签: ansible

有人可以通过Ansible(v2.5)连接在运行在旧版网络设备(交换机)上的命令帮助我吗?因为网络设备是旧设备,所以我不能使用Ansible模块,这就是为什么我不得不诉诸原始设备的原因。另外,值得指出的是,我无法控制旧设备-我无法用更新的模型替换它,也无法以最简单的方式更改配置。

我要运行的Ansible命令非常基本。像这样的东西(显然不是这样,实际上命令是“ nsshow”,但是我不想专注于此,因为我确信还会有其他命令遇到相同的问题):

- name: "Device Command"
  raw: "command1"
  register: command

这确实有效,但是不是必需的方式。问题在于该命令在目标设备上的错误上下文中运行,因此即使该命令成功运行,它产生的输出也没有用。

我已经使用SSH命令进行了一些调查,以发现问题的本质。最初,我尝试使用SSH连接到设备并手动输入命令。那行得通,我可以从设备上的命令提示符处看到命令在正确的上下文中运行。我尝试的下一件事是将命令作为管道运行。我发现这些命令中的第一个无效(与Ansible相同),但是第二个正确运行:

echo -e "command1" | ssh myaccount@mydevice
echo -e "command1" | ssh -tt myaccount@mydevice

因此,似乎该问题与伪终端有关。我意识到当第一个命令给出警告错误“因为stdin不是终端,伪终端将不会被分配”时,我需要-tt选项。回到Ansible命令,我可以看到,如果我运行带详细输出的Ansible,则在SSH命令行上使用-tt。那么,Ansible命令为什么不起作用?然后,我发现从命令行运行此命令时也会遇到警告错误问题:

ssh -tt myaccount@mydevice command1

我认为这比我上面使用的管道示例更像Ansible所做的事情,这说明了Ansible无法正常工作的原因。

当然,在Ansible中,我可以运行这样的命令,该命令确实有效,但我宁愿避免使用它。

- name: "Device Command"
  local_action:
    module: shell echo -e "command1" | ssh -tt myaccount@{{ inventory_hostname }}
  register: command

所以,实际的问题是“我如何在目标设备上运行Ansible播放并运行原始命令以避免psuedo终端问题?”

在此先感谢您的帮助或建议。

1 个答案:

答案 0 :(得分:0)

您随时可以在游戏中添加ansible_ssh_args

- hosts: legacy_device
  vars:
    ansible_ssh_args: -tt
  tasks:
    - name: "Device Command"
      raw: "command1"
      register: command

或者更好的是清单,host_vars或group_vars。