Ansible 网络 FAQ
咱们可以怎样提高网络 playbook 的性能?
若咱们是在多个主机上运行则要考虑 strategy: free
strategy
插件告诉 Ansible,以何方式在多台主机上排序多个任务。策略 在 playbook 级别设置。
默认策略为 linear
。策略被设置为 linear
下,Ansible 会等待当前任务在所有主机上运行完毕后,才在全部主机上启动下一任务。Ansible 可能有空闲的进程分叉,但在所有主机完成当前任务前不会使用他们。如果 playbook 中的每个任务都必须在所有主机上运行成功后,才能运行下一任务,那么就要使用 linear
策略。
而使用 free
的策略,Ansible 就会使用可用的进程分叉,尽可能快的在每台主机上执行任务。即使较早的任务仍在一台主机上运行,Ansible 也会在其他主机上执行稍后的任务。free
策略会更高效地使用可用进程分叉。如果咱们的 playbook 在每个任务上都停滞不前,等待着某台慢速主机,则可以考虑使用 strategy: free
来提高整体性能。
只在咱们万不得已时才执行 show running
由于网络操作系统处理查询的方式,show running
命令是在网络设备上执行的最耗费资源的命令。在咱们的 Ansible playbook 中使用该命令,将大大降低性能,尤其是在大型设备上;反复使用该命令会成倍增加性能损失。如果咱们有个先检查运行配置,然后执行更改,最后再检查一次运行配置的 playbook,那么咱们就会发现,该 playbook 的运行速度会非常慢。
只有在咱们万不得已时才使用 ProxyCommand
网络模组支持通过 ProxyCommand
参数,使用代理或跳转主机。不过,当咱们使用了跳转主机时,即使咱们使用的是某种持久连接类型(network_cli
或 netconf
),Ansible 也必须为每个任务打开一个新的 SSH 连接。为了最大限度地发挥 2.5 版本中引入的持久连接类型的性能优势,请尽可能避免使用跳转主机。
将 --forks
参数设置为与咱们的需求匹配
每次 Ansible 运行任务时,都会分叉自己的进程。--forks
参数定义了并发任务的数量 -- 若咱们保留默认设置 --forks=5
,并在 10 台主机上运行某个 playbook,那么其中 5 台主机将不得不等待分叉进程。当然,咱们允许的分叉越多,Ansible 就将使用更多内存和计算能力。由于大多数网络任务都在控制主机上运行,这意味着咱们的笔记本电脑很快就会被 CPU/内存高负荷。
为什么有时候咱们的输出会被 ********
代替?
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: nxos-sw
gather_facts: no
tasks:
- cisco.nxos.nxos_config:
lines:
- shutdown
parents: interface Ethernet2/2
register: res
- debug:
msg: "{{ res }}"
(End)