Ejecución de comandos en una instancia

Puede configurar y gestionar instancia informáticas de forma remota, así como solucionar problemas, ejecutando scripts en la instancia mediante la función de ejecución de comando.

Por ejemplo, la función de ejecución de comando puede ayudarle a automatizar tareas como la configuración de tarjetas de interfaz de red virtual secundarias (VNIC), la unión de instancias a un proveedor de identidad, la solución de problemas de conectividad SSH o la respuesta a escenarios de recuperación ante desastres entre regiones.

Puede ejecutar comandos en una instancia incluso cuando la instancia no tenga acceso SSH o puertos de entrada abiertos.

La función de ejecución de comando utiliza el plugin Compute Instance Run Command gestionado por el software Oracle Cloud Agent.

Atención

No utilice la función de ejecución de comando para proporcionar o recuperar contraseñas, secretos u otra información confidencial en texto sin formato. Para proporcionar y recuperar información confidencial de forma segura, utilice una ubicación de Object Storage para almacenar el archivo de script y la respuesta. Utilice Oracle Cloud Infrastructure Vault para gestionar claves y credenciales secretas.

Imágenes soportadas

La función de ejecución de comando está soportada en instancias informáticas que utilizan las siguientes imágenes de plataforma:

  • Oracle Autonomous Linux
  • Oracle Linux
  • CentOS
  • Windows Server

Las imágenes personalizadas basadas en una imagen de plataforma soportada también soportan la función de ejecución de comando.

Regiones soportadas

La función de ejecución de comando está soportada en todas las regiones del dominio comercial de Oracle Cloud Infrastructure.

Limitaciones y consideraciones

  • En instancias de Linux, el script se ejecuta por defecto en un shell bash. Para ejecutar el script con un programa diferente, utilice #!/<path_to_program> como la primera línea del script.
  • En instancias de Windows, el script se ejecuta por defecto en un shell por lotes. Para ejecutar el script con PowerShell, utilice #ps1 como la primera línea del script.

    Consulte un script de PowerShell de ejemplo

    En el siguiente ejemplo, se utiliza PowerShell para consultar el servicio de metadatos de instancia e imprimir el OCID de instancia:

    #ps1
    $instance = Invoke-RestMethod -Headers @{'Authorization' = 'Bearer Oracle'} -Uri http://169.254.169.254/opc/v2/instance/
    Write-Host ('Instance OCID is ' + $($instance.id))
  • El tamaño máximo de un archivo de script que cargue directamente a una instancia en texto sin formato es de 4 KB. Para proporcionar un archivo más grande, guarde el archivo en una ubicación de Object Storage.
  • La salida de un script cuando se devuelve como texto sin formato se limita al último 1 KB. Para guardar una respuesta más grande, guarde la salida en una ubicación de Object Storage.
  • Al utilizar una ubicación de Object Storage para guardar el archivo de script o la respuesta, la instancia debe tener conectividad saliente, como un gateway de traducción de acceso a red (NAT), un gateway de servicio o un gateway de Internet. La instancia también debe permitir el tráfico de salida en el puerto 443 para el software Oracle Cloud Agent, Object Storage e IAM.
  • Dos scripts se pueden ejecutar a la vez por defecto. Para cambiar el valor por defecto, actualice el archivo de configuración de ejecución de comando:

    cat /etc/oracle-cloud-agent/plugins/runcommand/config.yml

    Defina los siguientes parámetros:

    logDir: /var/log/oracle-cloud-agent/plugins/runcommand
    commandExecutionMaxWorkers: <number-of-parallel-scripts>
  • Un máximo de cinco scripts pueden estar en ejecución a la vez. Se considera que un script está en ejecución si el plugin Compute Instance Run Command lo ha recibido, pero aún no lo ha suprimido de la cola.
  • Para realizar tareas de larga ejecución, utilice la función de ejecución de comando para programar un trabajo cron en la instancia. La orquestación de comandos no está soportada.
  • Cada script se ejecuta una vez. Si desea que un script se ejecute varias veces, utilice cron para configurar un programa para el script.
  • Los scripts que solicitan información no están soportados. Sin embargo, puede utilizar el servicio de metadatos de instancia (IMDS) para recuperar mediante programación información sobre la instancia en la que se ejecuta el script.
  • Al crear una instancia a partir de una imagen personalizada que ya tiene permisos para el plugin Comando de ejecución de la instancia informática configurado, sustituya 101-oracle-cloud-agent-run-command por 100-oracle-cloud-agent-run-command en el archivo de configuración.
  • Los códigos de salida que se devuelven son códigos de error de Linux estándar. Un código de salida 0 indica que la operación se ha realizado correctamente.
  • Si aplica un timeout opcional para una secuencia de comandos, el valor por defecto es de una hora. El máximo es de 24 horas.
  • El tiempo máximo que puede ejecutar un script es de un día.
  • Para supervisar los recursos que consumen los scripts, como la utilización de CPU, utilice métricas.
  • Cancelar un script es un intento válido. Los comandos no se pueden cancelar después de que hayan terminado de ejecutarse o si han caducado.
  • Los archivos de script y las respuestas que se guardan en texto sin formato se conservan durante siete días. Los archivos de script y las respuestas que se guardan en una ubicación de Object Storage se conservan hasta que los suprime.
  • No ejecute un script que haga que se pare el software Oracle Cloud Agent o el plugin Compute Instance Run Command.

