Ansible模块的嵌套参数

时间:2017-09-14 07:23:26

标签: module ansible

我正在开发一个Ansible模块。当一个参数具有特定值时,是否可以将一组参数指定为 required

例如,如果我的模块有'state'参数可以是'present'或'absent',那么只有当state = present时才可能需要一组额外的参数,比如'type','path' ?

module_args = dict(
   name=dict(type='str', required=True),
   type=dict(type='str', required=False),
   path=dict(type='str', required=False),
   state=dict(type='str', required=False, choices=["present","absent"]
}

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

name = module.params["name"]
script_type = module.param["type"]
path = module.param["path"]
state = module.state["state"]

3 个答案:

答案 0 :(得分:1)

据我所知,目前的Ansible 2.3中没有这种能力。

required_together类只有AnsibleModule选项来定义应该一起提供的参数(但是它的值没有条件):

 required_together = [['s3_key', 's3_bucket'],
                     ['vpc_subnet_ids', 'vpc_security_group_ids']]

所以你应该对此进行人工检查。

答案 1 :(得分:0)

虽然在Ansible(AFAIK)中没有嵌套参数这样的概念,但还有其他概念可以实现相同的意图:

  • required_together
  • required_one_of
  • required_if

通过上述声明,可以在参数之间建立关联 - 将其放入逻辑中,如果指定了一个参数,则可以要求另一个参数指定参数。

或者,如果为参数指定了某个值(即State = present),则可以要求使用该参数指定其他参数(给定其值)。

Joe Seeder的blogpost更详细地介绍了这一点。

答案 2 :(得分:0)

不确定是否为时已晚,但是您可以使用以下方法完全做到这一点。

module_args = dict(
   name=dict(type='str', required=True),
   type=dict(type='str', required=False),
   path=dict(type='str', required=False),
   state=dict(type='str', required=False, choices=["present","absent"]
)

required_if_args = [
   ["state", "present", ["type", "path"]]
]

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

这表明如果state = present,则需要输入类型和路径。