Ansible 网络常见问题解答

如何提高网络 Playbook 的性能?

如果运行在多台主机上,请考虑使用 strategy: free

strategy 插件告诉 Ansible 如何在多台主机上对多个任务进行排序。策略在 Playbook 级别设置。

默认策略是 linear。如果将策略设置为 linear,则 Ansible 会等待当前任务在所有主机上运行完毕,然后再在任何主机上开始下一个任务。Ansible 可能有空闲的 forks,但在所有主机完成当前任务之前不会使用它们。如果你的 Playbook 中的每个任务都必须在所有主机上成功运行,然后才能运行下一个任务,请使用 linear 策略。

使用 free 策略,Ansible 会尽可能快地使用可用的 forks 在每台主机上执行任务。即使较早的任务仍在某一台主机上运行,Ansible 也会在其他主机上执行后面的任务。free 策略更有效地利用可用的 forks。如果你的 Playbook 在每个任务上都停顿,等待一台速度较慢的主机,请考虑使用 strategy: free 来提高整体性能。

只有在绝对必要时才执行 show running

show running 命令是在网络设备上执行时资源最密集的命令,因为网络操作系统处理查询的方式。在你的 Ansible Playbook 中使用该命令会显著降低性能,尤其是在大型设备上;重复执行会加剧性能影响。如果你的 Playbook 检查运行配置,然后执行更改,然后再次检查运行配置,则应该预期该 Playbook 会非常慢。

只有在绝对必要时才使用 ProxyCommand

网络模块支持使用 代理或跳转主机 以及 ProxyCommand 参数。但是,当你使用跳转主机时,Ansible 必须为每个任务打开一个新的 SSH 连接,即使你使用的是持久连接类型(network_clinetconf)。为了最大化版本 2.5 中引入的持久连接类型的性能优势,请尽可能避免使用跳转主机。

--forks 设置为符合你的需求

每次 Ansible 运行任务时,它都会派生自己的进程。--forks 参数定义了并发任务的数量 - 如果你保留默认设置,即 --forks=5,并且你在 10 台主机上运行 Playbook,则其中五台主机必须等待直到有 fork 可用。当然,你允许的 fork 越多,Ansible 将使用的内存和处理能力就越多。由于大多数网络任务都在控制主机上运行,这意味着你的笔记本电脑可能会很快受到 CPU 或内存的限制。

为什么我的输出有时会被替换为 ********

Ansible 会将任何标记为 no_log 的字符串(包括密码)在 Ansible 输出中替换为 ********。这是通过设计完成的,以保护你的敏感数据。大多数用户都很乐意将其密码隐藏。但是,Ansible 会将与你的密码匹配的每个字符串替换为 ********。如果你将一个常用词用作你的密码,这可能会成为问题。例如,如果你选择 Admin 作为你的密码,则 Ansible 会将输出中每次出现的单词 Admin 替换为 ********。这可能会使你的输出更难以阅读。为了避免此问题,请选择一个安全的密码,该密码不会在 Ansible 输出的其他位置出现。

为什么 *_config 模块在使用缩写命令时总是返回 changed=true

当你直接在网络设备上发出命令时,可以使用缩写命令。例如,int g1/0/11interface GigabitEthernet1/0/11 执行相同的操作;shutshutdown 执行相同的操作。Ansible 网络 *_command 模块使用缩写,因为它们通过网络操作系统运行命令。

但是,在提交配置时,网络操作系统会将缩写转换为长格式命令。无论你在 GigabitEthernet1/0/11 上使用 shut 还是 shutdown,配置中的结果都是相同的:shutdown

Ansible 网络 *_config 模块会将您在 lines 中指定的命令文本与配置中的文本进行比较。如果您在任务的 lines 部分中使用 shut,而配置读取为 shutdown,即使配置已经正确,该模块也会返回 changed=true。您的任务每次运行时都会更新配置。

为了避免这个问题,请在使用 *_config 模块时使用完整形式的命令。

---
- hosts: all
  gather_facts: no
  tasks:
    - cisco.ios.ios_config:
        lines:
          - shutdown
        parents: interface GigabitEthernet1/0/11