Здесь показаны различия между двумя версиями данной страницы.
|
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 попытается выполнить и их :) | ||