我们有一个独特的问题,我们花了一些时间来理解这个问题,但我们不确定我们所采取的方法实际上是否正确。我们的目标是验证特定的 UNIX 系统文件/etc/login.def
及其特定值。
出于我们的强化要求的目的,我们希望PASS_MAX_DAYS
在配置文件中捕获logins.def
,并将其状态报告为(绿色正常)或(红色或黄色),这意味着我们需要进一步检查。我们的目标是不是进行更改但捕获此类配置文件的状态。
这是一个代码片段:
---
- name: My Machine
hosts: localhost
gather_facts: true
tasks:
- name: "PASS_MAX_DAYS - 90 Days - Validator"
become: yes
become_user: ansible
tags: PASS_MAX_DAYS
lineinfile:
path: /etc/login.defs
regex: '^PASS_MAX_DAYS\s+'
line: 'PASS_MAX_DAYS 90'
state: present
check_mode: yes
register: PASS_MAX_DAYS_output
这背后的想法很简单:检查文件是否PASS_MAX_DAYS
设置为 90 天,如果是,则报告为(绿色 OK)或跳过,没有问题。如果该值偏离 90 天的值,则继续将其标记为问题(红色或橙色)并捕获该值(使用注册/调试),向执行器输出有意义的消息并将该值捕获到文件中。
注意:我们查看了when
条件,但不确定是否可以使用。我们总是遇到将输出状态设置为“已更改”且消息“已替换行”的问题。
注意:我们需要使正则表达式尽可能通用(为什么,您可能会问),因为一些系统管理员使用单个空格,其他人使用制表符,其他人使用多个空格。因此,我们不想关心每个值之间有多少空格,因为我们只想匹配这些值。
答案1
我会使用“raw”模块,并简单地使用类似的东西:
- name: fetch PASS_MAX_DAYS
raw: awk '/^PASS_MAX_DAYS/ {print $2}' /etc/login.defs
register: PASS_MAX_DAYS_output
- name: check PASS_MAX_DAYS ok
assert:
that:
- "PASS_MAX_DAYS_output.stdout != 90"
msg: "PASS_MAX_DAYS is not 90"
这足够灵活,可以轻松适应其他检查。
答案2
问:“检查文件 PASS_MAX_DAYS 是否设置为 90 天,如果是,则报告为(绿色 OK)或跳过,没有问题。如果该值偏离 90 天值,则继续将其标记为问题(红色或橙色)”
答:Ansible 模块的幂等性是核心范例。在这方面,Ansible 代码应该被视为状态的定义而不是过程。因此,只需运行 Ansible 代码即可确保已设置系统的定义状态。例如剧本
$ cat test.yml
- hosts: localhost
gather_facts: false
tasks:
- lineinfile:
path: /scratch/tmp/login.defs
regex: '^PASS_MAX_DAYS\s+'
line: 'PASS_MAX_DAYS 90'
报告一项任务已更改(以您可能想要配置的任何颜色ANSIBLE_COLOR_CHANGED)
$ ansible-playbook test.yml
PLAY [localhost]
TASK [lineinfile]
changed: [localhost]
PLAY RECAP
localhost: ok=1 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
$ cat /scratch/tmp/login.defs
PASS_MAX_DAYS 90
再次运行 playbook 报告 1 个任务已正常(以您可能想要配置的任何颜色)ANSIBLE_COLOR_OK)
PLAY RECAP
localhost: ok=1 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
审计
如果您不想对系统进行任何更改,只想找出潜在的差异,请在检查模式下运行 playbook
-C, --check
don't make any changes; instead, try to predict some of the changes that may occur
例如剧本
$ cat login.defs
PASS_MAX_DAYS 80
$ ansible-playbook test.yml --check
将报告 1 项任务将被更改。也就是说,审核没有通过。
PLAY [localhost]
TASK [lineinfile]
changed: [localhost]
PLAY RECAP
localhost: ok=1 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
报告
有相当多的回调插件可用的。如果它们都不符合您的目的,可以编写自定义插件,或使用ansible-runner并分析文物。Python模块可用。
问:“/etc/login.defs 文件在文件中具有选项卡式值。如果您针对 unix 平台运行完全相同的测试,您将看到 ansible playbook 的运行状态将始终按更改返回。”
答:你自己选择吧。您想要替换间距,或者想要保持间距不变。空格和制表符都是 login.defs 中的有效分隔符。可以使用反向引用,更改regex
并保持空格不变line
。例如下面的任务
- lineinfile:
path: /scratch/tmp/login.defs
regex: '^PASS_MAX_DAYS(\s+)(\S*)$'
line: 'PASS_MAX_DAYS\g<1>90'
backrefs: true
将不会“总是以改变的方式回来”。