对传统网络设备的答案(伪终端问题)

问题描述 投票:0回答:1

任何人都可以通过Ansible(v2.5)连接帮助我在传统网络设备(交换机)上运行命令吗?因为网络设备是遗留的,我不能使用Ansible模块,这就是为什么我不得不求助于raw。此外,值得指出的是,我无法控制传统设备 - 我无法用更新的模型替换它,或者以最微不足道的方式改变配置。

我想要运行的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

因此,似乎问题与伪终端有关。我意识到当第一个命令发出警告错误时,我需要-tt选项'因为stdin不是终端,所以不会分配伪终端'。回到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游戏,以避免伪造终端问题”?

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

ansible
1个回答
© www.soinside.com 2019 - 2024. All rights reserved.