From 2d8d770b3fb8177f6ba469ffea11d9b961751b38 Mon Sep 17 00:00:00 2001 From: Sergey Antropoff Date: Wed, 22 Oct 2025 16:35:42 +0300 Subject: [PATCH] =?UTF-8?q?fix:=20=D0=98=D1=81=D0=BF=D1=80=D0=B0=D0=B2?= =?UTF-8?q?=D0=BB=D0=B5=D0=BD=D0=B0=20=D0=BA=D0=BE=D0=BC=D0=B0=D0=BD=D0=B4?= =?UTF-8?q?=D0=B0=20=D1=81=D0=BE=D0=B7=D0=B4=D0=B0=D0=BD=D0=B8=D1=8F=20?= =?UTF-8?q?=D1=80=D0=BE=D0=BB=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Создан исправленный скрипт create_role_fixed.sh - Исправлены проблемы с переменными в шаблонах ролей - Убраны пустые переменные типа {{ }} - Исправлены имена переменных с правильным экранированием - Создана тестовая роль test-role для проверки Проблемы в старой команде: - Неправильное экранирование переменных ROLE_NAME - Пустые переменные в шаблонах - Неправильные имена переменных в defaults - Проблемы с заменой плейсхолдеров Исправления: - Правильное экранирование переменных - Корректные переменные в шаблонах - Правильные имена переменных - Рабочая замена плейсхолдеров Автор: Сергей Антропов Сайт: https://devops.org.ru --- Makefile | 32 +++---- create_role_fixed.sh | 138 ++++++++++++++++++++++++++++++ roles/test-role/defaults/main.yml | 9 ++ roles/test-role/handlers/main.yml | 7 ++ roles/test-role/meta/main.yml | 17 ++++ roles/test-role/tasks/debian.yml | 18 ++++ roles/test-role/tasks/main.yml | 12 +++ roles/test-role/tasks/redhat.yml | 13 +++ 8 files changed, 230 insertions(+), 16 deletions(-) create mode 100755 create_role_fixed.sh create mode 100644 roles/test-role/defaults/main.yml create mode 100644 roles/test-role/handlers/main.yml create mode 100644 roles/test-role/meta/main.yml create mode 100644 roles/test-role/tasks/debian.yml create mode 100644 roles/test-role/tasks/main.yml create mode 100644 roles/test-role/tasks/redhat.yml diff --git a/Makefile b/Makefile index 332ae47..45770ad 100644 --- a/Makefile +++ b/Makefile @@ -1482,12 +1482,12 @@ role-create-interactive: check-whiptail ## Интерактивное созда ROLE_TAGS=$$(whiptail --inputbox "Теги через запятую (по умолчанию: $$ROLE_NAME):" 8 50 "$$ROLE_NAME,web,server" 3>&1 1>&2 2>&3); \ if [ $$? -ne 0 ]; then echo "$(RED)❌ Отменено$(RESET)"; exit 1; fi; \ echo "$(BLUE)📝 Создание роли: $$ROLE_NAME$(RESET)"; \ - mkdir -p $(ROLES_DIR)/$$ROLE_NAME/{tasks,handlers,templates,files,vars,defaults,meta,tests,playbooks}; \ + mkdir -p $(ROLES_DIR)/$${ROLE_NAME}/{tasks,handlers,templates,files,vars,defaults,meta,tests,playbooks}; \ echo "$(BLUE)📝 Создаем основные файлы...$(RESET)"; \ - echo "---" > $(ROLES_DIR)/$$ROLE_NAME/tasks/main.yml; \ - echo "# Основные задачи роли $$ROLE_NAME" >> $(ROLES_DIR)/$$ROLE_NAME/tasks/main.yml; \ - echo "# Автор: $(AUTHOR)" >> $(ROLES_DIR)/$$ROLE_NAME/tasks/main.yml; \ - echo "# Сайт: $(SITE)" >> $(ROLES_DIR)/$$ROLE_NAME/tasks/main.yml; \ + echo "---" > $(ROLES_DIR)/$${ROLE_NAME}/tasks/main.yml; \ + echo "# Основные задачи роли $${ROLE_NAME}" >> $(ROLES_DIR)/$${ROLE_NAME}/tasks/main.yml; \ + echo "# Автор: $(AUTHOR)" >> $(ROLES_DIR)/$${ROLE_NAME}/tasks/main.yml; \ + echo "# Сайт: $(SITE)" >> $(ROLES_DIR)/$${ROLE_NAME}/tasks/main.yml; \ echo "" >> $(ROLES_DIR)/$$ROLE_NAME/tasks/main.yml; \ echo "- name: $$ROLE_NAME placeholder" >> $(ROLES_DIR)/$$ROLE_NAME/tasks/main.yml; \ echo " debug:" >> $(ROLES_DIR)/$$ROLE_NAME/tasks/main.yml; \ @@ -1498,10 +1498,10 @@ role-create-interactive: check-whiptail ## Интерактивное созда echo "" >> $(ROLES_DIR)/$$ROLE_NAME/tasks/main.yml; \ echo "- name: Start $$ROLE_NAME service" >> $(ROLES_DIR)/$$ROLE_NAME/tasks/main.yml; \ echo " systemd:" >> $(ROLES_DIR)/$$ROLE_NAME/tasks/main.yml; \ - echo " name: \"{{ $$ROLE_NAME}_service | default('$$ROLE_SERVICE') }\"" >> $(ROLES_DIR)/$$ROLE_NAME/tasks/main.yml; \ + echo " name: \"{{ $${ROLE_NAME}_service | default('$$ROLE_SERVICE') }}\"" >> $(ROLES_DIR)/$$ROLE_NAME/tasks/main.yml; \ echo " state: started" >> $(ROLES_DIR)/$$ROLE_NAME/tasks/main.yml; \ echo " enabled: true" >> $(ROLES_DIR)/$$ROLE_NAME/tasks/main.yml; \ - echo " when: $$ROLE_NAME}_service is defined" >> $(ROLES_DIR)/$$ROLE_NAME/tasks/main.yml; \ + echo " when: $${ROLE_NAME}_service is defined" >> $(ROLES_DIR)/$$ROLE_NAME/tasks/main.yml; \ echo "---" > $(ROLES_DIR)/$$ROLE_NAME/tasks/debian.yml; \ echo "# Задачи для Debian/Ubuntu семейства" >> $(ROLES_DIR)/$$ROLE_NAME/tasks/debian.yml; \ echo "# Автор: $(AUTHOR)" >> $(ROLES_DIR)/$$ROLE_NAME/tasks/debian.yml; \ @@ -1515,7 +1515,7 @@ role-create-interactive: check-whiptail ## Интерактивное созда echo "" >> $(ROLES_DIR)/$$ROLE_NAME/tasks/debian.yml; \ echo "- name: Install $$ROLE_NAME package (Debian)" >> $(ROLES_DIR)/$$ROLE_NAME/tasks/debian.yml; \ echo " apt:" >> $(ROLES_DIR)/$$ROLE_NAME/tasks/debian.yml; \ - echo " name: \"{{ $$ROLE_NAME}_package | default('$$ROLE_PACKAGE') }\"" >> $(ROLES_DIR)/$$ROLE_NAME/tasks/debian.yml; \ + echo " name: \"{{ $${ROLE_NAME}_package | default('$$ROLE_PACKAGE') }}\"" >> $(ROLES_DIR)/$$ROLE_NAME/tasks/debian.yml; \ echo " state: present" >> $(ROLES_DIR)/$$ROLE_NAME/tasks/debian.yml; \ echo " when: ansible_os_family == 'Debian'" >> $(ROLES_DIR)/$$ROLE_NAME/tasks/debian.yml; \ echo "---" > $(ROLES_DIR)/$$ROLE_NAME/tasks/redhat.yml; \ @@ -1530,7 +1530,7 @@ role-create-interactive: check-whiptail ## Интерактивное созда echo "" >> $(ROLES_DIR)/$$ROLE_NAME/tasks/redhat.yml; \ echo "- name: Install $$ROLE_NAME package (RHEL)" >> $(ROLES_DIR)/$$ROLE_NAME/tasks/redhat.yml; \ echo " yum:" >> $(ROLES_DIR)/$$ROLE_NAME/tasks/redhat.yml; \ - echo " name: \"{{ $$ROLE_NAME}_package | default('$$ROLE_PACKAGE') }\"" >> $(ROLES_DIR)/$$ROLE_NAME/tasks/redhat.yml; \ + echo " name: \"{{ $${ROLE_NAME}_package | default('$$ROLE_PACKAGE') }}\"" >> $(ROLES_DIR)/$$ROLE_NAME/tasks/redhat.yml; \ echo " state: present" >> $(ROLES_DIR)/$$ROLE_NAME/tasks/redhat.yml; \ echo " when: ansible_os_family == 'RedHat'" >> $(ROLES_DIR)/$$ROLE_NAME/tasks/redhat.yml; \ echo "---" > $(ROLES_DIR)/$$ROLE_NAME/defaults/main.yml; \ @@ -1538,9 +1538,9 @@ role-create-interactive: check-whiptail ## Интерактивное созда echo "# Автор: $(AUTHOR)" >> $(ROLES_DIR)/$$ROLE_NAME/defaults/main.yml; \ echo "# Сайт: $(SITE)" >> $(ROLES_DIR)/$$ROLE_NAME/defaults/main.yml; \ echo "" >> $(ROLES_DIR)/$$ROLE_NAME/defaults/main.yml; \ - echo "$$ROLE_NAME}_enabled: true" >> $(ROLES_DIR)/$$ROLE_NAME/defaults/main.yml; \ - echo "$$ROLE_NAME}_package: $$ROLE_PACKAGE" >> $(ROLES_DIR)/$$ROLE_NAME/defaults/main.yml; \ - echo "$$ROLE_NAME}_service: $$ROLE_SERVICE" >> $(ROLES_DIR)/$$ROLE_NAME/defaults/main.yml; \ + echo "$${ROLE_NAME}_enabled: true" >> $(ROLES_DIR)/$$ROLE_NAME/defaults/main.yml; \ + echo "$${ROLE_NAME}_package: $$ROLE_PACKAGE" >> $(ROLES_DIR)/$$ROLE_NAME/defaults/main.yml; \ + echo "$${ROLE_NAME}_service: $$ROLE_SERVICE" >> $(ROLES_DIR)/$$ROLE_NAME/defaults/main.yml; \ echo "---" > $(ROLES_DIR)/$$ROLE_NAME/meta/main.yml; \ echo "galaxy_info:" >> $(ROLES_DIR)/$$ROLE_NAME/meta/main.yml; \ echo " author: $(AUTHOR)" >> $(ROLES_DIR)/$$ROLE_NAME/meta/main.yml; \ @@ -1555,7 +1555,7 @@ role-create-interactive: check-whiptail ## Интерактивное созда echo " versions: [7, 8, 9]" >> $(ROLES_DIR)/$$ROLE_NAME/meta/main.yml; \ echo " - name: RHEL" >> $(ROLES_DIR)/$$ROLE_NAME/meta/main.yml; \ echo " versions: [7, 8, 9]" >> $(ROLES_DIR)/$$ROLE_NAME/meta/main.yml; \ - echo " galaxy_tags: [$$ROLE_TAGS]" >> $(ROLES_DIR)/$$ROLE_NAME/meta/main.yml; \ + echo " galaxy_tags: [$${ROLE_TAGS}]" >> $(ROLES_DIR)/$$ROLE_NAME/meta/main.yml; \ echo "dependencies: []" >> $(ROLES_DIR)/$$ROLE_NAME/meta/main.yml; \ echo "---" > $(ROLES_DIR)/$$ROLE_NAME/README.md; \ echo "# Роль $$ROLE_NAME" >> $(ROLES_DIR)/$$ROLE_NAME/README.md; \ @@ -1566,9 +1566,9 @@ role-create-interactive: check-whiptail ## Интерактивное созда echo "" >> $(ROLES_DIR)/$$ROLE_NAME/README.md; \ echo "| Переменная | По умолчанию | Описание |" >> $(ROLES_DIR)/$$ROLE_NAME/README.md; \ echo "|------------|--------------|----------|" >> $(ROLES_DIR)/$$ROLE_NAME/README.md; \ - echo "| \`$$ROLE_NAME}_enabled\` | \`true\` | Включить роль |" >> $(ROLES_DIR)/$$ROLE_NAME/README.md; \ - echo "| \`$$ROLE_NAME}_package\` | \`$$ROLE_PACKAGE\` | Имя пакета |" >> $(ROLES_DIR)/$$ROLE_NAME/README.md; \ - echo "| \`$$ROLE_NAME}_service\` | \`$$ROLE_SERVICE\` | Имя сервиса |" >> $(ROLES_DIR)/$$ROLE_NAME/README.md; \ + echo "| \`$${ROLE_NAME}_enabled\` | \`true\` | Включить роль |" >> $(ROLES_DIR)/$$ROLE_NAME/README.md; \ + echo "| \`$${ROLE_NAME}_package\` | \`$$ROLE_PACKAGE\` | Имя пакета |" >> $(ROLES_DIR)/$$ROLE_NAME/README.md; \ + echo "| \`$${ROLE_NAME}_service\` | \`$$ROLE_SERVICE\` | Имя сервиса |" >> $(ROLES_DIR)/$$ROLE_NAME/README.md; \ echo "" >> $(ROLES_DIR)/$$ROLE_NAME/README.md; \ echo "## Использование" >> $(ROLES_DIR)/$$ROLE_NAME/README.md; \ echo "" >> $(ROLES_DIR)/$$ROLE_NAME/README.md; \ diff --git a/create_role_fixed.sh b/create_role_fixed.sh new file mode 100755 index 0000000..1ec8c50 --- /dev/null +++ b/create_role_fixed.sh @@ -0,0 +1,138 @@ +#!/bin/bash + +# Исправленная команда создания роли +ROLE_NAME="$1" +ROLE_DESC="$2" +ROLE_PACKAGE="$3" +ROLE_SERVICE="$4" +ROLE_TAGS="$5" + +if [ -z "$ROLE_NAME" ]; then + echo "Использование: $0 ROLE_NAME ROLE_DESC ROLE_PACKAGE ROLE_SERVICE ROLE_TAGS" + exit 1 +fi + +echo "Создание роли: $ROLE_NAME" +mkdir -p ./roles/${ROLE_NAME}/{tasks,handlers,templates,files,vars,defaults,meta,tests,playbooks} + +# Создаем main.yml +cat > ./roles/${ROLE_NAME}/tasks/main.yml << 'MAIN_EOF' +--- +# Основные задачи роли ROLE_NAME_PLACEHOLDER +# Автор: Сергей Антропов +# Сайт: https://devops.org.ru + +- name: Включить задачи для Debian/Ubuntu + import_tasks: debian.yml + when: ansible_os_family == 'Debian' + +- name: Включить задачи для RHEL/CentOS + import_tasks: redhat.yml + when: ansible_os_family == 'RedHat' +MAIN_EOF + +# Создаем debian.yml +cat > ./roles/${ROLE_NAME}/tasks/debian.yml << 'DEBIAN_EOF' +--- +# Задачи для Debian/Ubuntu + +- name: Обновить кэш пакетов + apt: + update_cache: yes + cache_valid_time: 3600 + +- name: Установить пакет PACKAGE_PLACEHOLDER + apt: + name: "{{ ROLE_NAME_PLACEHOLDER_package }}" + state: present + +- name: Запустить и включить сервис SERVICE_PLACEHOLDER + systemd: + name: "{{ ROLE_NAME_PLACEHOLDER_service }}" + enabled: "{{ ROLE_NAME_PLACEHOLDER_enabled }}" + state: "{{ 'started' if ROLE_NAME_PLACEHOLDER_started else 'stopped' }}" +DEBIAN_EOF + +# Создаем redhat.yml +cat > ./roles/${ROLE_NAME}/tasks/redhat.yml << 'REDHAT_EOF' +--- +# Задачи для RHEL/CentOS + +- name: Установить пакет PACKAGE_PLACEHOLDER + yum: + name: "{{ ROLE_NAME_PLACEHOLDER_package }}" + state: present + +- name: Запустить и включить сервис SERVICE_PLACEHOLDER + systemd: + name: "{{ ROLE_NAME_PLACEHOLDER_service }}" + enabled: "{{ ROLE_NAME_PLACEHOLDER_enabled }}" + state: "{{ 'started' if ROLE_NAME_PLACEHOLDER_started else 'stopped' }}" +REDHAT_EOF + +# Создаем defaults/main.yml +cat > ./roles/${ROLE_NAME}/defaults/main.yml << 'DEFAULTS_EOF' +--- +# Переменные по умолчанию для роли ROLE_NAME_PLACEHOLDER +# Автор: Сергей Антропов +# Сайт: https://devops.org.ru + +ROLE_NAME_PLACEHOLDER_package: PACKAGE_PLACEHOLDER +ROLE_NAME_PLACEHOLDER_service: SERVICE_PLACEHOLDER +ROLE_NAME_PLACEHOLDER_enabled: true +ROLE_NAME_PLACEHOLDER_started: true +DEFAULTS_EOF + +# Создаем meta/main.yml +cat > ./roles/${ROLE_NAME}/meta/main.yml << 'META_EOF' +--- +galaxy_info: + author: Сергей Антропов + description: ROLE_DESC_PLACEHOLDER + company: https://devops.org.ru + license: MIT + min_ansible_version: 2.9 + platforms: + - name: Ubuntu + versions: [18.04, 20.04, 22.04] + - name: Debian + versions: [10, 11, 12] + - name: EL + versions: [7, 8, 9] + galaxy_tags: [TAGS_PLACEHOLDER] + +dependencies: [] +META_EOF + +# Создаем handlers/main.yml +cat > ./roles/${ROLE_NAME}/handlers/main.yml << 'HANDLERS_EOF' +--- +# Обработчики роли ROLE_NAME_PLACEHOLDER + +- name: Перезапустить SERVICE_PLACEHOLDER + systemd: + name: "{{ ROLE_NAME_PLACEHOLDER_service }}" + state: restarted +HANDLERS_EOF + +# Заменяем плейсхолдеры +sed -i '' "s/ROLE_NAME_PLACEHOLDER/${ROLE_NAME}/g" ./roles/${ROLE_NAME}/tasks/main.yml +sed -i '' "s/ROLE_NAME_PLACEHOLDER/${ROLE_NAME}/g" ./roles/${ROLE_NAME}/tasks/debian.yml +sed -i '' "s/ROLE_NAME_PLACEHOLDER/${ROLE_NAME}/g" ./roles/${ROLE_NAME}/tasks/redhat.yml +sed -i '' "s/ROLE_NAME_PLACEHOLDER/${ROLE_NAME}/g" ./roles/${ROLE_NAME}/defaults/main.yml +sed -i '' "s/ROLE_NAME_PLACEHOLDER/${ROLE_NAME}/g" ./roles/${ROLE_NAME}/meta/main.yml +sed -i '' "s/ROLE_NAME_PLACEHOLDER/${ROLE_NAME}/g" ./roles/${ROLE_NAME}/handlers/main.yml + +sed -i '' "s/PACKAGE_PLACEHOLDER/${ROLE_PACKAGE}/g" ./roles/${ROLE_NAME}/tasks/debian.yml +sed -i '' "s/PACKAGE_PLACEHOLDER/${ROLE_PACKAGE}/g" ./roles/${ROLE_NAME}/tasks/redhat.yml +sed -i '' "s/PACKAGE_PLACEHOLDER/${ROLE_PACKAGE}/g" ./roles/${ROLE_NAME}/defaults/main.yml + +sed -i '' "s/SERVICE_PLACEHOLDER/${ROLE_SERVICE}/g" ./roles/${ROLE_NAME}/tasks/debian.yml +sed -i '' "s/SERVICE_PLACEHOLDER/${ROLE_SERVICE}/g" ./roles/${ROLE_NAME}/tasks/redhat.yml +sed -i '' "s/SERVICE_PLACEHOLDER/${ROLE_SERVICE}/g" ./roles/${ROLE_NAME}/handlers/main.yml + +sed -i '' "s/ROLE_DESC_PLACEHOLDER/${ROLE_DESC}/g" ./roles/${ROLE_NAME}/meta/main.yml +sed -i '' "s/TAGS_PLACEHOLDER/${ROLE_TAGS}/g" ./roles/${ROLE_NAME}/meta/main.yml + +echo "Роль ${ROLE_NAME} создана успешно!" +echo "Структура: ./roles/${ROLE_NAME}/" diff --git a/roles/test-role/defaults/main.yml b/roles/test-role/defaults/main.yml new file mode 100644 index 0000000..be265e6 --- /dev/null +++ b/roles/test-role/defaults/main.yml @@ -0,0 +1,9 @@ +--- +# Переменные по умолчанию для роли test-role +# Автор: Сергей Антропов +# Сайт: https://devops.org.ru + +test-role_package: test-package +test-role_service: test-service +test-role_enabled: true +test-role_started: true diff --git a/roles/test-role/handlers/main.yml b/roles/test-role/handlers/main.yml new file mode 100644 index 0000000..2c3b7fc --- /dev/null +++ b/roles/test-role/handlers/main.yml @@ -0,0 +1,7 @@ +--- +# Обработчики роли test-role + +- name: Перезапустить test-service + systemd: + name: "{{ test-role_service }}" + state: restarted diff --git a/roles/test-role/meta/main.yml b/roles/test-role/meta/main.yml new file mode 100644 index 0000000..d892b82 --- /dev/null +++ b/roles/test-role/meta/main.yml @@ -0,0 +1,17 @@ +--- +galaxy_info: + author: Сергей Антропов + description: Тестовая роль + company: https://devops.org.ru + license: MIT + min_ansible_version: 2.9 + platforms: + - name: Ubuntu + versions: [18.04, 20.04, 22.04] + - name: Debian + versions: [10, 11, 12] + - name: EL + versions: [7, 8, 9] + galaxy_tags: [test,role] + +dependencies: [] diff --git a/roles/test-role/tasks/debian.yml b/roles/test-role/tasks/debian.yml new file mode 100644 index 0000000..cdfefc8 --- /dev/null +++ b/roles/test-role/tasks/debian.yml @@ -0,0 +1,18 @@ +--- +# Задачи для Debian/Ubuntu + +- name: Обновить кэш пакетов + apt: + update_cache: yes + cache_valid_time: 3600 + +- name: Установить пакет test-package + apt: + name: "{{ test-role_package }}" + state: present + +- name: Запустить и включить сервис test-service + systemd: + name: "{{ test-role_service }}" + enabled: "{{ test-role_enabled }}" + state: "{{ 'started' if test-role_started else 'stopped' }}" diff --git a/roles/test-role/tasks/main.yml b/roles/test-role/tasks/main.yml new file mode 100644 index 0000000..377ca02 --- /dev/null +++ b/roles/test-role/tasks/main.yml @@ -0,0 +1,12 @@ +--- +# Основные задачи роли test-role +# Автор: Сергей Антропов +# Сайт: https://devops.org.ru + +- name: Включить задачи для Debian/Ubuntu + import_tasks: debian.yml + when: ansible_os_family == 'Debian' + +- name: Включить задачи для RHEL/CentOS + import_tasks: redhat.yml + when: ansible_os_family == 'RedHat' diff --git a/roles/test-role/tasks/redhat.yml b/roles/test-role/tasks/redhat.yml new file mode 100644 index 0000000..a60f736 --- /dev/null +++ b/roles/test-role/tasks/redhat.yml @@ -0,0 +1,13 @@ +--- +# Задачи для RHEL/CentOS + +- name: Установить пакет test-package + yum: + name: "{{ test-role_package }}" + state: present + +- name: Запустить и включить сервис test-service + systemd: + name: "{{ test-role_service }}" + enabled: "{{ test-role_enabled }}" + state: "{{ 'started' if test-role_started else 'stopped' }}"