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 выполните следующие действия:

  1. Обновите список доступных пакетов:

    sudo apt update
    
  2. Установите пакет task:

    sudo apt install task --yes
    

Принципы работы#

Task предоставляет широкие возможности для управления задачами:

  • Описание зависимостей между задачами.

  • Запуск задач в определенной последовательности.

  • Параллельное выполнение задач.

  • Запуск одних и тех же задач с различными параметрами.

Для использования утилиты Task необходимо выполнить следующие действия:

  1. Создать в каталоге проекта файл Taskfile.yml.

  2. Описать в файле Taskfile.yml необходимые задачи.

  3. Запустить выполнение нужный задачи с помощью команды:

    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 выполняет поиск переменной в следующем порядке:

  1. В блоке vars в описании задачи.

  2. В списке переменных, переданных при запуске задачи из другой задачи.

  3. В списке переменных, импортированных из включенного Taskfile.yml.

  4. В списке переменных, переданных во включенный Taskfile.yml.

  5. В блоке vars в корне Taskfile.yml.

  6. В списке переменных среды.

Объявление и использование#

Переменные описываются в блоке 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"

Загрузка из файлов#

Чтобы использовать значения переменных среды, указанные в отдельном файле, следует:

  1. Создать файл, в котором указать значения переменных в формате <NAME>=<VALUE>, например:

    USER_ID=af93jdsflkj2
    CLOUD_ID=cjdkl1490
    FOLDER_ID=u1093j1kalfop
    
  2. Добавить в 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:

Переменная

Описание

{{.CHECKSUM}}

Контрольные суммы файлов, созданных во время предыдущего выполнения задачи

{{.TASK}}

Название выполняемой задачи

{{.TIMESTAMP}}

Дата и время создания файлов, созданных во время предыдущего выполнения задачи

{{.USER_WORKING_DIR}}

Полный путь к текущему каталогу

Подключение других файлов настройки#

Task позволяет включать одни Taskfile.yml в другие. Благодаря этому можно организовать задачи в виде иерархической структуры.

Пусть имеется такая структура файлов и каталогов:

├─ build
│  └─ Taskfile.yml
├─ deploy
│  └─ Taskfile.yml
└─ 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:

task: [test:deploy] echo "Target host is testing.example.com"
Target host is testing.example.com

task: [prod:deploy] echo "Target host is production.example.com"
Target host is production.example.com