Вопрос или проблема
У меня есть приложение asp.net core, в котором для производственной среды установлено пустое соединение.
Моя цель — изменить его во время развертывания, используя секреты Azure Library.
Мой конвейер релиза вызывает этот метод:
ssh devops@server /usr/bin/docker run -p80:80 --name container1 --network open -e ASPNETCORE_ENVIRONMENT=PRD -e ConnectionStrings:my-db="User Id=USERX;Password=$(UserXPassword)');Data Source=(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=hostora)(PORT=1520))(CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=xe)))" -d register:5000/imagem01:1
Это не работает, потому что значение $(UserXPassword)
внутри моей Azure Library имеет $
посередине, например: Pas$word!Now
.
Конвейер возвращает Pas!Now
(заменяя $word
на пустое значение, так как это воспринимается как переменная Linux).
Мы попробовали почти все, пробуя обернуть переменные в '
и "
также. Единственное, что работает до сих пор — это использование моего пароля в Azure Library с Pas\$word!Now
.
Если я использую \$
вместо $
в пароле, это работает, но я не считаю это разумным.
Может ли кто-нибудь объяснить, что я упускаю?
ИЗМЕНЕНИЕ
Вот моя задача:
steps:
- script: |
ssh devops@server /usr/bin/docker image pull register:5000/container01:$(Release.ReleaseName)
ssh devops@server /usr/bin/docker container stop container01
ssh devops@server /usr/bin/docker rm -f container01 || true
ssh devops@server '/usr/bin/docker run -p80:80 --name container01 --network opened -e ASPNETCORE_ENVIRONMENT=PRD -e ConnectionStrings:my-db=$(ConnectionString) -d register:5000/container01:$(Release.ReleaseName)'
ssh devops@server /usr/bin/docker image prune -fa || true
displayName: 'Запустить контейнер'
env:
ConnectionString: $(MY_LIBRARY_CONNSTRING)
Чтобы избежать подобных проблем, не прибегая к экранированию специальных символов, таких как $
, рассмотрите возможность установки переменных среды на уровне задачи, вместо того чтобы напрямую использовать переменные конвейера (например, из групп переменных) в скриптах.
Пример
Рассмотрим следующую группу переменных с переменной my_connection_string
:
Использование переменной конвейера непосредственно в скрипте:
trigger: none
pool:
vmImage: 'ubuntu-latest'
variables:
- group: group1
steps:
- bash: |
echo "Строка подключения: $(my_connection_string)"
displayName: 'Показать строку подключения с использованием переменной конвейера'
Запуск конвейера:
Установка и использование переменной окружения на уровне задачи:
trigger: none
pool:
vmImage: 'ubuntu-latest'
variables:
- group: group1
- bash: |
echo "Строка подключения: $CONNECTION_STRING"
displayName: 'Показать строку подключения с использованием переменной окружения'
env:
CONNECTION_STRING: $(my_connection_string) # установка переменной окружения из переменной конвейера
Запуск конвейера:
Ответ или решение
Ваша задача состоит в том, чтобы обеспечить корректную подстановку секретов из Azure Library в строку соединения вашей ASP.NET Core приложения во время развертывания через Azure Release Pipeline. Проблема заключается в том, что пароль, содержащий символ $
, вызывает нежелательное поведение, когда переменные интерпретируются в среде Linux.
Решение проблемы с символом $
Чтобы избежать проблем с интерпретацией символов в значениях переменных, советую использовать переменные окружения на уровне задания, а не прямую подстановку переменных в скрипт. Это поможет избежать конфликтов с интерпретацией переменной $
в командной строке.
Вот как можно переписать вашу задачу, чтобы использовать переменные окружения:
steps:
- bash: |
ssh devops@server /usr/bin/docker image pull register:5000/container01:$(Release.ReleaseName)
ssh devops@server /usr/bin/docker container stop container01
ssh devops@server /usr/bin/docker rm -f container01 || true
ssh devops@server '/usr/bin/docker run -p80:80 --name container01 --network opened -e ASPNETCORE_ENVIRONMENT=PRD -e ConnectionStrings:my-db="$CONNECTION_STRING" -d register:5000/container01:$(Release.ReleaseName)'
ssh devops@server /usr/bin/docker image prune -fa || true
displayName: 'Run container'
env:
CONNECTION_STRING: $(MY_LIBRARY_CONNSTRING) # устанавливаем переменную окружения из библиотеки
Объяснение предложенного решения:
-
Использование переменной окружения: В секции
env
мы устанавливаем переменнуюCONNECTION_STRING
, которая берет значение из переменной библиотеки. Затем, в остальной части команд, вместо прямой подстановки$(ConnectionString)
мы используем$CONNECTION_STRING
. Это позволит избежать конфликтов с интерпретацией символов. -
Кавычки: Обертывание значения переменной
"$CONNECTION_STRING"
в двойные кавычки в вашем ssh-команде позволяет избежать возможных проблем, если строка соединения будет содержать пробелы или специальные символы.
Дополнительные рекомендации:
-
Закрытие секрета: Убедитесь, что храните все секреты, такие как пароли или ключи, в Azure Key Vault или в безопасных переменных в Azure DevOps. Это гарантирует лучшую безопасность ваших соединений.
-
Тестирование: Проверьте процесс развёртывания в тестовом окружении с различными вариантами паролей, включая те, что содержат символы, чтобы убедиться в корректной работе скрипта.
Следуя этим рекомендациям, вы должны устранить актуальные проблемы с интерпретацией переменных в вашем пайплайне Azure, а также улучшить качество и безопасность развертывания вашего приложения.