我使用的是现有角色,我希望对其进行修改以扩展其功能。目前,其任务之一是创建目录。这些目录作为包含字符串列表的变量传递给角色,然后在with_items
语句中迭代。但是,我更愿意传递表格的字典列表,例如{name: foo, mode: 751}
。
到目前为止一切顺利;我可以简单地编辑角色以使其采用这种输入。但是,我也想让它向后兼容旧格式,即项目是字符串。
有没有办法测试变量的类型,然后根据它返回不同的值(或执行不同的任务)?也许使用Jinja2过滤器?我简要地看了一下手册中列出的conditionals,但在这种情况下我没有看到任何可以使用的内容。
答案 0 :(得分:6)
您可以使用default()
向后兼容。
- file:
path: "{{ item.name | default(item) }}"
mode: "{{ item.mode | default(omit) }}"
state: directory
with_items: your_list
如果item
具有name
属性,请使用它,否则只需使用该项目。
您的dict中可能包含的所有其他属性也是如此。特殊变量omit
将省略任务中的整个选项,就好像没有模式传递给file
模块一样。当然你可以设置任何其他默认值。
文档参考:
答案 1 :(得分:1)
最快的解决方案是完成两项任务,并在相反条件下触发。不幸的是,列表中的所有项目都必须使用相同的表单(您不能混合使用字符串和词组)。
- name: create dirs (strings)
file:
...
with_items: items
when: string(items[0])
- name: create dirs (dicts)
file:
...
with_items: items
when: not string(items[0])