Pull to refresh

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.

Sign up to leave a comment.