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 uso | Basado en Agent | Independiente | Notas |
|---|
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 bash | | | Para runners independientes, los scripts pueden montarse dentro del contenedor. Utilice la imagen grande para un intérprete de Python. |
| Ejecución de scripts de PowerShell | | | Compatible 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
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)
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].
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.
- Después de [configurar un runner][2], navegue a Conexiones.
- Haga clic en Nueva conexión y seleccione Script.
- Ingrese un nombre de conexión y, en el menú desplegable Runner de acción privada, seleccione su runner.
- Copie la plantilla del archivo de credenciales en el directorio de configuración de su runner con los comandos que desea ejecutar.
- 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).
- Haga clic en Siguiente, Confirmar acceso, configure los permisos y luego haga clic en Crear.
- 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"]
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
Documentación, enlaces y artículos útiles adicionales: