Ansible 测试变量类型

Ansible testing variable type

我正在使用现有角色,我希望修改它以扩展其功能。目前,它的任务之一是创建目录。这些目录作为包含字符串列表的变量传递给角色,然后在 with_items 语句中迭代。但是,我更愿意传递表单的字典列表,例如{name: foo, mode: 751}.

到目前为止一切顺利;我可以简单地编辑角色,让它接受这种输入。但是,我也想让它向后兼容旧格式,即项目是字符串的地方。

有没有办法测试一个变量的类型,然后根据这个return不同的值(或执行不同的任务)?也许使用 Jinja2 过滤器?我简单地查看了手册中列出的 conditionals,但没有引起我的注意可以在这种情况下使用。

最快的解决方案是有两个任务,并让它们在相反的条件下触发。不幸的是,列表中的所有项目都必须使用相同的形式(您不能混合和匹配字符串和字典)。

- 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])

您可以使用 default() 实现向后兼容性。

- file:
    path: "{{ item.name | default(item) }}"
    mode: "{{ item.mode | default(omit) }}"
    state: directory
  with_items: your_list

如果 itemname 属性,请使用它,否则只需使用该项目本身。

您的字典中可能包含的所有其他属性也是如此。特殊变量 omit 会从任务中省略整个选项,就好像没有模式被传递给 file 模块一样。当然你可以设置任何其他默认值。

文档参考: