vitex
Пояснительная Записка к дипломному проекту
Ну это джинжа И потом ансиблом раскатать на всю группу
Sergey
=))
Sergey
только имена поменять
Константин
А что за тема диплома, если не секрет?
Прохожу преддипломную практику в компании, которая делает СЭД для Роснефти На данный момент у них новые сервера конфигурируются либо руками, либо копию имеющегося сервера делают Там суть в том, что если сервер пустой, то надо сперва alfresco установить на него, а затем настроить платформу, ПО, которое они делают А если на сервере уже все установлено, то просто апдейт делать, если новый релиз был в битбакете Вот собственно я пока прикрутил дженкинс, который мониторит репу, если чет новое появилось, он собирает war файлы, передает их ансиблю, а тот либо с нуля ставит, либо обновление делает
Timur
Можно, в принципе, из любого состояния приводить к нужному. Хоть с нуля, хоть со старой версии
Timur
Только непонятно, зачем тут дженкинс
Константин
Если делать идемпотентную роль, то разницы не будет
Да я знаю, у меня пока все гвоздями прибито
Timur
Если битбакет юзается, так проще Bitbucket Pipelines заюзать
Константин
Только непонятно, зачем тут дженкинс
Хз, в компании дженкинс используют
Timur
А какого рода роли планируете накатывать? Из galaxy подойдут? Или там строго из внутренних реп все?
Константин
Я сам написал 3 роли, они вроде выполняют то, что я хотел, после диплома дорабатывать буду 1. Установка альфрески 2. Настройка СЭД 3. Обновление Конечно, первые две можно объединить в одну, просто все делал в процессе изучения, узнал про роли и решил попробовать
Константин
Из galaxy не брал ничего
Timur
Если альфреско, то и Java, наверное, ставится?
Timur
Под это отдельную роль делали?
Константин
Нет У роли с установкой альфрески просто таск есть, который пакеты ставит нужные через apt
Константин
Да
Timur
Странно
Timur
Логичнее такие вещи разносить, все-таки
Timur
А ставится все только на Linux, или виндовые машины тоже есть?
Константин
Только линукц
Константин
Дебиан и редхат
Константин
--- # tasks file for server_preparation_and_install_alfresco - name: Installing Python2 raw: test -e /usr/bin/python || (apt -y update && apt install -y python-minimal) - name: Installing Required Packages apt: name: ['wget', 'postgresql-client', 'unzip', 'openjdk-8-jdk', 'openjdk-8-jre', 'zip']
Timur
Дебиан и редхат
На редхат тоже через apt ставите? 😊
Константин
На редхат тоже через apt ставите? 😊
Для редхата не делал еще
Константин
Сорре Скопировалось криво С телефона копировал
Константин
Могу гитом поделиться Может какие-то очевидные ошибки подскажете
Timur
Можем подсказать некоторые очевидные моменты
Константин
https://github.com/rex897/alfresco-ansible
George
https://github.com/rex897/alfresco-ansible/blob/d2271784f822146a70940caaf0302bf7d0f39a4c/roles/installing_a_business_platform/tasks/main.yml#L17
George
Ну, например, это
George
Во-первых, service никто нынче не использует. systemctl
George
Во-вторых, есть специальный модуль ансибла для работы с системд-сервисами
Timur
- name: Installing Python2 raw: test -e /usr/bin/python || (apt -y update && apt install -y python-minimal) Вот эту вещь из ролей нужно убирать. Это пререк, который лучше в плейбуку вставить или в претаск
Timur
- name: Installing Required Packages apt: name: ['wget', 'postgresql-client', 'python-psycopg2', 'unzip', 'openjdk-8-jdk', 'openjdk-8-jre', 'zip'] Так делать не стоит. Список лучше классически в столбик делать. Так более читабельно. Пакеты jdk и jre ставить не нужно оба. В jdk уже входит jre
Timur
- name: Alfresco image download shell: wget -O {{ obraz }} http://dl.alfresco.com/release/community/201605-build-00010/alfresco-community-installer-201605-linux-x64.bin when: stat_obraz.stat.exists == False Вот это - сразу в топку. Скачивать образ нужно через get_url. Он сразу и идемпотентность обеспечивает
Timur
Соответственно, пропадает необходимость в проверке пути
Timur
- name: Creating a folder for installation file: path={{ alf_home }} state=directory Строчного синтаксиса в ролях лучше избегать. Он плохо читается. Сразу делайте через map syntax
George
Там ещё какая-то магия с зипами и конфигами https://github.com/rex897/alfresco-ansible/blob/d2271784f822146a70940caaf0302bf7d0f39a4c/roles/installing_a_business_platform/tasks/main.yml#L125
George
Было бы человекопонятное описание что нужно сделать - вероятно, что можно переформулировать
Timur
А полагаться на внешнее хранилище вообще ок?
Вполне ок, почему бы и нет. Но я бы параметризовал это, сделав возможность указать локальный путь к дистру, да
George
Тот же конфиг либо blockinfile, либо template сделать
Timur
with_items меняем на loop. Не нужно плодить legacy код
Timur
- name: systemctl daemon-reload shell: systemctl daemon-reload В топку. Нужно вот так: - name: Reload systemd systemd: daemon_reload: yes И вынести это в хендлеры
Tadeusz
+
George
Да и вообще тупо ansible lint прогнать на весь код :-)
Timur
Так, теперь роль installing_a_business_platform
Константин
Так, теперь роль installing_a_business_platform
По поводу хендлеров Я пытался в этой роли запуск сервисов вынести Но почему-то хендлер только один раз срабатывает
Timur
- name: Postgresql status shell: "{{ alf_home }}/alfresco.sh status postgresql" register: postgresql_status - name: Postgresql start shell: "service postgresql start" when: postgresql_status.stdout == "postgresql not running" Этот кусок кода не нужен. Если нужно убедиться, что postgre запущена, нужно просто сделать: - name: Postgre start systemd: name: postgresql state: started
Константин
А сколько раз нужно?
Там два раза вроде томкат останавливается и два раза запускается
Timur
Там два раза вроде томкат останавливается и два раза запускается
Ща посмотрим. В той роли server_preparation только один reload в конце
Ruslan
Привет. Подскажите пожалуйста в чем может быть проблема? FAILED! => {"changed": false, "msg": "Unable to find any of pip3.6 to use. pip needs to be installed."} pip точно устанволен на хосте # pip pip pip3 pip3.6 [root ~]# whereis pip pip: /usr/local/bin/pip /usr/local/bin/pip3.6
Timur
- name: Removing old files "alfresco.war" and "share.war" file: path: "{{ item }}" state: absent loop: - "{{ catalina_home }}/webapps/alfresco.war" - "{{ catalina_home }}/webapps/share.war" - name: Copying new files "alfresco.war" and "share.war" copy: src={{ item }} dest={{ catalina_home }}/webapps with_items: - alfresco.war - share.war Удалять файлы перед копированием не нужно. Если контент отличается, они перезапишутся и так
Timur
Строчный синтаксис заменить на нормальный
Timur
- name: DB name shell: "cat {{ catalina_home }}/shared/classes/alfresco-global.properties | grep db.name= | cut -f2 -d'='| cut -f1 -d' '" register: db_name - set_fact: db_name={{ db_name.stdout }} - name: DB pass shell: "cat {{ catalina_home }}/shared/classes/alfresco-global.properties | grep db.password= | cut -f2 -d'='| cut -f1 -d' '" register: db_pass - set_fact: db_pass={{ db_pass.stdout }} - name: Port shell: "cat {{ catalina_home }}/shared/classes/alfresco-global.properties | grep share.host= | cut -f2 -d'='| cut -f1 -d' '" register: share_host - set_fact: share_host={{ share_host.stdout }} Этот треш тоже нужно переделать. Для чтения переменных из файла есть нативные инструменты
Timur
- name: Unpacking businessjournal.war shell: "unzip -qq {{ catalina_home }}/webapps/businessjournal.war -d {{ catalina_home }}/webapps" В топку. Используйте модуль unarchive
George
Ну, и окружения могут быть разные... Пользователь какой ?
Timur
Там два раза вроде томкат останавливается и два раза запускается
Зачем, кстати, двойной перезапуск нужен? Из кода непонятно
Ruslan
пользователь ansible
Константин
Первый запуск чтоб варники развернулись, потом их удаляю, чтоб повторно не разворачивались, потом запускаю опять для работы
George
что значит вручную указать?
Впрямую. Там в параметрах модуля Пип это вроде есть
George
Либо попробуйте Шелл командой , а потом отрефакторить нормально
Артём
А как в современном синтаксисе сделать loop по списку словарей? То, что раньше было --- vars: somelist: - src: s_one dst: d_one - src: s_two dst: d_two tasks: - name: copy files to paths copy: src: ‘{{ item.src }}’ dest: ‘{{ item.dst }}’ with_items: ‘{{ somelist }}’
George
То же самое, по сути
Артём
Просто название поменялось?..