我想验证传递给变量的输入值为extra_args。
如果变量包含字符串值,我想运行一个传递的前任务,否则如果它包含其他任何内容则失败。
执行playbook时,值将作为extra_args传递给它们。
答案 0 :(得分:1)
如果变量包含字符串值,我想运行一个传递的前任务,否则如果它包含其他任何内容则失败。
如果variable
不是字符串对象,则此任务失败:
- fail:
when: variable is not string
但请注意,作为extra-vars传递的所有值都将是字符串,因为它们就是这样 - 键盘上键入的任何内容都是有效的字符串。由于没有类型声明,即使变量包含数值,它也将存储在字符串对象中。
与YAML中定义的变量值不同,后者经过YAML解析器执行的类型自动检测。例如,如果您在YAML中键入myvar: true
,它将被视为布尔对象true
,但如果您使用--extra-vars "myvar:true"
传递相同的值,则它将是一个字符串对象true
您需要指定其他条件。
答案 1 :(得分:0)
以下是一些有用的过滤器和测试,您可能会发现它很有用
http://docs.ansible.com/ansible/latest/playbooks_filters.html http://docs.ansible.com/ansible/latest/playbooks_tests.html
用于验证,您可以按如下方式使用它:
tasks:
- fail: msg="Variable '{{ item }}' is not a string"
when: string | search("^[a-zA-Z]*$")
答案 2 :(得分:0)
在这种情况下,我更喜欢使用“断言”模块。
- name: Test if the type of 'variable' is string
assert:
that:
- variable is defined
- variable is string
fail_msg: |
variable: {{ variable | d() | to_nice_json }}
另请参阅:键入检查示例:https://github.com/ssato/ansible-role-assertive-programming-examples/blob/master/tasks/pre_type_checks.yml
顺便说一句,如果要使用--extra-vars(-e)选项定义具有所需类型的变量,则需要准备yaml文件来定义这些变量,并使用'@'加载它们,例如'-e @ / path / to / the / yaml_file”。