2

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

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

虽然它是 Windows 主机的 Powershell 模块,但我将使用 Python 示例,因为这就是文档所在的内容。

这是创建 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
)

我能够passwordsql login_type. 由于password并且sid不能为 Windows 登录指定,所以我想防止它们被使用 if login_typeis windows。这可能吗?如果可以,我该怎么做?

4

1 回答 1

1

嗯,如果不编写测试代码,我看不到您的问题的解决方案:

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'"}
于 2022-02-25T07:08:15.087 回答