1

我正在开发一些用于与 REST API 交互的 ansible 模块。当我写它们时,我发现我正在复制/粘贴常用选项。例如,在模块 1 中:

module1.py
def run_module():

    module_args = dict(
        api_key=dict(type='str', required=True),
        host=dict(type='str', required=True),  
        port=dict(type='int', required=False, default=443),
        module1_option=dict(type='str', required=True)
    )

    result = dict(
        changed=False,
    )

    module = AnsibleModule(
        argument_spec = module_args,
        supports_check_mode = True
    )

    if module.check_mode:
        module.exit_json(**result)

    host = module.params['host']
    api_key = module.params['api_key']
    port = module.params['port']

    module1_option= module.params['module1_option']
    #do module1 stuff here
   

def main():
    run_module()

if __name__ == '__main__':
    main()

然后在 module2 中,它与相同的 REST API 交互,因此需要许多相同的选项:

module2.py
def run_module():

    module_args = dict(
        api_key=dict(type='str', required=True),
        host=dict(type='str', required=True),  
        port=dict(type='int', required=False, default=443),
        module2_option1=dict(type='str', required=True),
        module2_option2=dict(type='bool', required=False)
    )

    result = dict(
        changed=False,
    )

    module = AnsibleModule(
        argument_spec = module_args,
        supports_check_mode = True
    )

    if module.check_mode:
        module.exit_json(**result)

    host = module.params['host']
    api_key = module.params['api_key']
    port = module.params['port']

    module2_option1= module.params['module2_option1']
    module2_option2= module.params['module2_option2']
    #do module2 stuff here
   

def main():
    run_module()

if __name__ == '__main__':
    main()

这里的设置和要求非常相似。我还复制/粘贴了大部分DOCUMENTATION字符串,为简洁起见,我在这里省略了。

我想知道这是否被认为是好的做法。我可以将其中一些东西(包括基本DOCUMENTATION字符串)提取到一个公共文件中,或者将功能包装在我为每个模块扩展的基类中......我真的不确定在这种情况下什么是最佳实践,我在 Ansible 模块开发中没有看到任何关于继承的内容。有人可以给我一些建议吗?这些也是我编写的第一个 Ansible 模块,因此也将不胜感激任何其他建议,非常感谢!

4

0 回答 0