Nomad
action block in the job specification
| Placement | job -> group -> task -> action | 
The action block allows job authors to define custom commands. These commands
can be executed by operators with the necessary permissions on a running
allocation, offering a controlled way to interact with tasks.
The name of the action can contain alphanumeric characters and dashes. This name must be unique within its task and must not exceed 128 characters.
action Parameters
- command- (string: <required>)- Specifies the command to be executed.
- args- (array<string>: [])- Provides a list of arguments to pass to the command.
job "my-job" {
  group "my-group" {
    task "my-task" {
      action "get-changelog" {
        command = "/usr/bin/curl"
        args = [
          "-s",
          "https://raw.githubusercontent.com/hashicorp/nomad/main/CHANGELOG.md"
        ]
      }
      # ...
    }
  }
}
action Examples
Basic Action
This example demonstrates a simple action that prints the current date and time:
job "example" {
  # ...
  group "demo" {
    # ...
    task "show-date" {
      # ...
      action "current-date" {
        command = "/bin/date"
      }
    }
  }
}
Action with Arguments
Here, an action uses arguments to perform a specific task:
job "example" {
  # ...
  group "demo" {
    # ...
    task "list-files" {
      # ...
      action "list-tmp" {
        command = "/bin/ls"
        args    = ["-l", "/tmp"]
      }
    }
  }
}
Action with Template
This advanced example demonstrates an action that fetches and formats the latest changelog from the Nomad GitHub repository using a shell script. It showcases the use of templating with embedded environment variables and a multi-line script.
action "fetch-latest-nomad-changelog" {
  command = "/bin/sh"
  args    = ["-c",
    <<EOT
curl -s https://raw.githubusercontent.com/hashicorp/nomad/main/CHANGELOG.md |
awk 'BEGIN{
    # Setting record and field separators
    RS="## "; FS="\n";
    section=""; count=0
}
{
    # Processing only the first 3 sections after the header
    if (count < 3 && NR > 1){
        # Splitting the version line into components
        split($1, versionInfo, /[()]/);
        version=versionInfo[1];
        gsub(" ", "", version); # Removing spaces from version
        releaseDate=versionInfo[2];
        # Formatting URL components
        urlVersion=version; gsub("\\.", "", urlVersion); # Remove dots from version
        urlDate=releaseDate; gsub(" ", "-", urlDate); gsub(",", "", urlDate); # Replace spaces with hyphens and remove comma
        # Counting items under each section
        for(i=1; i<=NF; i++){
            if($i ~ /^[A-Z ]+:$/){
                gsub(":", "", $i);
                section=$i;
                itemCount[section]=0;
            }
            if(section && $i ~ /^\*/){
                itemCount[section]++;
            }
        }
        # Printing the extracted information
        printf "Version: %s\nRelease Date: %s\n", version, releaseDate;
        for (s in itemCount) {
            printf "%d %s, ", itemCount[s], s;
        }
        printf "\nLink: https://github.com/hashicorp/nomad/blob/main/CHANGELOG.md#%s-%s\n\n", urlVersion, tolower(urlDate);
        delete itemCount;  # Clear the itemCount array for the next version
        count++;
    }
}'
    EOT
  ]
}