Task#
Task – это инструмент, используемый для управления сборкой программ и запуском задач аналогично утилите Make.
Назначение#
В Task задачей называют одну или несколько команд, выполняемых в определенном порядке.
В Astra Automation утилита Task используется для запуска следующих задач:
подготовка конфигурационных файлов Terraform и Ansible с помощью конструктора кода;
развертывание инфраструктуры с помощью Terraform;
настройка управляемых узлов с помощью Ansible.
Установка#
Важно
Утилита Task доступна в репозиториях Astra Linux Special Edition, начиная с оперативного обновления 1.7.4. Инструкции по обновлению ОС приведены в разделе справочного центра Оперативные обновления для Astra Linux Special Edition РУСБ.10015-01 (очередное обновление 1.7), РУСБ.10015-10, РУСБ.10015-37.
Для установки утилиты Task выполните следующие действия:
Обновите список доступных пакетов:
sudo apt update
Установите пакет
task:sudo apt install task --yes
Принципы работы#
Task предоставляет широкие возможности для управления задачами:
Описание зависимостей между задачами.
Запуск задач в определенной последовательности.
Параллельное выполнение задач.
Запуск одних и тех же задач с различными параметрами.
Для использования утилиты Task необходимо выполнить следующие действия:
Создать в каталоге проекта файл
Taskfile.yml.Описать в файле
Taskfile.ymlнеобходимые задачи.Запустить выполнение нужный задачи с помощью команды:
task <task_name>
Пример файла Taskfile.yml, в котором определена одна задача с названием hello:
---
version: '3'
tasks:
hello:
cmds:
- echo 'Hello World from Task!'
Для выполнения задачи hello необходимо использовать следующую команду:
task hello
Зависимости (dependencies)#
Задачи могут зависеть друг от друга – запуск одной приводит к автоматическому запуску других, указанных в списке зависимостей.
Для указания списка зависимостей используется блок deps:
---
version: '3'
tasks:
task-1:
cmds:
- echo "Task 1"
task-2:
cmds:
- echo "Task 2"
task-3:
deps: [task-1, task2]
cmds:
- echo "Task 3"
Команды, описанные в задаче task-3, будут выполнены только после того, как завершится выполнение задач task-1 и task-2.
Порядок выполнения зависимостей#
В целях оптимизации Task запускает параллельно выполнение задач, указанных в блоке deps.
Если задачи из списка зависимостей нужно выполнять в определенном порядке, вместо блока deps укажите названия задач в блоке cmds:
version: '3'
tasks:
task-1:
cmds:
- echo "Task 1"
task-2:
cmds:
- echo "Task 2"
task-3:
cmds:
- task: task-1 # Выполнится первой
- task: task-2 # Выполнится второй
- echo "Task 3" # Выполнится последней
Внутренние задачи#
По умолчанию для запуска из терминала доступны все задачи, описанные в Taskfile.yml.
Если необходимо запретить запуск какой-либо задачи из терминала, отметьте ее как внутреннюю.
Внутренними считаются задачи, к описанию которых добавлен блок internal со значением true, например:
---
version: '3'
tasks:
update-apt-cache:
cmds:
- sudo apt update
internal: true
install-seahorse:
cmds:
- sudo apt install seahorse --yes
deps: [update-apt-cache]
Задачу update-apt-cache нельзя вызвать напрямую, однако, ее можно использовать как зависимость в других задачах.
Переменные (variables)#
Переменные позволяют упростить работу со значениями, которые многократно используются в различных частях Taskfile.yml или должны быть вычислены во время выполнения задач.
Task выполняет поиск переменной в следующем порядке:
В блоке
varsв описании задачи.В списке переменных, переданных при запуске задачи из другой задачи.
В списке переменных, импортированных из включенного
Taskfile.yml.В списке переменных, переданных во включенный
Taskfile.yml.В блоке
varsв корнеTaskfile.yml.В списке переменных среды.
Объявление и использование#
Переменные описываются в блоке vars, который размещается в корне Taskfile.yml или на уровне отдельных задач.
В первом случае описанные переменные называются глобальными, так как становятся доступными во всех задачах.
Для доступа к значению переменной используется синтаксис с обрамляющими фигурными скобками и точкой перед именем.
Пример описания и использования глобальной переменной VERSION:
---
version: '3'
vars:
VERSION: 1.0.0
tasks:
default:
cmds:
- echo {{.VERSION}}
Значения переменных могут быть вычислены динамически.
В этом примере значения переменных CURRENT_DATE и CURRENT_TIME будут вычисляться заново при каждом использовании утилиты Task:
---
version: '3'
vars:
CURRENT_DATE:
sh: date +"%Y-%m-%d"
CURRENT_TIME:
sh: date +"%H:%m:%S"
tasks:
default:
cmds:
- echo "Current date is {{.CURRENT_DATE}}"
- echo "Current time is {{.CURRENT_TIME}}"
Переменные среды (environment variables)#
Для доступа к значениям переменных среды используется синтаксис с символом $ перед именем, например:
---
version: '3'
tasks:
default:
cmds:
- echo $USER
Можно задать значения переменных среды в Taskfile или отдельном файле формата INI.
Описание#
Чтобы задать значение переменной среды в Taskfile, добавьте в корневой раздел или описание задачи блок env.
Пример описания и использования переменной окружения TERMINAL:
---
version: '3'
env:
TERMINAL: Bash
tasks:
default:
cmds:
- echo "Terminal is $TERMINAL"
Загрузка из файлов#
Чтобы использовать значения переменных среды, указанные в отдельном файле, следует:
Создать файл, в котором указать значения переменных в формате
<NAME>=<VALUE>, например:USER_ID=af93jdsflkj2 CLOUD_ID=cjdkl1490 FOLDER_ID=u1093j1kalfop
Добавить в
Taskfile.ymlблокdotenv, в значении которого указать список имен файлов, из которых следует загрузить значения переменных окружения, например:--- version: '3' tasks: prod-task: dotenv: ['.env', 'production/.env'] cmds: # - test-task: dotenv: ['.env', 'test/.env'] cmds: # -
В этом примере для задач
prod-taskиtest-taskуказаны разные наборы файлов, из которых следует загрузить значения переменных окружения. В первом случае будет выполнена загрузка из файлов.envиproduction/.env, а во втором –.envиtest/.env.Совет
Для файлов с переменными среды рекомендуется использовать имя
.env.
Специальные переменные среды#
Во время выполнения задач доступны переменные среды, созданные Task:
Переменная |
Описание |
|
Контрольные суммы файлов, созданных во время предыдущего выполнения задачи |
|
Название выполняемой задачи |
|
Дата и время создания файлов, созданных во время предыдущего выполнения задачи |
|
Полный путь к текущему каталогу |
Подключение других файлов настройки#
Task позволяет включать одни Taskfile.yml в другие.
Благодаря этому можно организовать задачи в виде иерархической структуры.
Пусть имеется такая структура файлов и каталогов:
Файл build/Taskfile.yml содержит задачу ci, выполняющую сборку приложения.
Файл deploy/Taskfile.yml содержит задачу cd, выполняющую доставку приложения в рабочее окружение.
Файл Taskfile в каталоге проекта включает в себя содержимое этих двух файлов.
---
version: '3'
includes:
build: build/Taskfile.yml
deploy: deploy/Taskfile.yml
tasks:
build-and-deploy:
cmds:
- task: build:ci
- task: deploy:cd
- echo "Task build-and-deploy is done"
Здесь:
includes– блок, описывающий включаемые файлы;
build,deploy– пространства имен, в которых размещаются задачи из включенных файлов;
build:ci– задачаci, импортированная из файлаbuild/Taskfile.yml;
deploy:cd– задачаcd, импортированная из файлаdeploy/Taskfile.yml.
Task позволяет передавать значения переменных в импортируемые Taskfile.
Пусть имеется файл deploy/Taskfile.yml, содержащий задачу deploy:
---
version: '3'
tasks:
deploy:
cmds:
- echo "Target host is {{.TARGET_HOST}}"
Здесь TARGET_HOST – переменная, задающая FQDN целевого хоста, на котором нужно выполнить развертывание приложения.
Чтобы использовать задачу deploy с разными значениями переменной TARGET_HOST, следует указать их при импорте deploy/Taskfile.yml:
---
version: '3'
includes:
test:
taskfile: deploy/Taskfile.yml
vars:
TARGET_HOST: testing.example.com
prod:
taskfile: deploy/Taskfile.yml
vars:
TARGET_HOST: production.example.com
Результат выполнения задач test:deploy и prod:deploy: