Ansible执行egrep命令遇非零返回码,求引号使用及命令修正方案
问题分析与解决方案
核心问题
你遇到的非零返回码错误,和引号无关——当前Playbook里的引号写法是正确的。问题出在egrep命令的特性:当它在文件中找不到匹配内容时,会返回退出码1,而Ansible默认会把非0退出码判定为任务失败,所以触发了错误。另外,如果AIDE压根没安装,/etc/aide.conf文件可能不存在,这时候egrep会返回退出码2,同样会触发Ansible的失败判定。
解决方案
1. 忽略非零退出码,自行判断结果
给shell任务添加failed_when: false,让Ansible不管egrep返回什么码都不标记任务失败,之后通过注册的变量判断结果:
- name: "Verify AIDE to cryptographic mechanisms are set to protect the integrity of audit tools" become: true shell: egrep '(\/usr\/sbin\/(audit|au|rsys))' /etc/aide.conf register: AIDE_Status failed_when: false changed_when: false # 标记任务不会改变系统状态 - name: 输出AIDE配置检查结果 debug: msg: "AIDE已配置审计工具完整性保护规则" when: AIDE_Status.rc == 0 - name: 输出缺失提示 debug: msg: "AIDE未配置审计工具完整性保护规则,或配置文件不存在" when: AIDE_Status.rc != 0
2. 先检查AIDE是否安装+配置文件是否存在
更严谨的做法是先确认AIDE已安装且配置文件存在,再执行检查:
- name: 检查AIDE是否已安装 package: name: aide state: present register: aide_installed ignore_errors: true # 如果只需要检查而不安装,保留此配置;如果要自动安装则移除 - name: 检查AIDE配置文件是否存在 stat: path: /etc/aide.conf register: aide_conf - name: 验证AIDE配置审计工具保护规则 become: true shell: egrep '(\/usr\/sbin\/(audit|au|rsys))' /etc/aide.conf register: AIDE_Status failed_when: false changed_when: false when: aide_conf.stat.exists - name: 输出最终检查结果 debug: msg: | AIDE状态: {{ "已安装" if aide_installed is succeeded else "未安装" }} 配置规则状态: {{ "已配置" if (aide_conf.stat.exists and AIDE_Status.rc == 0) else "未配置/配置文件不存在" }}
关于引号的说明
你当前的写法完全正确:YAML中用双引号包裹shell参数值,内部的单引号属于egrep命令的一部分,不需要转义。无论是单引号还是双引号,只要YAML语法正确,都不会影响命令执行——你的问题根源不在引号上。
内容的提问来源于stack exchange,提问作者Mr_Tech
相关产品推荐
相关产品推荐