Ejecución de comandos con privilegios de administrador

Si un comando requiere permisos sudo, debe otorgar permisos sudo al plugin Compute Instance Run Command para poder ejecutar el comando. El plugin se ejecuta como usuario ocarun.

Puede utilizar cloud-init para configurar permisos al iniciar la instancia o conectarse a una instancia después de haberse iniciado y configurar permisos manualmente. Haga lo siguiente:

  1. En la instancia, cree un archivo de configuración sudoers para el plugin Compute Instance Run Command:

    vi ./101-oracle-cloud-agent-run-command
  2. Permita al usuario ocarun ejecutar todos los comandos como sudo agregando la siguiente línea al archivo de configuración:

    ocarun ALL=(ALL) NOPASSWD:ALL

    Opcionalmente, puede mostrar comandos específicos. Consulte la página del comando man de Linux para obtener más información sobre sudoers.

  3. Valide que la sintaxis del archivo de configuración es correcta:

    visudo -cf ./101-oracle-cloud-agent-run-command

    Si la sintaxis es correcta, se devuelve el siguiente mensaje:

    ./101-oracle-cloud-agent-run-command: parsed OK
  4. Agregue el archivo de configuración a /etc/sudoers.d:

    sudo cp ./101-oracle-cloud-agent-run-command /etc/sudoers.d/

Política de IAM necesaria

Para utilizar Oracle Cloud Infrastructure, un administrador debe otorgarle acceso de seguridad en una política . Este acceso está requerido tanto si está utilizando la consola como la API de REST con un SDK, una CLI u otra herramienta. Si recibe un mensaje que indica que no tiene permiso o no está autorizado, verifique con su administrador qué tipo de acceso tiene y en qué compartimento  debe trabajar.

