具有循环的子属性的Ansible模块

具有循环的子属性的Ansible模块,ansible,ansible-module,Ansible,Ansible Module,我正在尝试构建一个自定义模块,该模块将使用paramikossh配置网络设备。设备上的配置cli具有一定的限制性,并且具有自己特定的配置逻辑 我需要能够为正在配置的主元素在循环中配置子元素 我有这个var结构: main\u变量: -元素名称:“a1” 元素_接口:“m01” 子港口: -端口:5060 协议:UDP -端口:5061 协议:TCP -元素名称:“a2” 元素_接口:“m02” 子港口: -端口:5060 协议:TCP 因此,子端口应该能够在每个元素\u name中的列表项中循

我正在尝试构建一个自定义模块,该模块将使用paramikossh配置网络设备。设备上的配置cli具有一定的限制性,并且具有自己特定的配置逻辑

我需要能够为正在配置的主元素在循环中配置子元素

我有这个var结构:

main\u变量:
-元素名称:“a1”
元素_接口:“m01”
子港口:
-端口:5060
协议:UDP
-端口:5061
协议:TCP
-元素名称:“a2”
元素_接口:“m02”
子港口:
-端口:5060
协议:TCP
因此,子端口应该能够在每个
元素\u name
中的列表项中循环

我知道自定义模块可以有子属性,我的模块参数如下:

module_args=dict(
元素名称=dict(type='str',required=True),
元素接口=dict(type='str',required=True),
sub_port=dict(type='dict',options=dict(
端口=dict(type='int',required=False),
协议=dict(type='str',required=False)))
我的问题是,在配置每个元素时,如何让模块在
子端口
中的列表项之间循环?例如,对于元素“a1”,发送到设备的所需命令为:

(configuration)# name a1
(configuration)# interface m01
(configuration)# sub_port
(configuration/sup_port)# port 5060
(configuration/sup_port)# protocol UDP
(configuration/sup_port)# save
(configuration/sup_port)# port 5061
(configuration/sup_port)# protocol TCP
(configuration/sup_port)# save
(configuration/sup_port)# exit
(configuration)# save
在上述步骤之后,它将进入“a2”


如果模块参数有助于我实现目标,我很乐意更改它的结构。

据我所知,您希望您的模块一次处理
main\u var
中的所有数据(即在网络设备上的单个shell会话中)。在这种情况下,为什么要定义这么多参数?简单地将整个顶层列表传递给模块,然后检查其格式并直接在python中执行所有循环不是更容易吗?我遇到的问题是,由于“main_var”是由其他人填写的,所以我需要验证模块中的输入,我发现唯一的方法是定义模块参数。我还探讨了如何使用以下模块参数,但在这种情况下,列表中的变量没有经过验证``module\u args=dict(element\u name=dict(type='str',required=True),element\u interface=dict(type='str',required=True),sub\u port=dict(type='list',required=True))``您通常会在ansible中使用一个模块来处理这个问题,该模块在一个接口上为一个协议为一个给定名称打开一个端口。在任务的循环中,您将使用一个命令遍历每个接口的每个端口。将对每一个进行验证。注意,在这种情况下,处理幂等性要容易得多。自定义模块sub_属性允许您定义dict,而不是dict AFAIK列表。不幸的是,在我的情况下,通过任务循环子端口将不起作用。目前,我们让模块打开一个到设备的会话,没有到设备的持久会话,如果没有保存配置,设备将擦除整个
元素\u name
。因此,我必须在一个会话中配置整个
元素名称
,如果不这样做,意味着我必须重新设计模块,将
元素名称
配置保存为一个子端口,然后返回并编辑第二个子端口的
元素名称