如何检查Ansible playbook中定义的变量是否包含字符串值?

时间:2017-10-09 09:00:33

标签: ansible

我想验证传递给变量的输入值为extra_args。

如果变量包含字符串值,我想运行一个传递的前任务,否则如果它包含其他任何内容则失败。

执行playbook时,值将作为extra_args传递给它们。

3 个答案:

答案 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”。