如何使用Ansible检查服务器文件的合规配置?
Ansible 实现file1配置合规性检查(仅验证不修改)
针对你的需求,我们可以通过Ansible多个模块组合实现仅检查不修改的配置合规验证,以下是具体方案:
核心验证逻辑
- 强制文件第一行严格匹配
search www.mysebsite.com - 确保文件中至少存在2行符合
nameserver x.x.x.x格式的配置(IP需为合法IPv4地址) - 所有任务仅做检查,不修改目标文件
具体Playbook代码
- name: 检查file1配置合规性 hosts: myservers gather_facts: no tasks: # 验证第一行是否为指定search配置 - name: 获取文件第一行内容 ansible.builtin.shell: head -n1 /path/to/file1 # 替换为实际文件路径 register: first_line changed_when: false # 标记任务无变更,避免误报 - name: 校验第一行合规性 ansible.builtin.assert: that: - first_line.stdout == 'search www.mysebsite.com' fail_msg: "错误:文件第一行必须为'search www.mysebsite.com'" success_msg: "第一行配置合规" # 验证nameserver行数及IP格式 - name: 统计符合格式的nameserver行数 ansible.builtin.shell: grep -c '^nameserver \d\{1,3\}\.\d\{1,3\}\.\d\{1,3\}\.\d\{1,3\}$' /path/to/file1 register: ns_count changed_when: false - name: 校验nameserver行数达标 ansible.builtin.assert: that: - ns_count.stdout | int >= 2 fail_msg: "错误:文件中至少需要2行符合格式的nameserver配置" success_msg: "nameserver行数合规" # 额外校验每个nameserver的IP合法性 - name: 提取所有nameserver的IP地址 ansible.builtin.shell: grep '^nameserver ' /path/to/file1 | awk '{print $2}' register: ns_ips changed_when: false - name: 逐个验证IP格式 ansible.builtin.assert: that: - item is ipv4 fail_msg: "错误:无效IPv4地址 {{ item }}" success_msg: "IPv4地址 {{ item }} 格式合法" loop: "{{ ns_ips.stdout_lines }}"
关于lineinfile模块的替代用法
如果仅需验证search www.mysebsite.com行存在(不限制位置),可以直接用lineinfile做检查:
- name: 检查search配置行存在 ansible.builtin.lineinfile: path: /path/to/file1 regexp: '^search www.mysebsite.com$' line: 'search www.mysebsite.com' state: present check_mode: yes # 仅执行检查逻辑,不修改文件 register: search_check failed_when: search_check.changed # 若需要修改(行不存在或不符)则任务失败
运行方式
将Playbook保存为check_file1.yml,执行命令:
ansible-playbook check_file1.yml
配置不合规时会直接抛出错误并提示具体问题;全部合规则输出成功信息。
内容的提问来源于stack exchange,提问作者fr0zt
相关产品推荐
相关产品推荐

