Comments 6
Спасибо огромное за статью, но фитать портянки кода без форматирование очень не удобно
Спасибо большое за интересный и очень практический пример использования ansible.
Но пока читал, меня не отпускало ощущение, что можно все сделать красивее и лаконичнее.
Ребята, Вам не стыдно такое переводить?)
Структура папок:
├── README.md
├── roles
│ └── sudoers
│ ├── tasks
│ │ └── main.yml
│ ├── templates
│ │ └── sudoers.j2
│ └── vars
│ └── main.yml
└── sudoers.yml
Красиво, понятно? А у вас так же, как в источнике.
Серьезно, дали бы какому-то стажеру запустить ваш неработающий плейбук (роль).
Вместо MD5STAT.exists надо MD5STAT.stat.exists.
Халтура, одним словом.
А теперь про культуру.
shell: "grep -v '/etc/sudoers' {{ MD5FILE }} > {{ MD5FILE }}.tmp; {{ csbin }} /etc/sudoers >> {{ MD5FILE }}; mv {{ MD5FILE }}.tmp {{ MD5FILE }}"
Какой смысл переходить на декларативный язык описания, и при этом продолжать тянуть за собой вот такие паровозы?
Как такое поддерживать? Вспоминаются однострочники на перле.
Сравните:
- name: sudoers checksum
shell: "grep -v '/etc/sudoers' {{ MD5FILE }} > {{ MD5FILE }}.tmp ; {{ csbin }} /etc/sudoers >> {{ MD5FILE }} ; mv {{ MD5FILE }}.tmp {{ MD5FILE }}"
when: sudochg.changed or MD5STAT.exists == false
и мой вариант:
- name: sudoers getcksum
command: "{{ csbin }} /etc/sudoers"
register: sudoers_crc
- name: sudoers writecksum
lineinfile:
dest: "{{ MD5FILE }}"
state: present
regexp: " /etc/sudoers$"
line: "{{ sudoers_crc.stdout }}"
create: yes
И мы идем дальше.
Заметьте, там нет " when: sudochg.changed or MD5STAT.stat.exists == false". Не нужно больше.
Целых два блока, нужены лишь для одного, не допустить ошибку типа grep:: No such file or directory
И они нам теперь тоже не нужны:
- name: "Check for checksum file"
stat:
path: "{{ MD5FILE }}"
register: MD5STAT
- name: Ensure MD5FILE
file:
path: "{{ MD5FILE }}"
owner: root
group: "{{ sysgroup }}"
mode: 0600
state: touch
when: MD5STAT.stat.exists == false
Далее, поговорим про MD5, и зачем его пишут файл.
Это делают для простоты проверки контрольных сумм. Скорее всего "некий процесс, который запускается раз в неделю и проверяет контрольную сумму файла " выглядит так:
md5sum -c ~/.sudoer.md5
exit $?
Тогда файл надо генерировать так:
md5sum /etc/sudoers >> ~/.sudoer.md5
А в плейбуке будет так:
- name: sudoers getcksum
stat:
path: "/etc/sudoers"
checksum_algorithm: md5
register: sudoers_crc
- name: update MD5FILE
lineinfile:
dest: "{{ MD5FILE }}"
state: present
regexp: " /etc/sudoers$"
line: "{{ sudoers_crc.stat.checksum }} /etc/sudoers"
create: yes
И два блока set_fact: теперь тоже можно удалить.
К своему стыду, я тоже склонен ансибль использовать как "продвинутый Баш" и Ваш комментарий не в бровь, а в глаз (и соответствует моим ощущениям описанным выше, что автор "мог сделать роль красивее и лаконичнее).
И коли уж улучшения внедрять, то я очень топлю за SaltStack, в котором такой ужас писать не надо
#
# List and clean up backup files. Retain 3 copies.
##
- name: List /etc/sudoers.*~ files
shell: "ls -t /etc/sudoers*~ |tail -n +4"
register: LIST_SUDOERS
changed_when: false
А можно тупо сделать https://docs.saltstack.com/en/latest/ref/states/all/salt.states.file.html
Тут тебе и бекап, и retention
Да, этот кусок, тоже, пример плохого тона, и вспоминается вот этот заголовок:
- name: List /etc/sudoers.*~ files
shell: "ls -t /etc/sudoers*~ |tail -n +4"
register: LIST_SUDOERS
changed_when: false
- name: Cleanup /etc/sudoers.*~ files
file:
path: "{{ item }}"
state: absent
loop: "{{ LIST_SUDOERS.stdout_lines }}"
when: LIST_SUDOERS.stdout_lines != ""
Но, и это можно красиво переписать ансиблом:
- find: path="/etc" patterns="sudoers*"
register: files
- file:
path: "{{ item }}"
state: absent
with_items: "{{ (files.files | sort(attribute='ctime', reverse=True) | map(attribute='path')| list)[3:] }}"
Как видите, все читается, и нет ничего сложного.
Если что-то "сложное", то берем в руки питона и делаем filter_plugins.
- name: sudoers getcksum
command: "{{ csbin }} /etc/sudoers"
register: sudoers_crc
Я бы ещё добавил changed_when: False
, чтобы при проверке плейбуки в check-mode таска не отмечалась как changed.
Shell-скрипты в Ansible