我正在尝试在cisco路由器中创建一个幂等剧本。我在网上阅读了示例,我认为问题出在参数“ with_item”。
这是戏:
- name: Configurar subinterfaces para las VLAN 10,20 y 30
ios_config:
provider: "{{ cli }}"
parents:
- interface GigabitEthernet0/0
lines:
- interface GigabitEthernet0/0.{{ item.subinterface }}
after:
- description {{ item.name }}
- encapsulation dot1q {{ item.subinterface }}
- ip address {{ item.ip_add }} 255.255.255.0
with_items:
- { subinterface: 10, name: Ventas, ip_add: 192.168.10.1 }
- { subinterface: 20, name: RRHH, ip_add: 192.168.20.1 }
- { subinterface: 30, name: Contabilidad, ip_add: 192.168.30.1 }
以下是输出:
PLAY [Configurar Router 1 Cisco] ***********************************************
TASK [config_r1_cisco : Configurar subinterfaces para las VLAN 10,20 y 30] *****
changed: [R1] => (item={u'subinterface': 10, u'ip_add': u'192.168.10.1', u'name': u'Ventas'})
changed: [R1] => (item={u'subinterface': 20, u'ip_add': u'192.168.20.1', u'name': u'RRHH'})
changed: [R1] => (item={u'subinterface': 30, u'ip_add': u'192.168.30.1', u'name': u'Contabilidad'})
PLAY RECAP *********************************************************************
R1 : ok=1 changed=1 unreachable=0 failed=0
当我一次又一次地运行剧本时,输出总是改变而不是确定。可能是因为在“ with_items”参数中使用变量时,幂等性没有实现吗?
答案 0 :(得分:1)
您可能会得到幂等命令的原因很多,但它们与with_items
选项无关。
一个可能的问题是使用缩写命令(例如,shut
而不是shutdown
)。在“ Ansible网络常见问题解答”的"Why do the config
modules always return true"部分中,该代码段:
Ansible Network * _config模块将您在行中指定的命令文本与配置中的文本进行比较。如果您在任务的“行”部分中使用了shutdown,并且配置显示为shutdown,则即使配置已经正确,该模块也会返回changed = true。您的任务将在每次运行时更新配置。
我不相信这是您的情况。
另一个原因可能是您使用的命令与running_config
上的命令不同。因此,即使它们产生相同的输出,行之间的检查也不完全匹配。
虽然应该检查,但也可能不是您的问题。
模块还有一种将更新的行与running_config
进行比较的方式。默认情况下,该模块检查每一行,但还有其他选项。 The documentation says:
指导模块执行命令集与当前设备配置的匹配。如果将match设置为line,则命令逐行匹配。如果将match设置为strict,则命令行将根据位置进行匹配。如果将match设置为完全匹配,则命令行必须相等。最后,如果将match设置为none,则模块将不会尝试将源配置与远程设备上正在运行的配置进行比较。
那可能是你的问题。
对于可能会影响模块工作方式的因素,我也有个人看法,事实上,您正在使用after
选项将更改应用于接口。它的实际用法是:
如果需要进行更改,则有序的命令集将追加到命令堆栈的末尾。就像之前一样,这允许剧本设计者在命令集之后附加一组要执行的命令。
与before
选项一起,它们用于在进行实际更改之前和之后应用命令。例如,在五分钟内设置一次重置以避免由于配置问题而导致断开连接,或者将更改写入ROM(不过,您可以通过save_when
选项执行此操作)。我没有证据表明确实如此,但是您应该尝试一下。只需将after
选项中的行移至lines
选项。
最后,通过运行带有playbook
标志的--check --diff
,您可能会看到变化。
希望对您有帮助。
答案 1 :(得分:0)
这是我的问题的最后一部戏:
---
- name: Configurar subinterfaces para las VLAN 10,20 y 30
ios_config:
provider: "{{ cli }}"
parents:
- interface GigabitEthernet0/0.{{ item.subinterface }}
lines:
- description {{ item.name }}
- encapsulation dot1Q {{ item.subinterface }}
- ip address {{ item.ip_add }} 255.255.255.0
match: strict
with_items:
- { subinterface: 10, name: Ventas, ip_add: 192.168.10.1 }
- { subinterface: 20, name: RRHH, ip_add: 192.168.20.1 }
- { subinterface: 30, name: Contabilidad, ip_add: 192.168.30.1 }
感谢古兹蒙尼