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
如果 item
有 name
属性,请使用它,否则只需使用该项目本身。
您的字典中可能包含的所有其他属性也是如此。特殊变量 omit
会从任务中省略整个选项,就好像没有模式被传递给 file
模块一样。当然你可以设置任何其他默认值。
文档参考:
我正在使用现有角色,我希望修改它以扩展其功能。目前,它的任务之一是创建目录。这些目录作为包含字符串列表的变量传递给角色,然后在 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
如果 item
有 name
属性,请使用它,否则只需使用该项目本身。
您的字典中可能包含的所有其他属性也是如此。特殊变量 omit
会从任务中省略整个选项,就好像没有模式被传递给 file
模块一样。当然你可以设置任何其他默认值。
文档参考: