Ansible测试变量类型

时间:2016-01-21 16:28:53

标签: jinja2 ansible

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

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

有没有办法测试变量的类型,然后根据它返回不同的值(或执行不同的任务)?也许使用Jinja2过滤器?我简要地看了一下手册中列出的conditionals,但在这种情况下我没有看到任何可以使用的内容。

2 个答案:

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