2016-01-21 107 views
4

我正在使用现有角色,并且希望对其进行修改以扩展其功能。目前,其任务之一是创建目录。这些目录作为包含字符串列表的变量传递给角色,然后在with_items语句中迭代。不过,我宁愿传递一个形式的字典列表,例如{name: foo, mode: 751}Ansible测试变量类型

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

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

回答

4

为了向后兼容,您可以使用default()

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

如果itemname属性,使用它,否则简单地使用项目本身。

对于字典中可能存在的所有其他属性也是如此。特殊变量omit将忽略该任务的整个选项,就好像没有模式传递给file模块一样。当然你可以设置其他的默认值。

文件的参考资料:

+0

嗯,我确信我已经尝试过..谢谢,这是一个不错的和干净的解决方案!尽管它比我的问题允许的更通用一些(因为我错误地寻找类型检查解决方案),但它恰好符合要求。 – Joost

+1

我知道,它确实没有回答你的问题。 Afaik没有简单的方法来测试类型。 Jinja2有一个测试过滤器'|字符串“,但我从来没有得到它的工作。 '|迭代“过滤器的作品 - 不幸的是一个字符串也是可迭代的...可以为此创建自定义过滤器插件,但是我认为如果可以简单地使用'default',那么这会带来一点开销。至少在这种情况下。 – udondan

+0

是的,包括一个自定义过滤器,可能是一个简单的单行比较差异造成不必要的混乱。 – Joost

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

它告诉我'错误! 'string'是未定义的。你能告诉我一个链接到该功能的文档吗? – Joost

+0

@Joost我使用的是jinja2文档,而不是文档。无论如何,udondan的答案要好得多。 – T0xicCode