Здесь показаны различия между двумя версиями данной страницы.
linux:bash-deploy [2018/03/22 21:37] |
linux:bash-deploy [2021/02/11 09:20] (текущий) |
||
---|---|---|---|
Строка 1: | Строка 1: | ||
+ | ===== Файлы внутри скриптов или deploy на bash'е ===== | ||
+ | Отсюда: http://blog.eqlbin.ru/2010/12/deploy-bash.html | ||
+ | ---- | ||
+ | Одним из интересных свойств bash-скриптов является то, что в них можно запихивать файлы, которые затем сам скрипт будет из себя извлекать при запуске. Таким образом, например, устроены скрипты установки JRE и JDK для Linux. Используя это свойство, можно довольно легко создавать скрипты для автоматизированного развертывания каких-либо систем, библиотек и т.п.. Приведу примеры извлечения текстовых и бинарных данных из bash-скриптов. | ||
+ | ====Скрипты внутри скриптов==== | ||
+ | Используя команду cat, из выполняющегося скрипта можно вытащить любые данные, которые находятся между вызовом cat и какой-либо текстовой меткой. Это удобно использовать в первую очередь для извлечения текстовых данных, например скриптов. Т.е. можно создавать bash-скрипты, которые при выполнении сами будут создавать различные скрипты, причем используя переменные можно добиться хорошей гибкости.\\ | ||
+ | \\ | ||
+ | Простой пример скрипта создающего другие скрипты: | ||
+ | <code bash> | ||
+ | #!/bin/bash | ||
+ | |||
+ | # Каталог для развертывания | ||
+ | DEPLOY_PATH="./scripts/inner-scripts" | ||
+ | # Имя первого вложенного скрипта | ||
+ | FIRST_SCRIPT_NAME="script-inner-1.sh" | ||
+ | # Имя второго вложенного скрипта | ||
+ | SECOND_SCRIPT_NAME="script-inner-2.sh" | ||
+ | |||
+ | echo "Развертывание вложенных скриптов" | ||
+ | |||
+ | # Создание каталога для развертывания если его нет | ||
+ | if [ ! -d $DEPLOY_PATH ] | ||
+ | then | ||
+ | echo "Создание каталога $DEPLOY_PATH" | ||
+ | mkdir -p $DEPLOY_PATH | ||
+ | fi | ||
+ | |||
+ | cd $DEPLOY_PATH | ||
+ | |||
+ | echo "Создание скрипта $FIRST_SCRIPT_NAME" | ||
+ | |||
+ | # Извлечение текста между вызовом cat и первой меткой _EOF_ | ||
+ | cat > ./$FIRST_SCRIPT_NAME << _EOF_ | ||
+ | #!/bin/bash | ||
+ | # первый вложенный скрипт | ||
+ | echo "Первый скрипт запущен!" | ||
+ | echo "Запуск второго скрипта..." | ||
+ | ./$SECOND_SCRIPT_NAME | ||
+ | _EOF_ | ||
+ | |||
+ | echo "Создание скрипта $SECOND_SCRIPT_NAME" | ||
+ | |||
+ | # Извлечение текста между вызовом cat и второй меткой _EOF_ | ||
+ | cat > ./$SECOND_SCRIPT_NAME << _EOF_ | ||
+ | #!/bin/bash | ||
+ | # второй вложенный скрипт | ||
+ | echo "Второй скрипт запущен!" | ||
+ | _EOF_ | ||
+ | |||
+ | # Установка прав на выполнение скриптов | ||
+ | chmod 755 $FIRST_SCRIPT_NAME $SECOND_SCRIPT_NAME | ||
+ | |||
+ | echo "Развертывание скриптов закончено!" | ||
+ | </code> | ||
+ | Приведенный код создаст два скрипта, причем первый скрипт будет запускать второй скрипт при выполнении.\\ | ||
+ | ====Бинарные файлы внутри скриптов==== | ||
+ | Помимо текстовых данных из скрипта можно извлекать предварительно записанные в них бинарные файлы, например архивы. Особенность при создании такого скрипта в том, что сначала надо написать сам скрипт, а потом с помощью команды cat загнать в него необходимый файл. \\Пример скрипта, который извлекает из себя архив с jar-файлами, распаковывает его и удаляет архив: | ||
+ | <code bash> | ||
+ | #!/bin/bash | ||
+ | |||
+ | DEPLOY_PATH="./libs/jar/odfdom-simple" | ||
+ | ARCH_NAME="odfdom-libs.tar.gz" | ||
+ | |||
+ | echo "Развертывание библиотек ODFDOM" | ||
+ | |||
+ | # Создание каталога если его нет | ||
+ | if [ ! -d $DEPLOY_PATH ] | ||
+ | then | ||
+ | echo "Создание каталога $DEPLOY_PATH" | ||
+ | mkdir -p $DEPLOY_PATH | ||
+ | fi | ||
+ | |||
+ | echo "Создание скрипта $FIRST_SCRIPT_NAME" | ||
+ | # Вытаскиваем архив из скрипта (начиная с 30-й строки до конца скрипта) | ||
+ | tail -n +30 "$0" > $DEPLOY_PATH/$ARCH_NAME | ||
+ | |||
+ | cd $DEPLOY_PATH | ||
+ | |||
+ | # Распаковка архива | ||
+ | tar xzf $ARCH_NAME | ||
+ | |||
+ | # Удаление архива | ||
+ | rm -f $ARCH_NAME | ||
+ | |||
+ | # Выход из программы с кодом 0 | ||
+ | exit 0 | ||
+ | ################################################################## | ||
+ | # 30-я строка; здесь начнутся бинарные данные; эту строку включать в скрипт не надо | ||
+ | </code> | ||
+ | После того, как будет написана последовательность команд скрипта, необходимо в конце вставить пустую строку, сохранить скрипт и выполнить в терминале нечто вроде: | ||
+ | <code bash> | ||
+ | cat my_arch.tar.gz >> my_script.sh | ||
+ | </code> | ||
+ | После выполнения этой команды архив my_arch.tar.gz станет частью скрипта my_script.sh. Для извлечения архива в приведенном примере используется команда tail -n +30 "$0" > $DEPLOY_PATH/$ARCH_NAME, которая в данном случае извлекает бинарные данные и перенаправляет вывод в файл ./libs/jar/odfdom-simple/odfdom-libs.tar.gz. Параметр -n +30 означает, что выводить данные надо начиная с 30 строки файла, а под "$0" скрывается имя выполняющегося скрипта.\\ | ||
+ | \\ | ||
+ | После того как данные извлечены, можно распаковывать архив, распихивать файлы по каталогам, создавать симлинки и в общем делать всё, что нужно для развертывания вашей системы. Самое главное не забудьте вызвать команду exit до того, как начнутся бинарные данные, иначе bash попытается выполнить и их :) |