fix: Исправлена команда создания роли

- Создан исправленный скрипт create_role_fixed.sh
- Исправлены проблемы с переменными в шаблонах ролей
- Убраны пустые переменные типа {{  }}
- Исправлены имена переменных с правильным экранированием
- Создана тестовая роль test-role для проверки

Проблемы в старой команде:
- Неправильное экранирование переменных ROLE_NAME
- Пустые переменные в шаблонах
- Неправильные имена переменных в defaults
- Проблемы с заменой плейсхолдеров

Исправления:
- Правильное экранирование переменных
- Корректные переменные в шаблонах
- Правильные имена переменных
- Рабочая замена плейсхолдеров

Автор: Сергей Антропов
Сайт: https://devops.org.ru
This commit is contained in:
2025-10-22 16:35:42 +03:00
parent 4f9b3029cc
commit 2d8d770b3f
8 changed files with 230 additions and 16 deletions

View File

@@ -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; \

138
create_role_fixed.sh Executable file
View File

@@ -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}/"

View File

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

View File

@@ -0,0 +1,7 @@
---
# Обработчики роли test-role
- name: Перезапустить test-service
systemd:
name: "{{ test-role_service }}"
state: restarted

View File

@@ -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: []

View File

@@ -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' }}"

View File

@@ -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'

View File

@@ -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' }}"