Para administradores: para escribir una política para la función de ejecución de comando, realice lo siguiente:

  1. Cree un grupo que incluya a los usuarios a los que desea permitir emitir comandos, cancelar comandos y ver la salida de comando para las instancias de un compartimento. A continuación, escriba la siguiente política para otorgar acceso al grupo:

    Allow group RunCommandUsers to manage instance-agent-command-family in compartment ABC
  2. Cree un grupo dinámico que incluya las instancias en las que desea permitir que se ejecuten comandos. Por ejemplo, una regla dentro del grupo dinámico puede indicar lo siguiente:

    any { instance.id = 'ocid1.instance.oc1.phx.<unique_ID_1>', 'ocid1.instance.oc1.phx.<unique_ID_2>' }
  3. Escriba la siguiente política para otorgar acceso al grupo dinámico:
    Nota

    Si crea una instancia y, a continuación, la agrega a un grupo dinámico, la instancia tarda hasta 30 minutos en empezar a sondear los comandos. Si primero crea el grupo dinámico y, a continuación, crea la instancia, la instancia comienza a sondear los comandos tan pronto como se crea la instancia.
    Allow dynamic-group RunCommandDynamicGroup to use instance-agent-command-execution-family in compartment ABC where request.instance.id=target.instance.id
  4. Para permitir que el grupo dinámico acceda al archivo de script desde un cubo de Object Storage y guarde la respuesta en un cubo de Object Storage, escriba las siguientes políticas:

    Allow dynamic-group RunCommandDynamicGroup to read objects in compartment ABC where all {target.bucket.name = '<bucket_with_script_file>'}
    Allow dynamic-group RunCommandDynamicGroup to manage objects in compartment ABC where all {target.bucket.name = '<bucket_for_command_output>'}

Si no está familiarizado con las políticas, consulte Introducción a las políticas y Políticas comunes. Para obtener material de referencia sobre cómo escribir políticas para instancias, redes en la nube u otros recursos de la API de servicios principales, consulte Detalles de los servicios principales.

Requisitos previos

  • El plugin Compute Instance Run Command debe estar activado en la instancia y los plugins deben estar en ejecución. Para obtener más información sobre cómo activar y ejecutar plugins, consulte Gestión de plugins con Oracle Cloud Agent.
  • Ha preparado el script que desea ejecutar. Recomendamos que pruebe el comando en un entorno de no producción antes de desplegarlo en instancias que ejecutan flujos de trabajo de producción.
  • Para proporcionar el archivo de script desde una ubicación de Object Storage, cargue el archivo en un cubo de Object Storage en la misma región que la instancia de destino. Anote el nombre del cubo y del archivo, o la URL de Object Storage para el archivo. Para utilizar el mismo comando en todos los arrendamientos, cree una solicitud autenticada previamente que apunte al archivo.
  • Para guardar la salida de comando en una ubicación de Object Storage, cree un cubo para guardarla, en la misma región que la instancia de destino. Anote el nombre del cubo o la URL de Object Storage para el cubo. Opcionalmente, puede guardar la salida de comando mediante una solicitud autenticada previamente que apunte a una ubicación de Object Storage.
  • Para las imágenes de plataforma publicadas antes de octubre de 2020, el software Oracle Cloud Agent se debe actualizar a una versión que soporte el plugin Compute Instance Run Command (versión 1.5.1 o posterior).

Uso de la consola

Para crear un comando que se ejecute en una instancia
  1. Abra el menú de navegación y haga clic en Recursos informáticos. En Recursos informáticos, haga clic en Instancias.
  2. Haga clic en la instancia en la que está interesado.
  3. En Recursos, haga clic en Ejecutar comando.
  4. Haga clic en Crear comando.
  5. Introduzca un nombre para el comando. Evite introducir información confidencial.
  6. En el cuadro Timeout en segundos, introduzca la cantidad de tiempo que desea proporcionar al plugin Compute Instance Run Command para que ejecute el comando en la instancia antes del timeout. El temporizador se inicia cuando el plugin inicia el comando. Si no hay timeout, introduzca 0.
  7. En la sección Agregar script, cargue el script que desea que el plugin Compute Instance Run Command ejecute en la instancia. Seleccione una de las opciones siguientes:

    • Pegar script pegue el comando en el cuadro.
    • Seleccionar un archivo: cargue el script como un archivo de texto (.txt). Busque el archivo que desea cargar, o bien arrastre y suelte el archivo en el cuadro.
    • Importar desde un cubo de almacenamiento de objetos: seleccione el cubo que contiene el archivo de script. En el cuadro Nombre de objeto, introduzca el nombre del archivo.
    • Importar desde una URL de almacenamiento de objetos: introduzca la URL de Object Storage para el archivo de script.
  8. En la sección Tipo de salida, seleccione la ubicación en la que desea guardar la salida del comando:

    • Generar salida como texto: la salida se guarda como texto sin formato. Puede revisar la salida en la página Detalles de instancia.
    • Generar salida a un cubo de almacenamiento de objetos: la salida se guarda en un cubo de Object Storage. Seleccione un cubo. En el cuadro Nombre de objeto, introduzca un nombre para el archivo de salida. Evite introducir información confidencial.
    • Generar salida a una URL de almacenamiento de objetos: la salida se guarda en una URL de Object Storage. Introduzca la URL.
  9. Haga clic en Crear comando.
