使用 Ansible 重启网络设备
使用 Ansible 重启网络设备
随着 Red Hat Ansible 自动化平台在 11 月的发布,我们发布了 50 多个网络资源模块,以帮助网络工程师更轻松地自动化网络设备,并使之更易于使用。除了新的资源模块之外,Andrius 还在他的博客文章中讨论了事实收集增强功能,这意味着随着每个新资源模块的发布,用户都将获得更多网络设备的事实覆盖范围。对于这篇文章,我想介绍另一个可能被忽视的强大功能。这就是让网络设备利用 wait_for_connection 模块的功能。如果你是一名网络工程师,并且拥有需要重启设备或将其下线的可操作 Ansible 剧本,那么此模块将帮助你创建更具编程性的剧本以处理断开连接。通过利用 wait_for_connection,网络自动化剧本可以看起来和行为更像用于 Linux 或 Windows 主机的剧本。
比较 wait_for 和 wait_for_connection
有两个很棒的模块可以等待条件满足,它们是 wait_for 和 wait_for_connection。我强烈建议不要使用 pause 模块,除非你没有其他选择,我把它比作在 Ansible 剧本中使用编程中的 sleep 等价物。使用这两个 wait_for 模块中的任何一个都优于在 Ansible 剧本中进行随机暂停,因为它们是更具编程性的解决方案,能够更好地适应设备完成任务所需的不同时间。pause 模块的另一个问题是,使用提示在 Ansible Tower 中不起作用。对于人机交互,一个更好的解决方案是使用具有 批准节点 的 Ansible Tower 工作流。
wait_for 模块可以等待文件系统上的路径存在,或等待端口重新激活。这对大多数重启用例都有效,除非系统在端口启动后无法立即登录。wait_for_connection 在 wait_for 的用例上扩展了功能。wait_for_connection 模块将确保 Ansible 能够重新登录到设备,并在完成任务之前接收适当的提示。对于 Linux 和 Windows 主机,它将使用 ping 或 win_ping 模块,对于网络设备,它将确保上次使用的 连接插件 能够完全连接到设备。在撰写这篇文章时,这仅适用于 network_cli
连接插件。这意味着后续任务可以立即开始按预期运行,因为 wait_for_connection 完成,而 wait_for 只知道端口是打开的。
处理提示
对于网络设备,当我们执行诸如重启之类的操作任务时,通常会有一个提示询问你是否要采取行动。
例如在 Juniper vSRX 设备上
admin@rtr3> request system reboot Reboot the system ? [yes,no] (no)
用户必须确认重新加载才能继续。我在 cli_command
博客的深入分析中遗漏了一个内容,那就是 cli_command 模块 可以处理提示。cli_command
模块甚至可以处理多个提示!在这个例子中,Cisco 路由器没有保存其配置,我们正在执行重新加载。首先,Cisco 路由器会提醒我系统配置已修改,并询问我是否要在丢失运行配置之前保存它
rtr1#reload System configuration has been modified. Save? [yes/no]:
确认 yes
或 no
后,你将收到第二个提示
Proceed with reload? [confirm]
我们需要构建一个可以使用 cli_command
模块处理这两个提示的任务
--- - name: reboot ios device cli_command: command: reload prompt: - Save? - confirm answer: - y - y
上面的任务将对两个提示都回答 yes,保存配置并重新加载设备。提示答案列表和答案列表必须匹配并按相同顺序排列。这意味着 prompt[0]
的答案必须是 answer[0]
。
如果你想查看处理多个提示的更详细示例,这里有一个在 Juniper vSRX 设备上重置密码的示例.
结合使用 reset_connection
现在你已经了解了如何使用 cli_command 重启设备,我们可以将其与 wait_for_connection 结合起来,创建可重用的 Ansible 剧本。但是,我们需要添加一个额外的任务,一个 meta: reset_connection 来使它在编程上有效。
我们需要确保当前与网络设备的连接关闭,以便在重启后能够重新建立与网络设备的套接字。如果连接没有关闭,并且命令超时时间超过重启所需的时间,持久连接将尝试重用已关闭的 SSH 连接,导致出现“套接字已关闭”错误。正确的 Ansible 剧本如下所示
- reboot task (this is a snippet, full task removed for brevity) - name: reset the connection meta: reset_connection - name: Wait for the network device to reload wait_for_connection: delay: 10
现在我们有了可以重启后重新连接到网络设备的 Ansible 剧本!有关完整示例,请 参考此 reboot.yml 用于 Arista vEOS 网络设备的 Ansible 剧本。
下一步做什么?
这篇博客文章概述了如何为重启网络设备创建可重用的 Ansible 剧本。下一步显然是构建可以重启多个网络平台的 Ansible 角色。我已经 创建了一个并将其上传到 Github 上。这个角色将在 Juniper Junos、Cisco IOS 和 Arista EOS 设备上运行,并且可以轻松地修改以处理更多网络操作系统。