Ansible lineinfile(空格和状态更改)

Ansible lineinfile(空格和状态更改)

我们有一个独特的问题,我们花了一些时间来理解这个问题,但我们不确定我们所采取的方法实际上是否正确。我们的目标是验证特定的 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

将不会“总是以改变的方式回来”

相关内容