Ansible YAML中shell命令感叹号被移除,如何保留该符号?
Ansible YAML中保留shell命令开头感叹号的解决方案
在Ansible的Ubuntu 20.04 STIG加固任务中,shell模块的命令使用感叹号!实现取反逻辑,但YAML会将开头的!识别为特殊标签语法,导致解析时丢失该符号,原本的命令:
shell: ! systemctl list-unit-files | grep "^ufw.service[ \t]\+"
被解析为:
shell: systemctl list-unit-files | grep "^ufw.service[ \t]\+"
直接破坏了命令的取反逻辑。此前尝试过标签定义、自定义构造器等方案均无效,以下是可行的解决方法:
用单引号包裹整个命令:YAML会将单引号内的内容视为纯字符串,不会解析开头的
!,写法如下:shell: '! systemctl list-unit-files | grep "^ufw.service[ \t]\+"'使用YAML折叠块标量(|):通过块标量保留命令的原始格式,开头的
!会被完整保留,适合单行或多行命令:shell: | ! systemctl list-unit-files | grep "^ufw.service[ \t]\+"替换取反逻辑(可选):如果不想依赖shell的
!,可以调整命令和Ansible条件判断。例如将命令改为正常的grep,然后通过判断返回码取反:shell: systemctl list-unit-files | grep "^ufw.service[ \t]\+" changed_when: False check_mode: no register: result # 原逻辑是!grep返回0时执行,对应grep返回1时执行 when: - ubuntu2004STIG_stigrule_238374_Manage - result.rc == 1这种方式避开了YAML对
!的解析问题,逻辑更符合Ansible的写法习惯。
内容的提问来源于Stack Exchange,提问作者Zafer Balkan
相关产品推荐
相关产品推荐

