You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Ansible Assert测试中使用格式化YAML块文本?

Ansible断言中如何使用块文本进行字符串比较?

我在编写Ansible任务的单元测试时遇到了一个问题:想通过assert模块直接用块文本格式验证blockinfile模块返回的output.block内容,但直接写语法不生效,拼接字符串又可读性极差。

我的测试任务代码如下:

---
- name: Test task
  hosts: localhost
  tasks:
    - name: My test task
      ansible.builtin.blockinfile:
        dest: /my_output.yaml
        block: |
          thing 1
          thing 2
          thing 3
      register: output

- name: Test output
  ansible.builtin.assert:
    that:
      - output.changed == true
      - output.block: |                   # 这里语法错误,断言无法执行
          # BEGIN ANSIBLE MANAGED BLOCK
          thing 1
            thing 2
              thing 3
          # END ANSIBLE MANAGED BLOCK

我确认my_output.yaml的实际输出和断言里的块文本完全匹配(包括缩进),但直接在that列表里用output.block == |的方式无法正确解析块文本,而用\n和空格拼接字符串的方式虽然可行,但代码可读性太差。我知道可以通过读取文件的方式做比较,但这种方法需要额外维护验证文件,可读性也不好。

有没有办法在assert的断言条件里直接使用块文本格式来做比较?


解决方案:通过变量预定义块文本

Ansible的assert模块的that列表中是字符串表达式,无法直接嵌入YAML块文本语法,但可以先将预期的块文本内容定义为变量,再在断言中引用变量进行比较,这样既能保留块文本的可读性,又能完成精确匹配。

修改后的测试代码如下:

---
- name: Test task
  hosts: localhost
  tasks:
    - name: My test task
      ansible.builtin.blockinfile:
        dest: /my_output.yaml
        block: |
          thing 1
          thing 2
          thing 3
      register: output

    - name: Test output
      vars:
        expected_block_content: |
          # BEGIN ANSIBLE MANAGED BLOCK
          thing 1
            thing 2
              thing 3
          # END ANSIBLE MANAGED BLOCK
      ansible.builtin.assert:
        that:
          - output.changed == true
          - output.block == expected_block_content

原理说明

  • 在vars中用YAML块文本(|)定义预期内容,YAML会自动保留文本的换行和缩进格式,生成完整的字符串。
  • 在assert的that条件中,直接比较output.block和预定义变量,既保证代码可读性,又能完成精确字符串匹配。

这种方法不需要额外文件,所有预期内容都集中在任务代码中,比文件对比方式更直观。


内容的提问来源于stack exchange,提问作者Bill Armstrong

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.08 17:42:44