Ansible 网络常见问题解答
如何提高网络 Playbook 的性能?
如果您的操作涉及多个主机,请考虑使用 strategy: free
strategy
插件告诉 Ansible 如何在多个主机上对多个任务进行排序。Strategy 在 Playbook 级别进行设置。
默认策略是 linear
。将策略设置为 linear
后,Ansible 会等待当前任务在所有主机上运行完毕,然后再开始在任何主机上执行下一个任务。Ansible 可能有空闲的 fork,但它不会使用它们,直到所有主机都完成当前任务。如果您的 Playbook 中的每个任务都必须在所有主机上成功执行,然后才能运行下一个任务,请使用 linear
策略。
使用 free
策略,Ansible 会尽可能快地使用可用的 fork 在每个主机上执行任务。即使较早的任务仍在某个主机上运行,Ansible 也会在其他主机上执行后面的任务。free
策略可以更有效地利用可用的 fork。如果您的 Playbook 在每个任务上都停滞不前,等待一台速度较慢的主机,请考虑使用 strategy: free
以提高整体性能。
仅在绝对必要时才执行 show running
show running
命令是在网络设备上执行的最消耗资源的命令,因为网络操作系统处理查询的方式。在 Ansible Playbook 中使用该命令会显著降低性能,尤其是在大型设备上;重复使用该命令会成倍增加性能损失。如果您的 Playbook 检查运行配置,然后执行更改,然后再次检查运行配置,则您应该预料到该 Playbook 会非常慢。
仅在绝对必要时才使用 ProxyCommand
网络模块支持使用 代理或跳转主机,通过 ProxyCommand
参数实现。但是,当您使用跳转主机时,即使您使用的是持久连接类型(network_cli
或 netconf
),Ansible 也必须为每个任务打开一个新的 SSH 连接。为了最大程度地利用 2.5 版本中引入的持久连接类型的性能优势,请尽可能避免使用跳转主机。
将 --forks
设置为满足您的需求
每次 Ansible 运行任务时,它都会 fork 自己的进程。--forks
参数定义了并发任务的数量 - 如果您保留默认设置,即 --forks=5
,并且您在 10 个主机上运行 Playbook,则其中 5 个主机将必须等待 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