2017-01-12 2 views
1

Я пытаюсь запустить задачу 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'?

+0

Почему не только двойные кавычки все ваши переменные в файле? – Inian

+0

Этот файл envvars создается мной автоматически во время развертывания с использованием AWS get-config (который сбрасывает переменные среды в YAML), заменяя: with = и отправляя его в файл.Он дважды цитирует PYTHONPATH, однокасканный RDS_PORT и вообще не цитирует RDS_PASSWORD. Как мне сделать двойную котировку или просто значение RDS_PASSWORD там, где нет повторного двойного цитирования переменных, уже находящихся в кавычках? – Pranab

+0

Причина, по которой я спросил это, как вы ожидаете решения для этого? Отдельный скрипт запускается вручную или связан с каким-то другим скриптом? – Inian

ответ

2

GNU sed Использование вы можете сделать что-то, как показано ниже,

sed -r 's/RDS_PASSWORD=([[:graph:]]+)/RDS_PASSWORD="\1"/' /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" 

Вы можете добавить -i флаг sed для замещения на месте. Я использовал класс символов [[:graph:]], который

‘[:graph:]’ 
Graphical characters: ‘[:alnum:]’ and ‘[:punct:]’. 

специальных символов как часть [:punct:] является

! " # $ % & ' () * + , - ./: ; <=> ? @ [ \ ]^_ ` { | } ~ 

Так sed может обрабатывать замену, если любой из этих вышеуказанных символов составляет переменную RDS_PASSWORD.

Синтаксис можно использовать, является

/opt/elasticbeanstalk/bin/get-config environment --output yaml | \ 
    sed -n '1!p' | sed -e 's/^\(.*\): /\1=/g' | \ 
    sed -r 's/RDS_PASSWORD=([[:graph:]]+)/RDS_PASSWORD="\1"/' > /usr/local/bin/envvars 
+0

Есть ли способ вывести выходные данные из/opt/elasticbeanstalk/bin/get-config environment - output yaml | sed -n '1! p' | sed -e 's/^ \ (. * \):/\ 1 =/g'> sed -r 's/RDS_PASSWORD = ([[: graph:]] +)/RDS_PASSWORD = "\ 1" /'>/usr/local/bin/envvars – Pranab

+0

@Pranab: обновление устранило проблему? – Inian

+0

Развертывание заняло некоторое время. Спасибо, спасибо. – Pranab