我可以指定参数不能与 Ansible 模块规范中的特定选项一起使用吗?

Can I specify that an argument can't be used with a specific choice in Ansible module spec?

我正在寻找一种方法来指定如果另一个参数具有特定值则不能使用模块参数。 如果另一个参数具有特定值但我需要相反的值,您可以指定 required_if 来要求一个参数。 概念上类似于 mutually_exclusive 的东西,可能称为 forbidden_if.

我正在开发一个为 SQL 服务器创建登录的模块。它可以是特定于服务器的 SQL 登录,也可以是使用域控制器的 Windows 登录。 对于 SQL 登录,您必须指定密码,但不能为 Windows 指定密码,因为这是由域控制器设置的。登录有一个标识符 (SID),可以由用户为 SQL 登录指定,但不能为 Window.

尽管它是 Windows 主机的 Powershell 模块,但我将使用 Python 示例,因为那是 the documentation 所在的内容。

这是创建 SQL 登录的模块的规范

module = AnsibleModule(
    argument_spec=dict(
        username=dict(type='str', required=True),
        password=dict(type='str', no_log=True, required=True),
        sid=dict(type='str', required=False),
    ),
    supports_check_mode=True
)

还有一个用于 Windows 登录

module = AnsibleModule(
    argument_spec=dict(
        username=dict(type='str', required=True),
    ),
    supports_check_mode=True
)

这是我目前对组合模块规范的尝试

module = AnsibleModule(
    argument_spec=dict(
        username=dict(type='str', required=True),
        password=dict(type='str', no_log=True, required=False),
        sid=dict(type='str', required=False),
        login_type=dict(
            type='str',
            choices=[ 'sql', 'windows' ],
            default='sql',
            required=False
        )
    ),
    required_if=[
        ('login_type', 'sql', ('password')),
    ],
    supports_check_mode=True
)

我能够满足 password sql login_type 的要求。由于无法为 windows 登录指定 passwordsid,因此如果 login_typewindows,我想阻止使用它们。这可能吗?如果可以,我该怎么做?

如果不对测试进行编码,我看不到您的问题的解决方案:

arguments = dict(
    username=dict(type='str', required=True),
    password=dict(type='str', no_log=True, required=False),
    sid=dict(type='str', required=False),
    login_type=dict(
        type='str',
        choices=[ 'sql', 'windows' ],
        default='sql',
        required=False
            )
)
module = AnsibleModule(
    argument_spec=arguments,
    required_if=[
        ('login_type', 'sql', ('password',)),
    ],
    supports_check_mode=True
)

if module.params['login_type'] == 'windows' and (module.params['password'] or module.params['sid']):
    module.fail_json(msg="unable to use 'login_type=windows' with args 'password' or 'sid'")

仅供参考:我注意到您的代码中有一个错误,您忘记了测试中的 ,

required_if=[
    ('login_type', 'sql', ('password'**,**)),
],

结果:

fatal: [localhost]: FAILED! => {"changed": false, "msg": "unable to use 'login_type=windows' with args 'password' or 'sid'"}