Ansible lineinfile (пробелы и изменения состояния)

Вот как можно создать образ диска ext4 объемом 12 ГБ, который затем можно будет монтировать автоматически при загрузке:

  1. Создайте файл образа:fallocate -l 12G /path/to/image.img
  2. Создать файловую систему в файле:mkfs.ext4 /path/to/image.img
  3. Автоматическое монтирование файловой системы:echo "/path/to/image.img /srv/data ext4 defaults,auto,loop 0 0" >>/etc/fstab
0
31.01.2020, 09:51
2 ответа

Я бы использовал "сырой" модуль и просто использовал что-то вроде:

- 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"

Это достаточно гибко, чтобы легко адаптироваться к другим проверкам.

0
28.04.2021, 23:24

Q: "Check the file if PASS_MAX_DAYS is set to 90 days, and if so, report back as (Green OK) or Skip without issues. If the value deviates from the 90 day value proceed to flag it as an issue (Red or Orange)"

A :Идемпотентность модулей Ansible является основной парадигмой. В этом отношении код Ansible следует рассматривать скорее как определение состояния, чем как процедуру. В результате просто запустите код Ansible, чтобы убедиться, что заданное состояние системы установлено. Например, playbook

$ 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

Повторный запуск плейбука сообщил, что 1 задача выполнена успешно (в любом цвете, который вы можете настроить в ANSIBLE _COLOR _OK)

PLAY RECAP
localhost: ok=1    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

Аудит

Если вы не хотите вносить какие-либо изменения в систему, а вместо этого хотите выяснить только возможные различия, запустите плейбук в режиме проверки

-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 .


Q: "The /etc/login.defs file has tabbed values within the file. If you run the exact same test against a unix platform you'll see that the run status of your ansible playbook will always come back as changed."

A :Сделайте свой выбор. Либо вы хотите заменить интервал, либо оставить его как есть. И пробелы, и табуляции являются допустимыми разделителями в файле 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

не будет "всегда возвращаться измененным" .

0
28.04.2021, 23:24

Теги

Похожие вопросы