如何使用 Ansible 验证文件是否具有特定的子字符串?

How to validate that a file has a specific substring with Ansible?

我想在我的 Ansible 游戏中有一个 assertfail 任务来验证是否部署了正确的代码构建。部署附带一个 version.properties 文件,其中包含我关心的构建信息。

'correct' 代码版本来自一个 vars 文件,名为 desired_build_id

如何验证我的 version.properties 提到了这个构建 ID?某种子字符串搜索?

我试过以下方法:

--- 
- name: Validate deployment success
  hosts: app-nodes
  tasks:
    - name: Read version.properties file
      shell: cat /path/to/version.properties
      register: version_prop_content

    - fail: Wrong build ID found in version.properties
      when: desired_build_id not in version_prop_content.stdout 

然而,这给出了一个错误:error while evaluating conditional: esired_build_id not in version_prop_content.stdout

正确的语法是什么?或者,有更好的方法吗?

想通了!

进行子字符串比较的方法是 version_prop_content.stdout.find(desired_build_id) > 0 如果存在子字符串则为真

find 命令 returns 子字符串的索引,如果不存在则为 -1。

我还将它更改为断言任务,使它看起来更漂亮(fail 是一个丑陋的词;))。

- name: Check that desired version was deployed
  assert:
    that: 
      - version_prop_content.stdout.find(desired_build_id) > 0

更简单的 python 表达式也可以:

- name: Read version.properties file
  shell: cat /path/to/version.properties
  register: version_prop_content

- debug: msg="desired build installed"
  when: "'{{desired_build_id}}' in '{{version_prop_content.stdout}}'"

或者像我一直建议的那样,尽可能避免使用 ansible

- name: verify version
  shell: grep '{{desired_build_id}}' /path/to/version.properties