

Le traduzioni sono generate tramite traduzione automatica. In caso di conflitto tra il contenuto di una traduzione e la versione originale in Inglese, quest'ultima prevarrà.

# Usa il framework AWSTOE dei documenti dei componenti per i componenti personalizzati
<a name="toe-use-documents"></a>

Per creare un componente utilizzando il framework di componenti AWS Task Orchestrator and Executor (AWSTOE), devi fornire un documento basato su YAML che rappresenti le fasi e i passaggi applicabili al componente che crei. Servizi AWS usa il tuo componente quando creano una nuova Amazon Machine Image (AMI) o un'immagine del contenitore.

**Topics**
+ [Flusso di lavoro relativo ai documenti](#component-doc-workflow)
+ [Registrazione dei componenti](#component-logging)
+ [Concatenamento di input e output](#document-chaining)
+ [Schema e definizioni del documento](#document-schema)
+ [Esempi di documenti](#document-example)
+ [Usa le variabili nel tuo documento componente personalizzato](toe-user-defined-variables.md)
+ [Usa costrutti condizionali in AWSTOE](toe-conditional-constructs.md)
+ [Usa gli operatori di confronto nei documenti AWSTOE dei componenti](toe-comparison-operators.md)
+ [Utilizzo di operatori logici nei documenti AWSTOE dei componenti](toe-logical-operators.md)
+ [Usa costrutti a ciclo continuo in AWSTOE](toe-looping-constructs.md)

## Flusso di lavoro relativo ai documenti
<a name="component-doc-workflow"></a>

Il documento del AWSTOE componente utilizza fasi e passaggi per raggruppare le attività correlate e organizzarle in un flusso di lavoro logico per il componente.

**Suggerimento**  
Il servizio che utilizza il componente per creare un'immagine potrebbe implementare regole su quali fasi utilizzare per il processo di creazione e quando tali fasi possono essere eseguite. Questo è importante da considerare quando si progetta il componente.

**Fasi**  
Le fasi rappresentano la progressione del flusso di lavoro attraverso il processo di creazione dell'immagine. Ad esempio, il servizio Image Builder utilizza `validate` le fasi `build` e le fasi durante la *fase di creazione* per le immagini che produce. Utilizza `container-host-test` le fasi `test` and durante la *fase di test* per garantire che l'istantanea dell'immagine o l'immagine del contenitore produca i risultati previsti prima di creare l'AMI finale o distribuire l'immagine del contenitore.

Quando il componente viene eseguito, i comandi associati per ogni fase vengono applicati nell'ordine in cui appaiono nel documento del componente.

**Regole per le fasi**
+ Il nome di ogni fase deve essere univoco all'interno di un documento.
+ È possibile definire molte fasi del documento.
+ È necessario includere almeno una delle seguenti fasi nel documento:
  + **build**: per Image Builder, questa fase viene generalmente utilizzata durante la fase di *creazione*.
  + **validare**: per Image Builder, questa fase viene generalmente utilizzata durante *la* fase di creazione.
  + **test** — per Image Builder, questa fase viene generalmente utilizzata durante la fase di *test*.
+ Le fasi vengono sempre eseguite nell'ordine in cui sono definite nel documento. L'ordine in cui sono specificate per AWSTOE i comandi in non AWS CLI ha effetto.

**Fasi**  
I passaggi sono singole unità di lavoro che definiscono il flusso di lavoro all'interno di ciascuna fase. Le fasi vengono eseguite in ordine sequenziale. Tuttavia, l'input o l'output di una fase possono anche alimentare una fase successiva come input. Questo processo si chiama «concatenamento».

**Regole per i passaggi**
+ Il nome della fase deve essere univoco per la fase.
+ La fase deve utilizzare un'azione supportata (modulo di azione) che restituisca un codice di uscita.

  Per un elenco completo dei moduli di azione supportati, del loro funzionamento, input/output dei valori e degli esempi, consulta[Moduli di azione supportati dal gestore AWSTOE dei componenti](toe-action-modules.md).

## Registrazione dei componenti
<a name="component-logging"></a>

AWSTOE crea una nuova cartella di registro sulle istanze EC2 che vengono utilizzate per creare e testare una nuova immagine, ogni volta che il componente viene eseguito. Per le immagini del contenitore, la cartella di registro viene archiviata nel contenitore.

Per facilitare la risoluzione dei problemi in caso di problemi durante il processo di creazione dell'immagine, il documento di input e tutti i file di output AWSTOE creati durante l'esecuzione del componente vengono archiviati nella cartella di registro.

Il nome della cartella di registro è composto dalle seguenti parti:

1. **Directory di log**: quando un servizio esegue un AWSTOE componente, questo passa nella directory di log, insieme ad altre impostazioni per il comando. Per gli esempi seguenti, mostriamo il formato di file di registro utilizzato da Image Builder.
   + **Linux e macOS:** `/var/lib/amazon/toe/`
   + **Windows**: `$env:ProgramFiles\Amazon\TaskOrchestratorAndExecutor\`

1. **Prefisso del file**: si tratta di un prefisso standard utilizzato per tutti i componenti: "». `TOE_`

1. **Ora di esecuzione**: si tratta di un timestamp in formato \$1HH-MM-SS\$1UTC-0. YYYY-MM-DD

1. **ID di esecuzione: è il GUID** assegnato quando vengono eseguiti uno o più componenti. AWSTOE 

Ad esempio: `/var/lib/amazon/toe/TOE_2021-07-01_12-34-56_UTC-0_a1bcd2e3-45f6-789a-bcde-0fa1b2c3def4`

AWSTOE memorizza i seguenti file principali nella cartella di registro:

**File di input**
+ **document.yaml** — Il documento utilizzato come input per il comando. Dopo l'esecuzione del componente, questo file viene memorizzato come artefatto.

**File di output**
+ **application.log**: il registro dell'applicazione contiene informazioni a livello di debug con data e ora AWSTOE relative a ciò che accade durante l'esecuzione del componente.
+ **detailedoutput.json**: questo file JSON contiene informazioni dettagliate sullo stato di esecuzione, gli input, gli output e gli errori per tutti i documenti, le fasi e i passaggi relativi al componente durante l'esecuzione.
+ **console.log** — Il registro della console contiene tutte le informazioni sullo standard out (stdout) e sugli errori standard (stderr) che vengono scritte sulla console mentre il componente è in esecuzione. AWSTOE 
+ **chaining.json: questo file JSON** rappresenta le ottimizzazioni applicate per risolvere le espressioni di concatenamento. AWSTOE 

**Nota**  
La cartella di registro potrebbe contenere anche altri file temporanei che non sono trattati qui.

## Concatenamento di input e output
<a name="document-chaining"></a>

L'applicazione AWSTOE di gestione della configurazione fornisce una funzionalità per concatenare input e output scrivendo riferimenti nei seguenti formati:

`{{ phase_name.step_name.inputs/outputs.variable }}`

or

`{{ phase_name.step_name.inputs/outputs[index].variable }}`

La funzione di concatenamento consente di riciclare il codice e migliorare la manutenibilità del documento.

**Regole per il concatenamento**
+ Le espressioni di concatenamento possono essere utilizzate solo nella sezione degli input di ogni passaggio.
+ Le dichiarazioni con espressioni concatenate devono essere racchiuse tra virgolette. Esempio:
  + **Espressione non valida:** `echo {{ phase.step.inputs.variable }}`
  + **Espressione valida**: `"echo {{ phase.step.inputs.variable }}"`
  + **Espressione valida**: `'echo {{ phase.step.inputs.variable }}'`
+ Le espressioni concatenate possono fare riferimento a variabili di altri passaggi e fasi dello stesso documento. Tuttavia, il servizio di chiamata potrebbe avere regole che richiedono che le espressioni concatenate funzionino solo nel contesto di una singola fase. Ad esempio, Image Builder non supporta il concatenamento dalla fase di *compilazione alla fase* di *test, poiché esegue ogni fase* in modo indipendente.
+ Gli indici nelle espressioni concatenate seguono l'indicizzazione a base zero. L'indice inizia con zero (0) per fare riferimento al primo elemento.

**Esempi**

Per fare riferimento alla variabile source nella seconda voce del passaggio di esempio seguente, lo schema di concatenamento è`{{ build.SampleS3Download.inputs[1].source }}`.

```
phases:
  - name: 'build'
    steps:
      - name: SampleS3Download
        action: S3Download
        timeoutSeconds: 60
        onFailure: Abort
        maxAttempts: 3
        inputs:
          - source: 's3://sample-bucket/sample1.ps1'
            destination: 'C:\sample1.ps1'
          - source: 's3://sample-bucket/sample2.ps1'
            destination: 'C:\sample2.ps1'
```

Per fare riferimento alla variabile di output (uguale a «Hello») del seguente passaggio di esempio, lo schema di concatenamento è. `{{ build.SamplePowerShellStep.outputs.stdout }}`

```
phases:
  - name: 'build'
    steps:
      - name: SamplePowerShellStep
        action: ExecutePowerShell
        timeoutSeconds: 120
        onFailure: Abort
        maxAttempts: 3
        inputs:
          commands:
            - 'Write-Host "Hello"'
```

## Schema e definizioni del documento
<a name="document-schema"></a>

Di seguito è riportato lo schema YAML per un documento.

```
name: (optional)
description: (optional)
schemaVersion: "string"

phases:
  - name: "string"
    steps:
      - name: "string"
        action: "string"
        timeoutSeconds: integer
        onFailure: "Abort|Continue|Ignore"
        maxAttempts: integer
        inputs:
```

Le definizioni dello schema per un documento sono le seguenti.


| Campo | Description | Tipo | Richiesto | 
| --- | --- | --- | --- | 
| nome | Nome del documento. | Stringa | No | 
| description | Descrizione del documento. | Stringa |  No  | 
| schemaVersion | Versione dello schema del documento, attualmente 1.0. | Stringa |  Sì  | 
| phases | Un elenco di fasi con i relativi passaggi. |  List  |  Sì  | 

Le definizioni dello schema per una fase sono le seguenti.


| Campo | Description | Tipo | Richiesto | 
| --- | --- | --- | --- | 
| nome | Nome della fase. | Stringa | Sì | 
| steps | Elenco delle fasi della fase. | List  |  Sì  | 

Le definizioni dello schema per una fase sono le seguenti.


| Campo | Description | Tipo | Richiesto | Valore predefinito | 
| --- | --- | --- | --- | --- | 
| nome | Nome definito dall'utente per il passo. | Stringa |  |  | 
| operazione | Parola chiave relativa al modulo che esegue il passaggio. | Stringa |  |  | 
| timeoutSeconds |  Numero di secondi di esecuzione del passaggio prima di fallire o riprovare.  Inoltre, supporta il valore -1, che indica un timeout infinito. 0 e altri valori negativi non sono consentiti.  | Numero intero |  No  | 7.200 sec (120 minuti) | 
| onFailure |  Specifica cosa deve fare la fase in caso di errore. I valori validi sono:  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/it_it/imagebuilder/latest/userguide/toe-use-documents.html)  |  Stringa  |  No  | Interruzione | 
| maxAttempts | Numero massimo di tentativi consentiti prima di fallire il passaggio. | Numero intero |  No  | 1 | 
| inputs | Contiene i parametri richiesti dal modulo di azione per eseguire il passaggio. | Dict |  Sì  |  | 

## Esempi di documenti
<a name="document-example"></a>

Gli esempi seguenti mostrano i documenti dei AWSTOE componenti che eseguono attività per il sistema operativo di destinazione.

------
#### [ Linux ]

**Esempio 1: eseguire un file binario personalizzato**  
Di seguito è riportato un documento di esempio che scarica ed esegue un file binario personalizzato su un'istanza Linux.

```
name: LinuxBin
description: Download and run a custom Linux binary file.
schemaVersion: 1.0
phases:
  - name: build
    steps:
      - name: Download
        action: S3Download
        inputs:
          - source: s3://<replaceable>amzn-s3-demo-source-bucket</replaceable>/<replaceable>myapplication</replaceable>
            destination: /tmp/<replaceable>myapplication</replaceable>
      - name: Enable
        action: ExecuteBash
        onFailure: Continue
        inputs:
          commands:
            - 'chmod u+x {{ build.Download.inputs[0].destination }}'
      - name: Install
        action: ExecuteBinary
        onFailure: Continue
        inputs:
          path: '{{ build.Download.inputs[0].destination }}'
          arguments:
            - '--install'
      - name: Delete
        action: DeleteFile
        inputs:
          - path: '{{ build.Download.inputs[0].destination }}'
```

------
#### [ Windows ]

**Esempio 1: installare gli aggiornamenti di Windows**  
Di seguito è riportato un documento di esempio che installa tutti gli aggiornamenti di Windows disponibili, esegue uno script di configurazione, convalida le modifiche prima della creazione dell'AMI e verifica le modifiche dopo la creazione dell'AMI.

```
name: RunConfig_UpdateWindows
description: 'This document will install all available Windows updates and run a config script. It will then validate the changes before an AMI is created. Then after AMI creation, it will test all the changes.'
schemaVersion: 1.0
phases:
  - name: build
    steps:
      - name: DownloadConfigScript
        action: S3Download
        timeoutSeconds: 60
        onFailure: Abort
        maxAttempts: 3
        inputs:
          - source: 's3://customer-bucket/config.ps1'
            destination: 'C:\config.ps1'

      - name: RunConfigScript
        action: ExecutePowerShell
        timeoutSeconds: 120
        onFailure: Abort
        maxAttempts: 3
        inputs:
          file: '{{build.DownloadConfigScript.inputs[0].destination}}'

      - name: Cleanup
        action: DeleteFile
        onFailure: Abort
        maxAttempts: 3
        inputs:
          - path: '{{build.DownloadConfigScript.inputs[0].destination}}'

      - name: RebootAfterConfigApplied
        action: Reboot
        inputs:
          delaySeconds: 60

      - name: InstallWindowsUpdates
        action: UpdateOS

  - name: validate
    steps:
      - name: DownloadTestConfigScript
        action: S3Download
        timeoutSeconds: 60
        onFailure: Abort
        maxAttempts: 3
        inputs:
          - source: 's3://customer-bucket/testConfig.ps1'
            destination: 'C:\testConfig.ps1'

      - name: ValidateConfigScript
        action: ExecutePowerShell
        timeoutSeconds: 120
        onFailure: Abort
        maxAttempts: 3
        inputs:
          file: '{{validate.DownloadTestConfigScript.inputs[0].destination}}'

      - name: Cleanup
        action: DeleteFile
        onFailure: Abort
        maxAttempts: 3
        inputs:
          - path: '{{validate.DownloadTestConfigScript.inputs[0].destination}}'

  - name: test
    steps:
      - name: DownloadTestConfigScript
        action: S3Download
        timeoutSeconds: 60
        onFailure: Abort
        maxAttempts: 3
        inputs:
          - source: 's3://customer-bucket/testConfig.ps1'
            destination: 'C:\testConfig.ps1'

      - name: ValidateConfigScript
        action: ExecutePowerShell
        timeoutSeconds: 120
        onFailure: Abort
        maxAttempts: 3
        inputs:
          file: '{{test.DownloadTestConfigScript.inputs[0].destination}}'
```

**Esempio 2: installalo AWS CLI su un'istanza di Windows**  
Di seguito è riportato un documento di esempio che installa AWS CLI su un'istanza di Windows, utilizzando il file di installazione.

```
name: InstallCLISetUp
description: Install &CLI; using the setup file
schemaVersion: 1.0
phases:
  - name: build
    steps:
      - name: Download
        action: S3Download
        inputs:
          - source: s3://aws-cli/AWSCLISetup.exe
            destination: C:\Windows\temp\AWSCLISetup.exe
      - name: Install
        action: ExecuteBinary
        onFailure: Continue
        inputs:
          path: '{{ build.Download.inputs[0].destination }}'
          arguments:
            - '/install'
            - '/quiet'
            - '/norestart'
      - name: Delete
        action: DeleteFile
        inputs:
          - path: '{{ build.Download.inputs[0].destination }}'
```

**Esempio 3: installare il file AWS CLI con il programma di installazione MSI**  
Di seguito è riportato un documento di esempio che installa il AWS CLI con il programma di installazione MSI.

```
name: InstallCLIMSI
description: Install &CLI; using the MSI installer
schemaVersion: 1.0
phases:
  - name: build
    steps:
      - name: Download
        action: S3Download
        inputs:
          - source: s3://aws-cli/AWSCLI64PY3.msi
            destination: C:\Windows\temp\AWSCLI64PY3.msi
      - name: Install
        action: ExecuteBinary
        onFailure: Continue
        inputs:
          path: 'C:\Windows\System32\msiexec.exe'
          arguments:
            - '/i'
            - '{{ build.Download.inputs[0].destination }}'
            - '/quiet'
            - '/norestart'
      - name: Delete
        action: DeleteFile
        inputs:
          - path: '{{ build.Download.inputs[0].destination }}'
```

------
#### [ macOS ]

**Esempio 1: eseguire un file binario macOS personalizzato**  
Di seguito è riportato un documento di esempio che scarica ed esegue un file binario personalizzato su un'istanza macOS.

```
name: macOSBin
description: Download and run a binary file on macOS.
schemaVersion: 1.0
phases:
  - name: build
    steps:
      - name: Download
        action: S3Download
        inputs:
          - source: s3://<replaceable>amzn-s3-demo-source-bucket</replaceable>/<replaceable>myapplication</replaceable>
            destination: /tmp/<replaceable>myapplication</replaceable>
      - name: Enable
        action: ExecuteBash
        onFailure: Continue
        inputs:
          commands:
            - 'chmod u+x {{ build.Download.inputs[0].destination }}'
      - name: Install
        action: ExecuteBinary
        onFailure: Continue
        inputs:
          path: '{{ build.Download.inputs[0].destination }}'
          arguments:
            - '--install'
      - name: Delete
        action: DeleteFile
        inputs:
          - path: '{{ build.Download.inputs[0].destination }}'
```

------

# Usa le variabili nel tuo documento componente personalizzato
<a name="toe-user-defined-variables"></a>

Le variabili forniscono un modo per etichettare i dati con nomi significativi che possono essere utilizzati in un'applicazione. È possibile definire variabili personalizzate con formati semplici e leggibili per flussi di lavoro complessi e farvi riferimento nel documento del componente dell'applicazione YAML per un componente. AWSTOE 

Questa sezione fornisce informazioni per aiutarvi a definire le variabili per il AWSTOE componente nel documento del componente dell'applicazione YAML, tra cui sintassi, vincoli di nome ed esempi.

## Costanti
<a name="user-defined-vars-constants"></a>

Le costanti sono variabili immutabili che non possono essere modificate o sovrascritte una volta definite. Le costanti possono essere definite utilizzando i valori nella sezione di un documento. `constants` AWSTOE 

**Regole per i nomi delle costanti**
+ La lunghezza del nome deve essere compresa tra 3 e 128 caratteri.
+ Il nome può contenere solo caratteri alfanumerici (a-z, A-Z, 0-9), trattini (-) o caratteri di sottolineatura (\$1).
+ Il nome deve essere univoco all'interno del documento.
+ Il nome deve essere specificato come stringa YAML.

**Sintassi**

```
constants:
  - <name>:
      type: <constant type>
      value: <constant value>
```


| Nome chiave | Richiesto | Descrizione | 
| --- | --- | --- | 
|  `name`  |  Sì  | Nome della costante. Deve essere univoco per il documento (non deve essere uguale a nessun altro nome di parametro o costante). | 
| `value` | Sì | Valore della costante. | 
| `type` | Sì | Tipo di costante. Il tipo supportato èstring. | 

**Valori costanti di riferimento in un documento**  
Puoi fare riferimento alle costanti negli input step o loop all'interno del tuo documento YAML, come segue:
+ I riferimenti alle costanti fanno distinzione tra maiuscole e minuscole e il nome deve corrispondere esattamente.
+ Il nome deve essere racchiuso tra parentesi doppie arricciate. `{{` *MyConstant* `}}`
+ Gli spazi all'interno delle parentesi arricciate sono consentiti e vengono tagliati automaticamente. Ad esempio, tutti i seguenti riferimenti sono validi:

  `{{ MyConstant }}`, `{{ MyConstant}}`, `{{MyConstant }}`, `{{MyConstant}}`
+ Il riferimento nel documento YAML deve essere specificato come stringa (racchiusa tra virgolette singole o doppie).

  Ad esempio: non `- {{ MyConstant }}` è valido, in quanto non è identificato come stringa.

  Tuttavia, i seguenti riferimenti sono entrambi validi: `- '{{ MyConstant }}'` e`- "{{ MyConstant }}"`.

**Esempi**  
Costante a cui si fa riferimento negli ingressi Step

```
name: Download AWS CLI version 2
schemaVersion: 1.0
constants:
  - Source:
      type: string
      value: https://awscli.amazonaws.com/AWSCLIV2.msi
phases:
  - name: build
    steps:
      - name: Download
        action: WebDownload
        inputs:
          - source: '{{ Source }}'
            destination: 'C:\Windows\Temp\AWSCLIV2.msi'
```

Costante referenziata negli ingressi in loop

```
name: PingHosts
schemaVersion: 1.0
constants:
  - Hosts:
      type: string
      value: 127.0.0.1,amazon.com
phases:
  - name: build
    steps:
      - name: Ping
        action: ExecuteBash
        loop:
          forEach:
            list: '{{ Hosts }}'
            delimiter: ','
        inputs:
          commands:
            - ping -c 4 {{ loop.value }}
```

## Parameters
<a name="user-defined-vars-parameters"></a>

I parametri sono variabili mutabili, con impostazioni che l'applicazione chiamante può fornire in fase di esecuzione. È possibile definire i parametri nella `Parameters` sezione del documento YAML.

**Regole per i nomi dei parametri**
+ La lunghezza del nome deve essere compresa tra 3 e 128 caratteri.
+ Il nome può contenere solo caratteri alfanumerici (a-z, A-Z, 0-9), trattini (-) o caratteri di sottolineatura (\$1).
+ Il nome deve essere univoco all'interno del documento.
+ Il nome deve essere specificato come stringa YAML.

### Sintassi
<a name="vars-parameters-syntax"></a>

```
parameters:
  - <name>:
      type: <parameter type>
      default: <parameter value>
      description: <parameter description>
```


| Nome chiave | Richiesto | Descrizione | 
| --- | --- | --- | 
| `name` | Sì | Nome del parametro. Deve essere univoco per il documento (non deve essere uguale a nessun altro nome di parametro o costante). | 
| `type` | Sì | Il tipo di dati del parametro. I tipi supportati includono:`string`. | 
| `default` | No | Il valore predefinito per il parametro. | 
| `description` | No | Descrive il parametro. | 

### Valori dei parametri di riferimento in un documento
<a name="vars-parameters-referencing"></a>

Puoi fare riferimento ai parametri negli input step o loop all'interno del tuo documento YAML, come segue:
+ I riferimenti ai parametri fanno distinzione tra maiuscole e minuscole e il nome deve corrispondere esattamente.
+ Il nome deve essere racchiuso tra parentesi graffe doppie. `{{` *MyParameter* `}}`
+ Gli spazi all'interno delle parentesi arricciate sono consentiti e vengono tagliati automaticamente. Ad esempio, tutti i seguenti riferimenti sono validi:

  `{{ MyParameter }}`, `{{ MyParameter}}`, `{{MyParameter }}`, `{{MyParameter}}`
+ Il riferimento nel documento YAML deve essere specificato come stringa (racchiusa tra virgolette singole o doppie).

  Ad esempio: non `- {{ MyParameter }}` è valido, in quanto non è identificato come stringa.

  Tuttavia, i seguenti riferimenti sono entrambi validi: `- '{{ MyParameter }}'` e`- "{{ MyParameter }}"`.

**Esempi**  
Gli esempi seguenti mostrano come utilizzare i parametri nel documento YAML:
+ Fate riferimento a un parametro in Step Inputs:

  ```
  name: Download AWS CLI version 2
  schemaVersion: 1.0
  parameters:
    - Source:
        type: string
        default: 'https://awscli.amazonaws.com/AWSCLIV2.msi'
        description: The AWS CLI installer source URL.
  phases:
    - name: build
      steps:
        - name: Download
          action: WebDownload
          inputs:
            - source: '{{ Source }}'
              destination: 'C:\Windows\Temp\AWSCLIV2.msi'
  ```
+ Fate riferimento a un parametro negli ingressi del loop:

  ```
  name: PingHosts
  schemaVersion: 1.0
  parameters:
    - Hosts:
        type: string
        default: 127.0.0.1,amazon.com
        description: A comma separated list of hosts to ping.
  phases:
    - name: build
      steps:
        - name: Ping
          action: ExecuteBash
          loop:
            forEach:
              list: '{{ Hosts }}'
              delimiter: ','
          inputs:
            commands:
              - ping -c 4 {{ loop.value }}
  ```

### Sostituisci i parametri in fase di esecuzione
<a name="vars-parameters-set-at-runtime"></a>

È possibile utilizzare l'`--parameters`opzione AWS CLI con una coppia chiave-valore per impostare il valore di un parametro in fase di esecuzione.
+ <name><value>Specificate la coppia chiave-valore del parametro come nome e valore, separati da un segno di uguale (=).
+ Più parametri devono essere separati da una virgola.
+ I nomi dei parametri che non si trovano nel documento del componente YAML vengono ignorati.
+ Il nome e il valore del parametro sono entrambi obbligatori.

**Importante**  
I parametri dei componenti sono valori di testo semplice e vengono registrati. AWS CloudTrail Ti consigliamo di utilizzare Gestione dei segreti AWS o il AWS Systems Manager Parameter Store per archiviare i tuoi segreti. Per ulteriori informazioni su Secrets Manager, vedi [Cos'è Secrets Manager?](https://docs.aws.amazon.com/secretsmanager/latest/userguide/intro.html) nella *Guida Gestione dei segreti AWS per l'utente*. Per ulteriori informazioni su AWS Systems Manager Parameter Store, vedere [AWS Systems Manager Parameter Store](https://docs.aws.amazon.com/systems-manager/latest/userguide/systems-manager-parameter-store.html) nella *Guida AWS Systems Manager per l'utente*.

#### Sintassi
<a name="vars-runtime-parameters-syntax"></a>

```
--parameters name1=value1,name2=value2...
```


| Opzione CLI | Richiesto | Description | 
| --- | --- | --- | 
| --parameters *name* =*value*,... | No | Questa opzione accetta l'elenco delle coppie chiave-valore, con il nome del parametro come chiave. | 

**Esempi**  
Gli esempi seguenti mostrano come utilizzare i parametri nel documento YAML:
+ La coppia chiave-valore del parametro specificata in questa `--parameter` opzione non è valida:

  ```
  --parameters ntp-server=
  ```
+ Imposta una coppia chiave-valore di parametro con l'opzione in`--parameter`: AWS CLI

  ```
  --parameters ntp-server=ntp-server-windows-qe.us-east1.amazon.com
  ```
+ Imposta più coppie chiave-valore di parametri con l'opzione in`--parameter`: AWS CLI

  ```
  --parameters ntp-server=ntp-server.amazon.com,http-url=https://internal-us-east1.amazon.com
  ```

## Usa i parametri del Parameter Store di Systems Manager
<a name="toe-ssm-parameters"></a>

È possibile fare riferimento ai parametri AWS Systems Manager Parameter Store (parametri SSM) nei documenti dei componenti aggiungendo alle variabili il prefisso. `aws:ssm` Ad esempio, 

`{{ aws:ssm:/my/param }}`si risolve al valore del parametro SSM. `/my/param`

Questa funzionalità supporta i seguenti tipi di parametri SSM:
+ Stringa: esegue il mapping al tipo di AWSTOE stringa.
+ StringList — Esegue il mapping al AWSTOE `stringList` tipo.
+ SecureString — Esegue il mapping al tipo di AWSTOE stringa.

Per ulteriori informazioni sull'archivio dei parametri, vedere [AWS Systems Manager Parameter Store](https://docs.aws.amazon.com/systems-manager/latest/userguide/systems-manager-parameter-store.html) nella *Guida AWS Systems Manager per l'utente*.

Puoi anche fare riferimento ai Gestione dei segreti AWS segreti utilizzando un parametro `SecureString` SSM. Ad esempio: `{{ aws:ssm:/aws/reference/secretsmanager/test/test-secret }}`. Per ulteriori informazioni, vedere [Riferimento ai Gestione dei segreti AWS segreti dai parametri del Parameter Store](https://docs.aws.amazon.com/systems-manager/latest/userguide/integration-ps-secretsmanager.html).

**Importante**  
Image Builder esclude la risoluzione `SecureString` dei parametri dai suoi registri. Tuttavia, l'utente è anche responsabile di garantire che le informazioni riservate non vengano registrate tramite i comandi immessi nel documento del componente. Ad esempio, se si utilizza il `echo` comando con una stringa sicura, il comando scrive un valore in chiaro nel registro.

### Autorizzazioni IAM richieste
<a name="toe-ssm-parameters-permissions"></a>

Per utilizzare i parametri Systems Manager nei componenti, il ruolo dell'istanza deve disporre dell'`ssm:GetParameter`autorizzazione per la risorsa parametrica ARN. Esempio:

------
#### [ JSON ]

****  

```
{
	"Version":"2012-10-17",		 	 	 
	"Statement": [
		{
			"Effect": "Allow",
			"Action": "ssm:GetParameter",
			"Resource": "arn:aws:ssm:*:111122223333:parameter/ImageBuilder-*"
		}
	]
}
```

------

Per accedere ai valori crittografati, sono inoltre necessarie le seguenti autorizzazioni:
+ Aggiungi `kms:Decrypt` per `SecureString` parametri o Gestione dei segreti AWS valori crittografati con un servizio gestito AWS KMS key dal cliente.
+ Aggiungi `secretsmanager:GetSecretValue` se fai riferimento a un segreto di Secrets Manager.

### Fai riferimento a un parametro SSM in un documento componente
<a name="toe-ssm-parameters-example"></a>

L'esempio seguente mostra come fare riferimento a un parametro Systems Manager Parameter Store dei parametri di Systems Manager in un componente:

```
name: UseSSMParameterVariable
description: This is a sample component document that prints out the value of an SSM Parameter. Never do this for a SecureString parameter.
schemaVersion: 1.0

phases:
  - name: verify
    steps:
      - name: EchoParameterValue
        action: ExecuteBash
        inputs:
          commands:
            - echo "Log SSM parameter name: /my/test/param, value {{ aws:ssm:/my/test/param }}."
```

### Risoluzione variabile dinamica di runtime per i parametri SSM
<a name="toe-dynamic-vars"></a>

AWSTOE fornisce la seguente funzione integrata che è possibile utilizzare all'interno dei riferimenti alle variabili per manipolare o trasformare i valori in fase di esecuzione.

#### funzione di risoluzione
<a name="toe-function-resolve"></a>

La `resolve` funzione risolve un riferimento a una variabile all'interno di un altro riferimento a una variabile, consentendo il riferimento dinamico al nome della variabile. Ciò è utile quando si lavora con parametri SSM in cui parte del percorso del parametro può essere variabile e passata come parametro del documento.

La `resolve` funzione supporta solo la risoluzione dinamica della parte relativa al nome di un parametro SSM.

##### Sintassi
<a name="toe-function-resolve-syntax"></a>

L'`dynamic_variable`esempio seguente rappresenta il nome di un parametro SSM e deve essere uno dei seguenti:
+ Un riferimento a un parametro SSM (ad esempio,) `aws:ssm:/my/param`
+ Un riferimento a un parametro del documento componente (ad esempio,`parameter-name`)

```
{{ aws:ssm:resolve(dynamic_variable) }}
```

##### Esempio: risolvi un parametro SSM in fase di esecuzione
<a name="toe-function-resolve-examples"></a>

L'esempio seguente mostra come utilizzare la `resolve` funzione in un documento del componente YAML:

```
name: SsmParameterTest
description: This component verifies an SSM parameter variable reference with the echo command.
schemaVersion: 1.0

parameters:
  - parameter-name:
      type: string
      description: "test"

phases:
  - name: validate
    steps:
      - name: PrintDynamicVariable
        action: ExecuteBash
        inputs:
          commands:
            - echo "{{ aws:ssm:resolve(parameter-name) }}"
```

# Usa costrutti condizionali in AWSTOE
<a name="toe-conditional-constructs"></a>

I costrutti condizionali eseguono azioni diverse nel documento del componente a seconda che l'espressione condizionale specificata restituisca o meno. `true` `false` È possibile utilizzare il `if` costrutto per controllare il flusso di esecuzione nel documento componente.

## if Construct
<a name="toe-conditional-if"></a>

È possibile utilizzare il `if` costrutto per valutare se un passaggio deve essere eseguito o meno. Per impostazione predefinita, quando l'espressione `if` condizionale restituisce`true`, AWSTOE esegue il passaggio e quando la condizione restituisce a`false`, AWSTOE salta il passaggio. Se un passaggio viene saltato, viene considerato come un passaggio riuscito quando si AWSTOE valuta se la fase e il documento sono stati eseguiti correttamente.

**Nota**  
Un'`if`istruzione viene valutata solo una volta, anche se il passaggio attiva un riavvio. Se un passaggio si riavvia, riconosce che l'`if`istruzione è già stata valutata e continua da dove era stata interrotta.

### Sintassi
<a name="toe-conditional-if-syntax"></a>

```
if:
  - <conditional expression>:
      [then: <step action>]
      [else: <step action>]
```


| Nome chiave | Richiesto | Description | 
| --- | --- | --- | 
| espressione condizionale | Sì |  L'espressione condizionale può contenere esattamente uno dei seguenti tipi di operatori al livello superiore. [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/it_it/imagebuilder/latest/userguide/toe-conditional-constructs.html) Se l'espressione deve soddisfare più condizioni, utilizzate un operatore logico per specificare le condizioni.  | 
| poi | No |  Definisce l'azione da intraprendere se l'espressione condizionale restituisce. `true`  | 
| altro | No |  Definisce l'azione da intraprendere se l'espressione condizionale restituisce un risultato. `false`  | 
| azione graduale | Condizionale |  Quando si utilizza `then` o`else`, è necessario specificare una delle seguenti azioni di fase: [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/it_it/imagebuilder/latest/userguide/toe-conditional-constructs.html)  | 

**Esempio 1: pacchetto di installazione**  
I seguenti passaggi di esempio tratti da un documento relativo a un AWSTOE componente utilizzano operatori logici per testare il valore di un parametro ed eseguire i comandi appropriati del gestore di pacchetti per installare un'applicazione se il pacchetto è decompresso.

```
    - name: InstallUnzipAptGet
      action: ExecuteBash
      if:
        and:
            - binaryExists: 'apt-get'
            - not:
                binaryExists: 'unzip'
      inputs:
        commands:
            - sudo apt-get update
            - sudo apt-get install -y unzip

    - name: InstallUnzipYum
      action: ExecuteBash
      if:
        and:
            - binaryExists: 'yum'
            - not:
                binaryExists: 'unzip'
      inputs:
        commands:
            - sudo yum install -y unzip

    - name: InstallUnzipZypper
      action: ExecuteBash
      if:
        and:
            - binaryExists: 'zypper'
            - not:
                binaryExists: 'unzip'
      inputs:
        commands:
            - sudo zypper refresh
            - sudo zypper install -y unzip
```

**Esempio 2: saltare un passaggio**  
L'esempio seguente mostra due modi per saltare un passaggio. Uno utilizza un operatore logico e l'altro utilizza un operatore di confronto con l'azione del `Skip` passaggio.

```
# Creates a file if it does not exist using not
- name: CreateMyConfigFile-1
  action: ExecuteBash
  if:
    not:
      fileExists: '/etc/my_config'
  inputs:
    commands:
      - echo "Hello world" > '/etc/my_config'

# Creates a file if it does not exist using then and else
- name: CreateMyConfigFile-2
  action: ExecuteBash
  if:
    fileExists: '/etc/my_config'
    then: Skip
    else: Execute
  inputs:
    commands:
      - echo "Hello world" > '/etc/my_config'
```

# Usa gli operatori di confronto nei documenti AWSTOE dei componenti
<a name="toe-comparison-operators"></a>

È possibile utilizzare i seguenti operatori di confronto con il modulo di **[Affermare](toe-action-modules.md#action-modules-assertion)** azione e con le espressioni condizionali che utilizzano il[if ConstructSintassi](toe-conditional-constructs.md#toe-conditional-if). Un operatore di confronto può operare su un singolo valore, ad esempio`stringIsEmpty`, oppure confrontare un valore di base con un secondo valore (valore variabile) per determinare se l'espressione condizionale restituisce o. `true` `false`

Se il confronto opera su due valori, il secondo valore può essere una variabile di concatenamento.

Quando si confrontano valori di tipo diverso, prima del confronto possono verificarsi le seguenti conversioni di valore:
+ Per i confronti numerici, se il valore della variabile è una stringa, AWSTOE converte la stringa in un numero prima della valutazione. Se la conversione non è possibile, viene restituito il confronto. `false` Ad esempio, se il valore della variabile è`"1.0"`, la conversione funziona, ma se il valore della variabile è `"a10"` la conversione fallisce.
+ Per i confronti tra stringhe, se il valore della variabile è un numero, lo AWSTOE converte in una stringa prima della valutazione.

## Confronta le stringhe
<a name="toe-compare-strings"></a>

I seguenti operatori di confronto utilizzano le stringhe per confrontare valori, verificare la presenza di spazi o una stringa vuota o confrontare un valore di input con un modello regex. I confronti tra stringhe non fanno distinzione tra maiuscole e minuscole e non tagliano gli spazi dall'inizio o dalla fine degli input di stringa.

**Operatori di confronto tra stringhe**
+ [stringIsEmpty](#stringIsEmpty)
+ [stringIsWhitespace](#stringIsWhitespace)
+ [stringEquals](#stringEquals)
+ [stringLessThan](#stringLessThan)
+ [stringLessThanEquals](#stringLessThanEquals)
+ [stringGreaterThan](#stringGreaterThan)
+ [stringGreaterThanEquals](#stringGreaterThanEquals)
+ [patternMatches](#patternMatches)

**stringIsEmpty**  
L'`stringIsEmpty`operatore restituisce `true` se la stringa specificata non contiene caratteri. Esempio:  

```
# Evaluates to true
stringIsEmpty: ""

# Evaluates to false
stringIsEmpty: " "
				
# Evaluates to false
stringIsEmpty: "Hello."
```

**stringIsWhitespace**  
Verifica se la stringa specificata per `stringIsWhitespace` contiene solo spazi. Esempio:  

```
# Evaluates to true
stringIsWhitespace: "   "

# Evaluates to false
stringIsWhitespace: ""
				
# Evaluates to false
stringIsWhitespace: " Hello?"
```

**StringEquals**  
Verifica se la stringa specificata per `stringEquals` corrisponde esattamente alla stringa specificata nel parametro. `value` Esempio:  

```
# Evaluates to true
stringEquals: 'Testing, testing...'
value: 'Testing, testing...'

# Evaluates to false
stringEquals: 'Testing, testing...'
value: 'Hello again.'

# Evaluates to false
stringEquals: 'Testing, testing...'
value: 'TESTING, TESTING....'

# Evaluates to false
stringEquals: 'Testing, testing...'
value: '   Testing, testing...'
				
# Evaluates to false
stringEquals: 'Testing, testing...'
value: 'Testing, testing...   '
```

**stringLessThan**  
Verifica se la stringa specificata per `stringLessThan` è inferiore alla stringa specificata nel `value` parametro. Esempio:  

```
# Evaluates to true
# This comparison operator isn't case sensitive
stringlessThan: 'A'
value: 'a'

# Evaluates to true - 'a' is less than 'b'
stringlessThan: 'b'
value: 'a'

# Evaluates to true
# Numeric strings compare as less than alphabetic strings
stringlessThan: 'a'
value: '0'

# Evaluates to false
stringlessThan: '0'
value: 'a'
```

**stringLessThanUguale a**  
Verifica se la stringa specificata per `stringLessThanEquals` è minore o uguale alla stringa specificata nel `value` parametro. Esempio:  

```
# Evaluates to true - 'a' is equal to 'a'
stringLessThanEquals: 'a'
value: 'a'

# Evaluates to true - since the comparison isn't case sensitive, 'a' is equal to 'A'
stringLessThanEquals: 'A'
value: 'a'

# Evaluates to true - 'a' is less than 'b'
stringLessThanEquals: 'b'
value: 'a'

# Evaluates to true - '0' is less than 'a'
stringLessThanEquals: 'a'
value: '0'

# Evaluates to false - 'a' is greater than '0'
stringLessThanEquals: '0'
value: 'a'
```

**stringGreaterThan**  
Verifica se la stringa specificata per `stringGreaterThan` è maggiore della stringa specificata nel `value` parametro. Esempio:  

```
# Evaluates to false - since the comparison isn't case sensitive, 'A' is equal to 'a'
stringGreaterThan: 'a'
value: 'A'

# Evaluates to true - 'b' is greater than 'a'
stringGreaterThan: 'a'
value: 'b'

# Evaluates to true - 'a' is greater than '0'
stringGreaterThan: '0'
value: 'a'

# Evaluates to false - '0' is less than 'a'
stringGreaterThan: 'a'
value: '0'
```

**stringGreaterThanUguale a**  
Verifica se la stringa specificata per `stringGreaterThanEquals` è maggiore o uguale alla stringa specificata nel `value` parametro. Esempio:  

```
# Evaluates to true - 'a' is equal to 'A'
stringGreaterThanEquals: 'A'
value: 'a'

# Evaluates to true - 'b' is greater than 'a'
stringGreaterThanEquals: 'a'
value: 'b'

# Evaluates to true - 'a' is greater than '0'
stringGreaterThanEquals: '0'
value: 'a'

# Evaluates to false - '0' is less than 'a'
stringGreaterThanEquals: 'a'
value: '0'
```

**Pattern Matches**  
Verifica se la stringa specificata nel `value` parametro corrisponde al modello regex specificato per. `patternMatches` Il confronto utilizza il [pacchetto Golang regexp](https://pkg.go.dev/regexp), che è conforme alla sintassi. RE2 Per ulteriori informazioni sulle RE2 regole, consulta il repository [google/re2](https://github.com/google/re2/wiki/Syntax) in. *GitHub*  
L'esempio seguente mostra un pattern match che restituisce: `true`  

```
patternMatches: '^[a-z]+$'
value: 'ThisIsValue'
```

## Confronta i numeri
<a name="toe-compare-numbers"></a>

I seguenti operatori di confronto funzionano con i numeri. I valori forniti per questi operatori devono essere di uno dei seguenti tipi, in base alla specifica YAML. Il supporto per i confronti numerici utilizza l'operatore di confronto di pacchetti golang big, ad esempio: [func (](https://pkg.go.dev/math/big#Float.Cmp)\$1Float) Cmp.
+ Numero intero
+ Float (basato su float64, che supporta numeri da -1.7e\$1308 a \$11.7e\$1308)
+ Una stringa che corrisponde al seguente schema regex: `^[-+]?([0-9]+[.])?[0-9]+$`

**Operatori di confronto numerico**
+ [numberEquals](#numberEquals)
+ [numberLessThan](#numberLessThan)
+ [numberLessThanEquals](#numberLessThanEquals)
+ [numberGreaterThan](#numberGreaterThan)
+ [numberGreaterThanEquals](#numberGreaterThanEquals)

**Numero uguale a**  
Verifica se il numero specificato per `numberEquals` è uguale al numero specificato nel parametro. `value` Tutti i seguenti esempi di confronto restituiscono`true`:  

```
# Values provided as a positive number
numberEquals: 1
value: 1

# Comparison value provided as a string
numberEquals: '1'
value: 1

# Value provided as a string
numberEquals: 1
value: '1'

# Values provided as floats
numberEquals: 5.0
value: 5.0

# Values provided as a negative number
numberEquals: -1
value: -1
```

**numberLessThan**  
Verifica se il numero specificato per `numberLessThan` è inferiore al numero specificato nel `value` parametro. Esempio:  

```
# Evaluates to true
numberLessThan: 2
value: 1

# Evaluates to true
numberLessThan: 2
value: 1.9

# Evaluates to false
numberLessThan: 2
value: '2'
```

**numberLessThanUguale a**  
Verifica se il numero specificato per `numberLessThanEquals` è inferiore o uguale al numero specificato nel `value` parametro. Esempio:  

```
# Evaluates to true
numberLessThanEquals: 2
value: 1

# Evaluates to true
numberLessThanEquals: 2
value: 1.9

# Evaluates to true
numberLessThanEquals: 2
value: '2'

# Evaluates to false
numberLessThanEquals: 2
value: 2.1
```

**numberGreaterThan**  
Verifica se il numero specificato per `numberGreaterThan` è maggiore del numero specificato nel `value` parametro. Esempio:  

```
# Evaluates to true
numberGreaterThan: 1
value: 2

# Evaluates to true
numberGreaterThan: 1
value: 1.1

# Evaluates to false
numberGreaterThan: 1
value: '1'
```

**numberGreaterThanUguale a**  
Verifica se il numero specificato per `numberGreaterThanEquals` è maggiore o uguale al numero specificato nel `value` parametro. Esempio:  

```
# Evaluates to true
numberGreaterThanEquals: 1
value: 2

# Evaluates to true
numberGreaterThanEquals: 1
value: 1.1

# Evaluates to true
numberGreaterThanEquals: 1
value: '1'

# Evaluates to false
numberGreaterThanEquals: 1
value: 0.8
```

## Controlla i file
<a name="toe-check-files"></a>

I seguenti operatori di confronto controllano l'hash del file o controllano se esiste un file o una cartella.

**Operatori di file e cartelle**
+ [binaryExists](#binaryExists)
+ [fileExists](#fileExists)
+ [folderExists](#folderExists)
+ [fileMD5Equals](#fileMD5Equals)
+ [fileSHA1Equals](#fileSHA1Equals)
+ [fileSHA256Equals](#fileSHA256Equals)
+ [fileSHA512Equals](#fileSHA512Equals)

**Il binario esiste**  
Verifica se un'applicazione è disponibile nel percorso corrente. Esempio:  

```
binaryExists: 'foo'
```
Sui sistemi Linux e macOS, per un'applicazione denominata*foo*, funziona come il seguente comando bash:**type *foo* >/dev/null 2>&1**, dove **\$1? == 0** indica un confronto riuscito.  
Sui sistemi Windows, per un'applicazione denominata*foo*, funziona come il PowerShell comando **& C:\$1Windows\$1System32\$1where.exe /Q *foo*** dove **\$1LASTEXITCODE = 0** indica un confronto riuscito.

**Il file esiste**  
Verifica se un file esiste nel percorso specificato. È possibile fornire un percorso assoluto o relativo. Se la posizione specificata esiste ed è un file, il confronto restituisce. `true` Esempio:  

```
fileExists: '/path/to/file'
```
Sui sistemi Linux e macOS, funziona come il seguente comando bash:**-d */path/to/file***, dove **\$1? == 0** indica un confronto riuscito.  
Sui sistemi Windows, funziona come il PowerShell comando. **Test-Path -Path '*C:\$1path\$1to\$1file*' -PathType 'Leaf'**

**La cartella esiste**  
Verifica se esiste una cartella nel percorso specificato. È possibile fornire un percorso assoluto o relativo. Se la posizione specificata esiste ed è una cartella, il confronto restituisce. `true` Esempio:  

```
folderExists: '/path/to/folder'
```
Sui sistemi Linux e macOS, funziona come il seguente comando bash:**-d */path/to/folder***, dove **\$1? == 0** indica un confronto riuscito.  
Sui sistemi Windows, funziona come il PowerShell comando. **Test-Path -Path '*C:\$1path\$1to\$1folder*' -PathType 'Container'**

**file è uguale MD5 a**  
Verifica se l' MD5 hash di un file è uguale a un valore specificato. Esempio:  

```
fileMD5Equals: '<MD5Hash>'
path: '/path/to/file'
```

**file è uguale a SHA1**  
Verifica se l' SHA1 hash di un file è uguale a un valore specificato. Esempio:  

```
fileSHA1Equals: '<SHA1Hash>'
path: '/path/to/file'
```

**file è uguale a SHA256**  
Verifica se l' SHA256 hash di un file è uguale a un valore specificato. Esempio:  

```
fileSHA256Equals: '<SHA256Hash>'
path: '/path/to/file'
```

**file è uguale a SHA512**  
Verifica se l' SHA512 hash di un file è uguale a un valore specificato. Esempio:  

```
fileSHA512Equals: '<SHA512Hash>'
path: '/path/to/file'
```

# Utilizzo di operatori logici nei documenti AWSTOE dei componenti
<a name="toe-logical-operators"></a>

È possibile utilizzare i seguenti operatori logici per aggiungere o modificare espressioni condizionali nel documento componente. AWSTOE valuta le espressioni condizionali nell'ordine in cui sono specificate le condizioni. Per ulteriori informazioni sugli operatori di confronto per i documenti dei componenti, vedere. [Usa gli operatori di confronto nei documenti AWSTOE dei componenti](toe-comparison-operators.md)

** e **  
Con l'`and`operatore, è possibile valutare due o più confronti come un'unica espressione. L'espressione restituisce `true` quando tutte le condizioni dell'elenco sono vere. In caso contrario, l'espressione restituisce. `false`  
**Esempi:**  
L'esempio seguente esegue due confronti: una stringa e un numero. Entrambi i confronti sono veri, quindi l'espressione restituisce vero.

```
and:
  - stringEquals: 'test_string'
    value: 'test_string'
  - numberEquals: 1
    value: 1
```
L'esempio seguente esegue anche due confronti. Il primo confronto è falso, a quel punto la valutazione si interrompe e il secondo confronto viene saltato. L'espressione restituisce. `false`  

```
and:
  - stringEquals: 'test_string'
    value: 'Hello world!'
  - numberEquals: 1
    value: 1
```

**oppure**  
Con l'`or`operatore, è possibile valutare due o più confronti come un'unica espressione. L'espressione restituisce `true` quando uno dei confronti specificati è vero. Se nessuno dei confronti specificati restituisce un risultato positivo`true`, l'espressione restituisce lo stesso risultato. `false`  
**Esempi:**  
L'esempio seguente esegue due confronti: una stringa e un numero. Il primo confronto è vero, quindi l'espressione restituisce un risultato `true` e il secondo confronto viene saltato.

```
or:
  - stringEquals: 'test_string'
    value: 'test_string'
  - numberEquals: 1
    value: 3
```
L'esempio seguente esegue anche due confronti. Il primo confronto è falso e la valutazione continua. Il secondo confronto è vero, quindi l'espressione restituisce come. `true`  

```
or:
  - stringEquals: 'test_string'
    value: 'Hello world!'
  - numberEquals: 1
    value: 1
```
Nell'ultimo esempio, entrambi i confronti sono falsi, quindi l'espressione restituisce come. `false`  

```
or:
  - stringEquals: 'test_string'
    value: 'Hello world!'
  - numberEquals: 1
    value: 3
```

**non**  
Con l'`not`operatore, puoi annullare un singolo confronto. L'espressione restituisce `true` se il confronto è falso. Se il confronto è vero, l'espressione restituisce. `false`  
**Esempi:**  
L'esempio seguente esegue un confronto tra stringhe. Il confronto è falso, quindi l'espressione restituisce come risultato. `true`

```
not:
  - stringEquals: 'test_string'
    value: 'Hello world!'
```
L'esempio seguente esegue anche un confronto tra stringhe. Il confronto è vero, quindi l'espressione restituisce. `false`  

```
not:
  - stringEquals: 'test_string'
    value: 'test_string'
```

# Usa costrutti a ciclo continuo in AWSTOE
<a name="toe-looping-constructs"></a>

Questa sezione fornisce informazioni per aiutarvi a creare costrutti ciclici in. AWSTOE I costrutti di looping definiscono una sequenza ripetuta di istruzioni. È possibile utilizzare i seguenti tipi di costrutti di loop in: AWSTOE
+ `for`costrutti: esegue l'iterazione su una sequenza limitata di numeri interi.
+ `forEach`costrutti
  + `forEach`loop with input list — Itera su una raccolta finita di stringhe. 
  + `forEach`loop con elenco delimitato — Itera su una raccolta finita di stringhe unite da un delimitatore.

**Nota**  
I costrutti di looping supportano solo i tipi di dati di tipo stringa.

**Topics**
+ [Variabili di iterazione di riferimento](#toe-loop-iteration-variables)
+ [Tipi di costrutti a ciclo continuo](#toe-loop-types)
+ [Campi Step](#toe-loop-step-fields)
+ [Uscite di fase e iterazione](#toe-loop-step-output)

## Variabili di iterazione di riferimento
<a name="toe-loop-iteration-variables"></a>

Per fare riferimento all'indice e al valore della variabile di iterazione corrente, l'espressione di riferimento `{{ loop.* }}` deve essere utilizzata all'interno del corpo di input di un passaggio che contiene un costrutto ciclico. Questa espressione non può essere utilizzata per fare riferimento alle variabili di iterazione del costrutto di looping di un altro passaggio.

L'espressione di riferimento è composta dai seguenti membri:
+ `{{ loop.index }}`— La posizione ordinale dell'iterazione corrente, indicizzata in. `0` 
+ `{{ loop.value }}`— Il valore associato alla variabile di iterazione corrente. 

### Nomi dei loop
<a name="toe-loop-iteration-variables-names"></a>

 Tutti i costrutti in loop hanno un campo nome opzionale per l'identificazione. Se viene fornito un nome di ciclo, può essere utilizzato per fare riferimento alle variabili di iterazione nel corpo di input del passaggio. Per fare riferimento agli indici di iterazione e ai valori di un ciclo denominato, utilizzate `{{ <loop_name>.* }}` with `{{ loop.* }}` nel corpo di input del passaggio. Questa espressione non può essere utilizzata per fare riferimento al costrutto di looping denominato di un altro passaggio. 

L'espressione di riferimento è composta dai seguenti membri:
+ `{{ <loop_name>.index }}`— La posizione ordinale dell'iterazione corrente del ciclo denominato, indicizzata in. `0`
+ `{{ <loop_name>.value }}`— Il valore associato alla variabile di iterazione corrente del ciclo denominato.

### Risolve le espressioni di riferimento
<a name="toe-loop-iteration-variables-expressions"></a>

 AWSTOE Risolve le espressioni di riferimento come segue: 
+ `{{ <loop_name>.* }}`— AWSTOE risolve questa espressione utilizzando la logica seguente:
  + Se il ciclo del passaggio attualmente in esecuzione corrisponde al `<loop_name>` valore, l'espressione di riferimento si risolve nel costrutto di loop del passaggio attualmente in esecuzione.
  + `<loop_name>`si risolve nel costrutto di looping denominato se appare nella fase attualmente in esecuzione.
+ `{{ loop.* }}`— AWSTOE risolve l'espressione utilizzando il costrutto di looping definito nella fase attualmente in esecuzione.

Se le espressioni di riferimento vengono utilizzate all'interno di un passaggio che non contiene un ciclo, non AWSTOE risolve le espressioni e vengono visualizzate nel passaggio senza alcuna sostituzione. 

**Nota**  
Le espressioni di riferimento devono essere racchiuse tra virgolette doppie per essere interpretate correttamente dal compilatore YAML.

## Tipi di costrutti a ciclo continuo
<a name="toe-loop-types"></a>

Questa sezione fornisce informazioni ed esempi sui tipi di costrutti di looping che possono essere utilizzati in. AWSTOE

**Topics**
+ [`for`ciclo](#toe-loop-types-for)
+ [`forEach`loop con elenco di input](#toe-loop-types-foreach)
+ [`forEach`ciclo con elenco delimitato](#toe-loop-types-foreach-delimited)

### `for`ciclo
<a name="toe-loop-types-for"></a>

Il `for` ciclo itera su un intervallo di numeri interi specificato all'interno di un limite delineato dall'inizio e dalla fine delle variabili. I valori di iterazione sono inclusi nel set `[start, end]` e includono i valori limite.

AWSTOE verifica i `updateBy` valori `start``end`, e per garantire che la combinazione non produca un ciclo infinito.

`for`schema ad anello

```
  - name: "StepName"
    action: "ActionModule"
    loop:
      name: "string"
      for:
        start: int
        end: int
        updateBy: int
inputs:
  ...
```


**`for`ingresso in loop**  

| Campo | Description | Tipo | Obbligatorio | Predefinita | 
| --- | --- | --- | --- | --- | 
|  `name`  | Nome univoco del ciclo. Deve essere univoco rispetto ad altri nomi di loop nella stessa fase. |  Stringa  |  No  |  ""  | 
|  `start`  | Valore iniziale dell'iterazione. Non accetta espressioni concatenate.  |  Numero intero  |  Sì  |  N/A  | 
| `end` | Valore finale dell'iterazione. Non accetta espressioni concatenate.  | Numero intero | Sì | N/A | 
| `updateBy` | Differenza in base alla quale un valore iterativo viene aggiornato tramite addizione. Deve essere un valore negativo o positivo diverso da zero. Non accetta espressioni concatenate.  | Numero intero | Sì | N/A | 

`for`esempio di input in loop

```
  - name: "CalculateFileUploadLatencies"
    action: "ExecutePowerShell"
    loop:
      for:
        start: 100000
        end: 1000000
        updateBy: 100000
    inputs:
      commands:
        - |
          $f = new-object System.IO.FileStream c:\temp\test{{ loop.index }}.txt, Create, ReadWrite
          $f.SetLength({{ loop.value }}MB)
          $f.Close()
        - c:\users\administrator\downloads\latencyTest.exe --file c:\temp\test{{ loop.index }}.txt
        - AWS s3 cp c:\users\administrator\downloads\latencyMetrics.json s3://bucket/latencyMetrics.json
        - |
          Remove-Item -Path c:\temp\test{{ loop.index }}.txt
          Remove-Item -Path c:\users\administrator\downloads\latencyMetrics.json
```

### `forEach`loop con elenco di input
<a name="toe-loop-types-foreach"></a>

Il `forEach` ciclo itera su un elenco esplicito di valori, che può essere costituito da stringhe ed espressioni concatenate. 

`forEach`ciclo con schema di elenco di input

```
  - name: "StepName"
    action: "ActionModule"
    loop:
      name: "string"
      forEach:
        - "string"
    inputs:
  ...
```


**`forEach`loop con immissione della lista di input**  

| Campo | Description | Tipo | Obbligatorio | Predefinita | 
| --- | --- | --- | --- | --- | 
|  `name`  | Nome univoco del ciclo. Deve essere univoco rispetto ad altri nomi di loop nella stessa fase. |  Stringa  |  No  |  ""  | 
|  Elenco di stringhe di loop `forEach`  |  Elenco di stringhe per l'iterazione. Accetta espressioni concatenate come stringhe nell'elenco. Le espressioni concatenate devono essere racchiuse tra virgolette doppie affinché il compilatore YAML le interpreti correttamente.  |  Elenco di stringhe  |  Sì  |  N/A  | 

`forEach`ciclo con elenco di input (esempio 1)

```
  - name: "ExecuteCustomScripts"
    action: "ExecuteBash"
    loop:
      name: BatchExecLoop
      forEach:
        - /tmp/script1.sh
        - /tmp/script2.sh
        - /tmp/script3.sh
    inputs:
      commands:
        - echo "Count {{ BatchExecLoop.index }}"
        - sh "{{ loop.value }}"
        - |
          retVal=$?
          if [ $retVal -ne 0 ]; then
            echo "Failed"
          else
            echo "Passed"
         fi
```

`forEach`ciclo con elenco di input (esempio 2)

```
  - name: "RunMSIWithDifferentArgs"
    action: "ExecuteBinary"
    loop:
      name: MultiArgLoop
      forEach:
        - "ARG1=C:\Users ARG2=1"
        - "ARG1=C:\Users"
        - "ARG1=C:\Users ARG3=C:\Users\Administrator\Documents\f1.txt"
    inputs:
      commands:
        path: "c:\users\administrator\downloads\runner.exe"
        args:
          - "{{ MultiArgLoop.value }}"
```

`forEach`ciclo con elenco di input (esempio 3)

```
  - name: "DownloadAllBinaries"
    action: "S3Download"
    loop:
      name: MultiArgLoop
      forEach:
        - "bin1.exe"
        - "bin10.exe"
        - "bin5.exe"
    inputs:
      - source: "s3://bucket/{{ loop.value }}"
        destination: "c:\temp\{{ loop.value }}"
```

### `forEach`ciclo con elenco delimitato
<a name="toe-loop-types-foreach-delimited"></a>

Il ciclo scorre su una stringa contenente valori separati da un delimitatore. Per iterare sui componenti della stringa, AWSTOE utilizza il delimitatore per dividere la stringa in un array adatto all'iterazione. 

`forEach`ciclo con schema a elenco delimitato

```
  - name: "StepName"
    action: "ActionModule"
    loop:
      name: "string"
      forEach:
        list: "string"
        delimiter: ".,;:\n\t -_"
    inputs:
  ...
```


**`forEach`ciclo con inserimento di un elenco delimitato**  

| Campo | Description | Tipo | Obbligatorio | Predefinita | 
| --- | --- | --- | --- | --- | 
|  `name`  | Nome univoco assegnato al ciclo. Dovrebbe essere unico se confrontato con altri nomi di loop nella stessa fase. |  Stringa  |  No  |  ""  | 
|  `list`  | Una stringa composta da stringhe costituenti unite da un carattere delimitatore comune. Accetta anche espressioni concatenate. In caso di espressioni concatenate, assicuratevi che siano racchiuse tra virgolette doppie per una corretta interpretazione da parte del compilatore YAML. | Stringa |  Sì  |  N/A  | 
| `delimiter` | Carattere usato per separare le stringhe all'interno di un blocco. L'impostazione predefinita è il carattere virgola. È consentito un solo carattere delimitatore dall'elenco fornito: [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/it_it/imagebuilder/latest/userguide/toe-looping-constructs.html) Le espressioni concatenate non possono essere utilizzate. | Stringa | No | Virgola: "," | 

**Nota**  
Il valore di `list` viene considerato come una stringa immutabile. Se l'origine di `list` viene modificata durante l'esecuzione, non verrà riflessa durante l'esecuzione.

`forEach`ciclo con elenco delimitato (esempio 1)

Questo esempio utilizza il seguente modello di espressione concatenata per fare riferimento all'output di un altro passaggio:. `<phase_name>.<step_name>.[inputs | outputs].<var_name>`

```
  - name: "RunMSIs"
    action: "ExecuteBinary"
    loop:
      forEach:
        list: "{{ build.GetAllMSIPathsForInstallation.outputs.stdout }}"
        delimiter: "\n"
    inputs:
      commands:
        path: "{{ loop.value }}"
```

`forEach`ciclo con elenco delimitato (esempio 2)

```
  - name: "UploadMetricFiles"
    action: "S3Upload"
    loop:
      forEach:
        list: "/tmp/m1.txt,/tmp/m2.txt,/tmp/m3.txt,..."
    inputs:
      commands:
        - source: "{{ loop.value }}"
          destination: "s3://bucket/key/{{ loop.value }}"
```

## Campi Step
<a name="toe-loop-step-fields"></a>

I loop fanno parte di un passaggio. Qualsiasi campo relativo all'esecuzione di un passaggio non viene applicato alle singole iterazioni. I campi della fase si applicano solo a livello di fase, come segue:
+ *TimeoutSeconds*: tutte le iterazioni del ciclo devono essere eseguite entro il periodo di tempo specificato in questo campo. Se l'esecuzione del ciclo scade, AWSTOE esegue la politica di riprova del passaggio e reimposta il parametro di timeout per ogni nuovo tentativo. Se l'esecuzione del ciclo supera il valore di timeout dopo aver raggiunto il numero massimo di tentativi, il messaggio di errore della fase indica che l'esecuzione del ciclo è scaduta. 
+ *OnFailure*: la gestione degli errori viene applicata alla fase nel modo seguente:
  + Se *OnFailure* è impostato su`Abort`, AWSTOE esce dal ciclo e riprova il passaggio in base alla politica di ripetizione dei tentativi. Dopo il numero massimo di tentativi, AWSTOE contrassegna il passaggio corrente come fallito e interrompe l'esecuzione del processo.

    AWSTOE imposta il codice di stato per la fase principale e il documento su`Failed`.
**Nota**  
Nessun altro passaggio viene eseguito dopo il passaggio fallito.
  + Se *OnFailure* è impostato su`Continue`, AWSTOE esce dal ciclo e riprova il passaggio in base alla politica di ripetizione dei tentativi. Dopo il numero massimo di tentativi, AWSTOE contrassegna il passaggio corrente come fallito e continua a eseguire il passaggio successivo.

    AWSTOE imposta il codice di stato per la fase principale e il documento su`Failed`.
  + Se *OnFailure* è impostato su`Ignore`, AWSTOE esce dal ciclo e riprova il passaggio in base alla politica di ripetizione dei tentativi. Dopo il numero massimo di tentativi, AWSTOE contrassegna il passaggio corrente come `IgnoredFailure` e continua a eseguire il passaggio successivo.

    AWSTOE imposta il codice di stato per la fase principale e il documento su`SuccessWithIgnoredFailure`.
**Nota**  
Viene comunque considerata un'esecuzione riuscita, ma include informazioni che indicano che uno o più passaggi non sono riusciti e sono stati ignorati.
+ *MaxAttempts*: per ogni nuovo tentativo, l'intero passaggio e tutte le iterazioni vengono eseguiti dall'inizio.
+ *status: lo* stato generale dell'esecuzione di un passaggio. `status`non rappresenta lo stato delle singole iterazioni. Lo stato di un passaggio con loop è determinato come segue:
  + Se una singola iterazione non viene eseguita, lo stato di un passaggio indica un errore.
  + Se tutte le iterazioni hanno esito positivo, lo stato di un passaggio indica un successo.
+ *startTime*: l'ora di inizio complessiva dell'esecuzione di un passaggio. Non rappresenta l'ora di inizio delle singole iterazioni.
+ *EndTime*: l'ora di fine complessiva dell'esecuzione di un passaggio. Non rappresenta l'ora di fine delle singole iterazioni.
+ *FailureMessage*: include gli indici di iterazione che hanno avuto esito negativo in caso di errori diversi dal timeout. In caso di errori di timeout, il messaggio indica che l'esecuzione del ciclo non è riuscita. Non vengono forniti messaggi di errore individuali per ogni iterazione per ridurre al minimo la dimensione dei messaggi di errore.

## Uscite di fase e iterazione
<a name="toe-loop-step-output"></a>

Ogni iterazione contiene un output. Alla fine di un ciclo, AWSTOE consolida tutti gli output di iterazione riusciti in. `detailedOutput.json` Gli output consolidati sono una raccolta di valori che appartengono alle chiavi di output corrispondenti, come definito nello schema di output del modulo di azione. L'esempio seguente mostra come vengono consolidati gli output:

**Output di `ExecuteBash` per l'iterazione 1**

```
{
	"stdout":"Hello"
}
```

**Output di `ExecuteBash` per l'iterazione 2**

```
{
	"stdout":"World"
}
```

**Output di `ExecuteBash` for Step**

```
{
	"stdout":"Hello\nWorld"
}
```

Ad esempio `ExecuteBash``ExecutePowerShell`, e `ExecuteBinary` sono moduli di azione che restituiscono `STDOUT` come output del modulo di azione. `STDOUT`i messaggi vengono uniti al nuovo carattere di riga per produrre l'output complessivo dello step in`detailedOutput.json`.

AWSTOE non consoliderà i risultati delle iterazioni non riuscite.