Para ver la salida de un comando

Si la salida de comando se ha guardado en una ubicación de Object Storage, descargue el objeto de respuesta del cubo en el que se guardó o navegue a la URL de solicitud autenticada previamente de Object Storage.

Si la salida de comando se ha guardado como un archivo de texto sin formato, realice lo siguiente:

  1. Abra el menú de navegación y haga clic en Recursos informáticos. En Recursos informáticos, haga clic en Instancias.
  2. Haga clic en la instancia en la que está interesado.
  3. En Recursos, haga clic en Ejecutar comando.
  4. Busque el comando en la lista, haga clic en el menú Acciones y, a continuación, haga clic en Ver detalles de comando.
Para cancelar un comando
  1. Abra el menú de navegación y haga clic en Recursos informáticos. En Recursos informáticos, haga clic en Instancias.
  2. Haga clic en la instancia en la que está interesado.
  3. En Recursos, haga clic en Ejecutar comando.
  4. Busque el comando en la lista, haga clic en el menú Acciones y, a continuación, haga clic en Cancelar comando. Confirme cuando se le solicite.

Uso de la API

Para obtener más información sobre el uso de la API y las solicitudes de firma, consulte API de REST y Credenciales de seguridad. Para obtener información sobre los SDK, consulte Software development kits e interfaz de línea de comandos.

Utilice estas operaciones de API para trabajar con la función de ejecución de comando:

Solución de problemas del plugin Compute Instance Run Command

Para solucionar problemas del plugin Compute Instance Run Command, puede ver los logs que genera el plugin. Conéctese a la instancia y, a continuación, utilice lo siguiente:

tail -f /var/log/oracle-cloud-agent/plugins/runcommand/runcommand.log

Para una visibilidad más fácil de las operaciones del plugin sin tener que conectarse a la instancia, puede crear logs personalizados mediante el servicio Oracle Cloud Infrastructure Logging.

Errores de log

En esta sección se describe cómo resolver los errores que aparecen en el archivo de log.

Fallo al sondear

Si el plugin Compute Instance Run Command no sondea los comandos, puede ver el siguiente error en el archivo de log:

poll command err: circuitbreaker:[pollCommand] is open, last err:Service error:NotAuthorizedOrNotFound. Authorization failed or requested resource not found. http status code: 404.

Este error puede producirse cuando la política de grupo dinámico para la función de ejecución de comando no está activada o si la instancia se ha agregado recientemente al grupo dinámico. Las instancias no pertenecen a grupos de administradores de arrendamiento por defecto, por lo que debe definir explícitamente permisos de grupo dinámico para la instancia. Para obtener instrucciones sobre cómo activar la política de grupo dinámico, consulte Política de IAM necesaria.

Al crear una instancia y, a continuación, agregarla a un grupo dinámico, la instancia tarda hasta 30 minutos en empezar a sondear los comandos. Si primero crea el grupo dinámico y, a continuación, crea la instancia, la instancia comienza a sondear los comandos tan pronto como se crea la instancia.

Para probar la política de grupo dinámico tan pronto como agregue la instancia a un grupo dinámico, reinicie el servicio manualmente mediante uno de los siguientes comandos:

Oracle Linux 6.x

sudo initctl restart oracle-cloud-agent

Oracle Linux 7.x y Oracle Linux 8.x

sudo systemctl restart oracle-cloud-agent

Windows Server

net restart ocarun