如何在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
相关产品推荐
相关产品推荐

