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_cli
或 netconf
)。为了最大化版本 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/11
和 interface GigabitEthernet1/0/11
执行相同的操作;shut
和 shutdown
执行相同的操作。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