Ansible 网络常见问题解答
如何提高网络剧本的性能?
如果您在多个主机上运行,请考虑使用 strategy: free
strategy
插件告诉 Ansible 如何在多个主机上按顺序执行多个任务。策略 在剧本级别设置。
默认策略是 linear
。使用 linear
策略,Ansible 会等到当前任务在所有主机上运行完后再开始在任何主机上运行下一个任务。Ansible 可能有空闲的 fork,但它不会在所有主机完成当前任务之前使用它们。如果您的剧本中每个任务都必须在所有主机上成功执行才能运行下一个任务,请使用 linear
策略。
使用 free
策略,Ansible 会尽可能快地使用可用的 fork 在每个主机上执行任务。即使较早的任务仍在某个主机上运行,Ansible 也会在其他主机上执行后续任务。 free
策略更有效地使用可用的 fork。如果您的剧本在每个任务上都暂停,等待一台速度较慢的主机,请考虑使用 strategy: free
来提高整体性能。
仅在绝对必要时执行 show running
show running
命令是网络设备上执行最耗费资源的命令,这是因为网络操作系统处理查询的方式。在 Ansible 剧本中使用该命令会显著降低性能,尤其是在大型设备上;重复使用该命令会成倍地放大性能损耗。如果您的剧本检查运行配置,然后执行更改,然后再检查运行配置,那么您应该预期该剧本会非常慢。
仅在绝对必要时使用 ProxyCommand
网络模块支持使用 代理或跳跃主机,并使用 ProxyCommand
参数。但是,当您使用跳跃主机时,Ansible 必须为每个任务打开一个新的 SSH 连接,即使您使用的是持久连接类型(network_cli
或 netconf
)。为了最大限度地提高 2.5 版中引入的持久连接类型的性能优势,请尽可能避免使用跳跃主机。
设置 --forks
以满足您的需求
每次 Ansible 运行任务时,它都会派生自己的进程。 --forks
参数定义并发任务的数量 - 如果您保留默认设置,即 --forks=5
,并且您在 10 台主机上运行剧本,那么其中 5 台主机必须等到 fork 可用。当然,您允许的 fork 越多,Ansible 使用的内存和处理能力就越多。由于大多数网络任务都在控制主机上运行,这意味着您的笔记本电脑很快就会受到 CPU 或内存的限制。
为什么我的输出有时会被替换为 ********
?
Ansible 在 Ansible 输出中将所有标记为 no_log
的字符串(包括密码)替换为 ********
。这是出于设计考虑,为了保护您的敏感数据。大多数用户很乐意让他们的密码被屏蔽。但是,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