Ejecutar un script con el runner de acciones privadas

Descripción general

El runner de acciones privadas puede ejecutar scripts predefinidos, que son comandos de shell, herramientas de línea de comandos y scripts que usted declara con antelación en un archivo de configuración de scripts. Solo se puede ejecutar lo que usted predefine, por lo que el runner nunca ejecuta comandos en línea arbitrarios desde un flujo de trabajo o aplicación.

Usted decide qué comandos y binarios tiene permitido ejecutar el runner. Revise cada comando que agregue a la configuración del script, especialmente aquellos que aceptan parámetros, otorgue al runner solo los privilegios que necesita y revise cuidadosamente los permisos que comparte a través de las conexiones. Consulte consideraciones de seguridad de la conexión.

Casos de uso

Caso de usoBasado en AgentIndependienteNotas
Ejecución de binarios de Linux (ls, rm, find, curl)Para runners independientes, los archivos relevantes deben ser accesibles para el contenedor.
Ejecución de CLI (aws, terraform, kubectl)Para runners independientes, la CLI y las credenciales deben estar disponibles en la imagen. Para runners basados en Agent, las herramientas deben estar instaladas en el servidor.
Ejecución de scripts bashPara runners independientes, los scripts pueden montarse dentro del contenedor. Utilice la imagen grande para un intérprete de Python.
Ejecución de scripts de PowerShellCompatible solo con runners de Windows basados en el Agente.
Ejecución de comandos privilegiados (systemctl restart)Para runners basados en el Agente, otorgue permisos al usuario del runner. El sandboxing de contenedores evita que los runners independientes tengan acceso privilegiado al servidor.

Requisitos previos

Para runners basados en el Agente:

Para runners independientes:

Basado en Agent

Configurar scripts

Edite el archivo /etc/datadog-agent/private-action-runner/script-config.yaml:

schemaId: script-credentials-v1
runPredefinedScript:
  echo:
    command: ["echo", "Hello world!"]
  echo-parametrized:
    command: ["echo", "{{ parameters.echoValue }}"]
  restart-service:
    command: ["sudo", "systemctl", "restart", "{{ parameters.service }}"]

Edite el archivo C:\ProgramData\Datadog\private-action-runner\powershell-script-config.yaml:

schemaId: script-credentials-v1
runPredefinedPowershellScript:
  helloWorld:
    script: |
      Write-Output "Hello world!"
  greet:
    script: |
      Write-Output "Run script from workflow called {{ parameters.name }} !"
    parameterSchema:
      properties:
        name:
          type: string
      required:
        - name
  restartService:
    script: |
      Restart-Service -Name {{ parameters.serviceName }} -Force
    parameterSchema:
      properties:
        serviceName:
          type: string
      required:
        - serviceName

En un flujo de trabajo o aplicación, haga referencia a un script por el nombre que definió (por ejemplo, echo). Use runPredefinedScript en runners de Linux y runPredefinedPowershellScript en runners de Windows.

Otorgar permisos

El runner ejecuta scripts como el usuario dd-agent. Si sus scripts requieren permisos elevados, otórguelos al usuario dd-agent:

echo "dd-agent ALL=(ALL) NOPASSWD: /usr/bin/systemctl restart nginx" > /etc/sudoers.d/dd-agent
chmod 440 /etc/sudoers.d/dd-agent

El runner ejecuta scripts como ddagentuser. Si sus scripts requieren acceso a ciertos recursos, otorgue a ddagentuser permisos elevados para ellos:

icacls "C:\<your-file-path>" /grant "ddagentuser:(OI)(CI)RX" /T

# Verify permissions
icacls "C:\<your-file-path>"

Runner sin propietario (Execution Policy-authorized)

Cuando un runner se registra como sin propietario y es autorizado por Políticas de ejecución, se requieren dos cosas además de los pasos anteriores:

  • La integración Script debe estar autorizada para el runner a través de una Política de ejecución, además de que la acción predefined-script esté en la lista de permitidos de acciones del runner.
  • El runner lee sus scripts predefinidos desde una ruta fija, la misma ruta utilizada en Configurar scripts arriba:

/etc/datadog-agent/private-action-runner/script-config.yaml

C:\ProgramData\Datadog\private-action-runner\powershell-script-config.yaml

Entrega de la configuración en Kubernetes

En Kubernetes, proporcione el archivo de configuración de scripts al runner en el Datadog Agent como un ConfigMap. Móntelo en el contenedor del runner en la ruta fija. El runner del Cluster Agent utiliza la ruta de Linux anterior.

Primero, cree un ConfigMap que contenga su configuración de scripts:

apiVersion: v1
kind: ConfigMap
metadata:
  name: par-script-config
  namespace: datadog
data:
  script-config.yaml: |
    schemaId: script-credentials-v1
    runPredefinedScript:
      echo:
        command: ["echo", "Hello world!"]

Luego, en el recurso DatadogAgent, permita la acción predefined-script y monte el ConfigMap en el contenedor del runner en la ruta fija:

