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
: