

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# 在队列环境中设置环境变量
<a name="set-environment-variables"></a>

许多应用程序和框架使用环境变量来控制功能设置、日志级别和显示配置。你可以使用 Ope [n Job Description (OpenJD) 环境](https://github.com/OpenJobDescription/openjd-specifications/wiki/2023-09-Template-Schemas#4-environment)来设置其范围内的每个任务命令都继承的环境变量。

## 环境变量作用域
<a name="set-env-vars-scope"></a>

AWS Deadline Cloud 会应用您附加到队列的队列环境中的环境变量。在作业模板中，您还可以使用 [OpenJD 环境在作业和步骤级别定义环境](https://github.com/OpenJobDescription/openjd-specifications/wiki/2023-09-Template-Schemas#4-environment)变量。在较窄的作用域中定义的变量会覆盖范围更广的同名变量。
+ **队列环境** — 附加到 Deadline Cloud 中队列的模板。变量适用于提交到队列的所有作业。您可以使用固定值的`variables`映射来设置变量，也可以使用脚本设置动态值。
+ **作业环境**-`jobEnvironments` 在作业模板中定义。变量适用于作业中的所有步骤和任务。作业级变量会覆盖同名的队列级变量。
+ **步骤环境**-`stepEnvironments` 在作业模板中定义。变量仅适用于该步骤中的任务。步骤级变量会覆盖同名的作业级别或队列级变量。

## 在队列环境中设置变量
<a name="set-env-vars-queue-env"></a>

可以在队列环境中使用固定值的`variables`映射来设置环境变量，或者使用`script`带动`onEnter`作表示动态值的环境变量。

以下队列环境模板使用`variables`映射将`QT_QPA_PLATFORM`变量设置为`offscreen`，这允许使用 [Qt Fram](https://www.qt.io/product/framework) ework 的应用程序在没有交互式显示屏的情况下在工作主机上运行。

```
specificationVersion: 'environment-2023-09'
environment:
  name: QtOffscreen
  variables:
    QT_QPA_PLATFORM: offscreen
```

对于动态值，例如修改`PATH`或激活虚拟环境，请使用将格式`openjd_env: {{VAR}}={{value}}`为 stdout 的行打印脚本。前`openjd_env:`缀为必填项。使用不带前缀的`echo``export`、或其他外壳机制不会将变量传播到作业和任务。

以下队列环境模板使用脚本设置`QT_QPA_PLATFORM`变量。

```
specificationVersion: 'environment-2023-09'
environment:
  name: QtOffscreen
  script:
    actions:
      onEnter:
        command: bash
        args:
        - "{{Env.File.Enter}}"
    embeddedFiles:
    - name: Enter
      type: TEXT
      data: |
        #!/bin/env bash
        set -euo pipefail
        echo "openjd_env: QT_QPA_PLATFORM=offscreen"
```

要将队列环境附加到您的队列，请使用 Deadline Cloud 控制台或 AWS CLI。有关更多信息，请参阅 D [e AWS adline Cloud 用户指南中的创建队列环境](https://docs.aws.amazon.com/deadline-cloud/latest/userguide/create-queue-environment.html)。以下 AWS CLI 命令根据模板文件创建队列环境。

```
aws deadline create-queue-environment \
    --farm-id {{FARM_ID}} \
    --queue-id {{QUEUE_ID}} \
    --priority 1 \
    --template-type YAML \
    --template file://{{my-queue-env.yaml}}
```

有关更复杂的示例，例如创建和激活 conda 虚拟环境，请参阅上 GitHub的 De [adline Cloud 队列环境示例](https://github.com/aws-deadline/deadline-cloud-samples/tree/mainline/queue_environments)。

## 在作业模板中设置变量
<a name="set-env-vars-job-template"></a>

在作业模板中，向`jobEnvironments`或`stepEnvironments`条目添加`variables`地图。每个条目都是一个键值对，其中键是变量名，值是变量值。

以下作业模板将`QT_QPA_PLATFORM`环境变量设置为`offscreen`，这允许使用 [Qt Fram](https://www.qt.io/product/framework) ework 的应用程序在没有交互式显示屏的情况下在工作主机上运行。

```
specificationVersion: 'jobtemplate-2023-09'
name: MyJob
jobEnvironments:
- name: JobEnv
  variables:
    QT_QPA_PLATFORM: offscreen
```

可以在单个环境定义中设置多个变量。

```
jobEnvironments:
- name: JobEnv
  variables:
    JOB_VERBOSITY: MEDIUM
    JOB_PROJECT_ID: {{my-project-id}}
    JOB_ENDPOINT_URL: {{https://my-host-name/my/path}}
    QT_QPA_PLATFORM: offscreen
```

您可以使用`{{Param.{{ParameterName}}}}`语法在变量值中引用作业参数。

```
jobEnvironments:
- name: JobEnv
  variables:
    JOB_EXAMPLE_PARAM: "{{Param.ExampleParam}}"
```

要覆盖特定步骤的作业级变量，请使用相同的变量名称定义一个`stepEnvironments`条目。以下示例`JOB_PROJECT_ID`在作业级别使用值进行定义`project-12`，然后使用覆盖步骤级别的`step-project-12`值。步骤中的任务使用步骤级别的值。

```
specificationVersion: 'jobtemplate-2023-09'
name: MyJob
jobEnvironments:
- name: JobEnv
  variables:
    JOB_PROJECT_ID: project-12
steps:
- name: MyStep
  stepEnvironments:
  - name: StepEnv
    variables:
      JOB_PROJECT_ID: step-project-12
```

## 试试看：运行环境变量示例
<a name="set-env-vars-example"></a>

Deadline Cloud 示例存储库包含一个[作业包，用于演示如何设置和查看环境变量](https://github.com/aws-deadline/deadline-cloud-samples/tree/mainline/job_bundles/job_env_vars/template.yaml)。示例作业模板定义了作业和步骤级别的变量，然后运行打印合并结果的任务。使用以下步骤运行样本并检查结果。

### 先决条件
<a name="set-prerequisites"></a>

1. 如果您没有包含队列和关联的 Linux 队列的 Deadline Cloud 场，请按照 De [adline Cloud 控制台](https://console.aws.amazon.com/deadlinecloud/home)中的指导性入门体验创建具有默认设置的群组。

1. 如果您的工作站上没有 Deadline Cloud CLI 和 De AWS adline Cloud 监控器，请按照[设置 Deadline Cloud 提交者](https://docs.aws.amazon.com/deadline-cloud/latest/userguide/submitter.html)中的步骤进行操作。

1. 用于克隆 D `git` e [adline Cloud 示例 GitHub存储库](https://github.com/aws-deadline/deadline-cloud-samples)。

   ```
   git clone https://github.com/aws-deadline/deadline-cloud-samples.git
   cd deadline-cloud-samples/job_bundles
   ```

### 运行示例
<a name="set-run-example"></a>

1. 使用 Deadline Cloud CLI 提交`job_env_vars`示例。

   ```
   deadline bundle submit job_env_vars
   ```

1. 在 Deadline Cloud 监视器中，选择新作业以监控其进度。与Linux队列关联的队列有工作人员可用后，任务将在几秒钟内完成。选择任务，然后在任务面板的右上角菜单中选择 “**查看日志**”。

### 将会话操作与其定义进行比较
<a name="set-compare-actions"></a>

日志视图显示三个会话操作。在文本编辑器中打开 [job\_env\_vars/template.yaml](https://github.com/aws-deadline/deadline-cloud-samples/tree/mainline/job_bundles/job_env_vars/template.yaml) 文件，将每个操作与其在作业模板中的定义进行比较。

1. 选择 “**启动 JobEnv**会话” 操作。日志输出显示正在设置的作业级环境变量。

   ```
   Setting: JOB_VERBOSITY=MEDIUM
   Setting: JOB_EXAMPLE_PARAM=An example parameter value
   Setting: JOB_PROJECT_ID=project-12
   Setting: JOB_ENDPOINT_URL=https://internal-host-name/some/path
   Setting: QT_QPA_PLATFORM=offscreen
   ```

   作业模板中的以下几行定义了此环境。

   ```
   jobEnvironments:
   - name: JobEnv
     variables:
       JOB_VERBOSITY: MEDIUM
       JOB_EXAMPLE_PARAM: "{{Param.ExampleParam}}"
       JOB_PROJECT_ID: project-12
       JOB_ENDPOINT_URL: https://internal-host-name/some/path
       QT_QPA_PLATFORM: offscreen
   ```

1. 选择 “**启动 StepEnv**会话” 操作。日志输出显示步骤级变量，包括被覆盖`JOB_PROJECT_ID`的变量。

   ```
   Setting: STEP_VERBOSITY=HIGH
   Setting: JOB_PROJECT_ID=step-project-12
   ```

   作业模板中的以下几行定义了此环境。

   ```
   stepEnvironments:
   - name: StepEnv
     variables:
       STEP_VERBOSITY: HIGH
       JOB_PROJECT_ID: step-project-12
   ```

1. 选择**任务运行**会话操作。日志输出显示任务可用的合并环境变量。请注意，`JOB_PROJECT_ID`它使用的是阶梯级值`step-project-12`。

   ```
   Environment variables starting with JOB_*:
   JOB_ENDPOINT_URL=https://internal-host-name/some/path
   JOB_EXAMPLE_PARAM='An example parameter value'
   JOB_PROJECT_ID=step-project-12
   JOB_VERBOSITY=MEDIUM
   
   Environment variables starting with STEP_*:
   STEP_VERBOSITY=HIGH
   ```