apiVersion: datadoghq.com/v2alpha1
kind: DatadogAgent
metadata:
  name: datadog
  annotations:
    agent.datadoghq.com/private-action-runner-enabled: "true"
    agent.datadoghq.com/private-action-runner-configdata: |
      private_action_runner:
        enabled: true
        api_key_only_enrollment: true
        actions_allowlist:
          - "com.datadoghq.script.runPredefinedScript"
          - "com.datadoghq.kubernetes.*"
          - "com.datadoghq.remoteaction.*"
spec:
  override:
    nodeAgent:
      volumes:
        - name: par-script-config
          configMap:
            name: par-script-config
      containers:
        private-action-runner:
          volumeMounts:
            - name: par-script-config
              mountPath: /etc/datadog-agent/private-action-runner/script-config.yaml
              subPath: script-config.yaml
              readOnly: true

Finalmente, aplique el manifiesto:

kubectl apply -f datadog-agent.yaml

Runner con propietario (basado en conexión)

Configurar la conexión

Si seleccionó com.datadoghq.script.runPredefinedScript en la lista de permitidos de acciones del runner, ya debería tener una conexión Script vinculada a su runner. De lo contrario, cree una conexión y especifique /etc/datadog-agent/private-action-runner/script-config.yaml como la ruta al archivo. Para obtener más información, consulte [Handling private action credentials][4].

Configurar la conexión

Si seleccionó com.datadoghq.script.runPredefinedPowershellScript en la lista de permitidos de acciones del runner, ya debería tener una conexión Script vinculada a su runner. De lo contrario, cree una conexión y especifique C:\ProgramData\Datadog\private-action-runner\powershell-script-config.yaml como la ruta al archivo. Para obtener más información, consulte [Handling private action credentials][4].

Independiente

Un runner independiente siempre es propiedad de y está autorizado con Conexiones.

  1. Después de [configurar un runner][2], navegue a Conexiones.
  2. Haga clic en Nueva conexión y seleccione Script.
  3. Ingrese un nombre de conexión y, en el menú desplegable Runner de acción privada, seleccione su runner.
  4. Copie la plantilla del archivo de credenciales en el directorio de configuración de su runner con los comandos que desea ejecutar.
  5. En Ruta al archivo, confirme que la ruta del archivo coincida con la ruta en el sistema de archivos de su runner (la predeterminada es suficiente en la mayoría de los casos).
  6. Haga clic en Siguiente, Confirmar acceso, configure los permisos y luego haga clic en Crear.
  7. Seleccione esta conexión al usar la acción de script en sus flujos de trabajo o aplicaciones.

Configure las acciones de script a través del archivo config.yaml de su runner y la conexión de script (credentials/script.yaml de forma predeterminada):

# Add the script action to the allowlist (config.yaml)
actionsAllowlist:
  - com.datadoghq.script.runPredefinedScript
# Configure your script connection (credentials/script.yaml)
schemaId: script-credentials-v1
runPredefinedScript:
  echo:
    command: ["echo", "Hello world"]
  echo-parametrized:
    command: ["echo", "{{ parameters.echoValue }}"]
    parameterSchema:
      properties:
        echoValue:
          type: string
      required:
        - echoValue

Al implementar el runner con Helm, configure los scripts a través de su archivo values.yaml:

common:
  actionsAllowlist:
    - com.datadoghq.script.runPredefinedScript

credentials:
  script:
    schemaId: script-credentials-v1
    runPredefinedScript:
      echo:
        command: ["echo", "Hello world"]
      echo-parametrized:
        command: ["echo", "{{ parameters.echoValue }}"]
        parameterSchema:
          properties:
            echoValue:
              type: string
          required:
            - echoValue

Implemente o actualice el runner:

helm upgrade --install <RELEASE_NAME> datadog/private-action-runner -f ./values.yaml

Opciones de imagen del runner

Las siguientes opciones están disponibles solo para runners independientes.

Imagen grande

Si desea utilizar herramientas como Python, SSH, la CLI de AWS, Terraform o la CLI de gcloud, utilice la imagen gcr.io/datadoghq/private-action-runner:v,translation_2:1.22.0-large` en lugar de la imagen predeterminada.

Imágenes personalizadas

Para binarios que no están disponibles en las imágenes proporcionadas por Datadog, cree una imagen personalizada:

FROM gcr.io/datadoghq/private-action-runner:v1.22.0
USER root
# Change the line below to install the tool of your choice
RUN apt update && apt install -y python3
USER dog

Puede montar scripts complejos dentro del runner:

# docker-compose example
services:
  runner:
    build: . # if you are using a local Dockerfile
    volumes:
      - "./config:/etc/dd-action-runner/config" # contains credentials for actions
      - "./scripts:/etc/dd-action-runner-script/scripts" # contains dependencies for script actions
# credentials/script.yaml
schemaId: script-credentials-v1
runPredefinedScript:
  python:
    command: ["python3", "/etc/dd-action-runner-script/scripts/script.py"]
  shell:
    command: ["bash", "/etc/dd-action-runner-script/scripts/script.sh"]

Uso de los scripts configurados

En su flujo de trabajo o aplicación, configure la acción para usar el nombre de script que definió (por ejemplo, echo o echo-parametrized). Para runners de Linux, use runPredefinedScript. Para runners de Windows, use runPredefinedPowershellScript.

Existen dos niveles de resolución de variables: uno a nivel de flujo de trabajo y otro a nivel de acción dentro del runner.

Lecturas adicionales