如何使ios_config任务幂等?

时间:2019-07-30 20:34:26

标签: ansible idempotent

我正在尝试在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”参数中使用变量时,幂等性没有实现吗?

2 个答案:

答案 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 }

感谢古兹蒙尼