Я пытаюсь запустить задачу django manage.py
через cron, на AWS Elasticbeanstalk (EB).Сохранение переменных среды AWS в файл - Как обрабатывать специальный символ '&'
*/10 * * * * root /usr/local/bin/notification_cron.sh > /dev/null
notification_cron.sh
сценарий вызывает Джанго manage.py
задачу.
Django нуждается в переменных среды EB (например, RDS_PORT, RDS_DB_NAME, RDS_PASSWORD и т. Д.). Поэтому я сохраняю эти переменные среды в файл при развертывании и перезаряжаю их в сценарии bash, который также вызывает задачу manage.py.
Это часть моей конфигурации развертывания в .ebextensions
:
commands:
001_envvars_to_bash_source_file:
command: |
# source our elastic beanstalk environment variables
/opt/elasticbeanstalk/bin/get-config --output YAML environment|perl -ne "/^\w/ or next; s/: /=/; print qq|\$_|" > /usr/local/bin/envvars
chmod 755 /usr/local/bin/envvars
files:
"/usr/local/bin/notification_cron.sh":
mode: "000755"
owner: root
group: root
content: |
#!/usr/bin/env bash
AWS_CONFIG_FILE="/home/ec2-user/.aws/config"
set -o allexport
# Loading environment data
source /usr/local/bin/envvars
set +o allexport
cd /opt/python/current/app/
source /opt/python/run/venv/bin/activate
python manage.py my_management_task
Проблема вызвана линии
/opt/elasticbeanstalk/bin/get-config --output YAML environment|perl -ne "/^\w/ or next; s/: /=/; print qq|\$_|" > /usr/local/bin/envvars
или альтернативный SED эквивалентные
/opt/elasticbeanstalk/bin/get-config environment --output yaml | sed -n '1!p' | sed -e 's/^\(.*\): /\1=/g' > /usr/local/bin/envvars
Содержание /usr/local/bin/envvars
не всегда в кавычках:
PYTHONPATH="/opt/python/current/app/mydjangoapp:$PYTHONPATH"
DJANGO_SETTINGS_MODULE=mydjangoapp.settings
AWS_ACTIVE='true'
RDS_PORT='5432'
RDS_HOSTNAME=hostname.host.us-east-1.rds.amazonaws.com
RDS_USERNAME=master
RDS_DB_NAME=ebdb
RDS_PASSWORD=My&Password
Это вызывает проблемы, когда переменная окружения имеет символ «&».
'RDS_PASSWORD': My&Password
Bash разбивает это вверх на «&» характер, когда я source /usr/local/bin/envvars
импортировать их обратно в мой сценарий перед вызовом manage.py Джанго.
Фуэ. Мой вопрос:
Как получить RDS_PASSWORD="My&Password"
в /usr/local/bin/envvars
файл (обратите внимание на двойные кавычки требуется), не нарушая другие линии, как RDS_PORT='5432'
?
Почему не только двойные кавычки все ваши переменные в файле? – Inian
Этот файл envvars создается мной автоматически во время развертывания с использованием AWS get-config (который сбрасывает переменные среды в YAML), заменяя: with = и отправляя его в файл.Он дважды цитирует PYTHONPATH, однокасканный RDS_PORT и вообще не цитирует RDS_PASSWORD. Как мне сделать двойную котировку или просто значение RDS_PASSWORD там, где нет повторного двойного цитирования переменных, уже находящихся в кавычках? – Pranab
Причина, по которой я спросил это, как вы ожидаете решения для этого? Отдельный скрипт запускается вручную или связан с каким-то другим скриптом? – Inian