

# Desarrollo de módulos de EC2Rescue para instancias de Linux de Amazon EC2
<a name="ec2rl_moduledev"></a>

Los módulos se escriben en YAML, un estándar de serialización de datos. Un archivo YAML de un módulo consta de un único documento que representa el módulo y sus atributos.

## Agregar atributos de módulo
<a name="ec2rl-adding-modules"></a>

En la tabla siguiente se muestran los atributos de módulo disponibles.


| Atributo | Descripción | 
| --- | --- | 
| name (nombre) | Nombre del módulo. El nombre debe tener 18 caracteres o menos de longitud. | 
| version | Número de versión del módulo. | 
| title | Un título breve y descriptivo para el módulo. Este valor debe tener 50 caracteres o menos de longitud. | 
| helptext |  La descripción ampliada del módulo. Cada línea debe tener 75 caracteres o menos de longitud. Si el módulo consume argumentos, requeridos y opcionales, inclúyalos en el valor de helptext. Por ejemplo: <pre>helptext: !!str |<br />  Collect output from ps for system analysis<br />  Consumes --times= for number of times to repeat<br />  Consumes --period= for time period between repetition</pre> | 
| placement | La fase en la que debe ejecutarse el módulo. Valores admitidos: [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/es_es/AWSEC2/latest/UserGuide/ec2rl_moduledev.html)  | 
| language | El lenguaje en que está escrito el código del módulo. Valores admitidos: [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/es_es/AWSEC2/latest/UserGuide/ec2rl_moduledev.html)  El código Python debe ser compatible con Python 2.7.9\$1 y Python 3.2\$1.   | 
| remediation |  Indica si el módulo admite remedio. Los valores admitidos son `True` o `False`. El módulo tomará el valor predeterminado `False` si está ausente, lo que lo convertirá en un atributo opcional para los módulos que no admiten el remedio.  | 
| content | La totalidad del código de script. | 
| constraint | El nombre del objeto que contiene los valores de restricción. | 
| dominio | Un descriptor del modo en que el módulo se agrupa o clasifica. El conjunto de módulos incluidos usa los dominios siguientes:  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/es_es/AWSEC2/latest/UserGuide/ec2rl_moduledev.html) | 
| class | Un descriptor del tipo de tarea que realiza el módulo. El conjunto de módulos incluidos usa las clases siguientes: [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/es_es/AWSEC2/latest/UserGuide/ec2rl_moduledev.html) | 
| distro | La lista de distribuciones Linux que admite este módulo. El conjunto de módulos incluidos usa las distribuciones siguientes: [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/es_es/AWSEC2/latest/UserGuide/ec2rl_moduledev.html) | 
| obligatorio | Los argumentos requeridos que el módulo usa para las opciones de la CLI. | 
| opcional | Los argumentos opcionales que el módulo puede usar. | 
| software | Los ejecutables de software usados en el módulo. Este atributo tiene como finalidad especificar software que no está instalado de manera predeterminada. La lógica de EC2Rescue para Linux asegura que estos programas sean ejecutables y estén presentes antes de ejecutar el módulo. | 
| package | El paquete de software de origen para un ejecutable. Este atributo tiene como finalidad proporcionar detalles ampliados sobre el paquete con el software, incluida una URL para descargar u obtener más información. | 
| sudo | Indica si se requiere acceso raíz para ejecutar el módulo.  No necesita implementar las comprobaciones sudo en el script del módulo. Si el valor es verdadero, la lógica de EC2Rescue para Linux solo ejecuta el módulo cuando el usuario ejecutante tiene acceso raíz. | 
| perfimpact | Indica si el módulo puede tener un impacto significativo de desempeño en el entorno en que se ejecuta. Si el valor es verdadero y el argumento `--perfimpact=true` no está presente, el módulo se omite. | 
| parallelexclusive | Especifica un programa que requiere exclusividad mutua. Por ejemplo, todos los módulos que especifican "bpf" se ejecutan en serie. | 

## Agregar variables de entorno
<a name="ec2rl_adding_envvars"></a>

En la tabla siguiente se muestran las variables de entorno disponibles.


| Variable de entorno | Descripción | 
| --- | --- | 
|  `EC2RL_CALLPATH`  | La ruta a ec2rl.py. Esta ruta se puede usar para ubicar el directorio lib y usar los módulos de Python proporcionados. | 
|  `EC2RL_WORKDIR`  |  El directorio tmp principal de la herramienta de diagnóstico. Valor predeterminado: `/var/tmp/ec2rl`. | 
|  `EC2RL_RUNDIR`  |  El directorio donde se almacenan todos los resultados. Valor predeterminado: `/var/tmp/ec2rl/<date&timestamp>`.  | 
|  `EC2RL_GATHEREDDIR`  |  El directorio raíz donde se colocan los datos recopilados del módulo. Valor predeterminado:`/var/tmp/ec2rl/<date&timestamp>/mod_out/gathered/`.  | 
|  `EC2RL_NET_DRIVER`  |  El controlador en uso para la primera interfaz de red no virtual en orden alfabético en la instancia. Ejemplos: [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/es_es/AWSEC2/latest/UserGuide/ec2rl_moduledev.html)  | 
|  `EC2RL_SUDO`  |  Es verdadero si EC2Rescue para Linux se ejecuta como raíz; de lo contrario, es falso.  | 
|  `EC2RL_VIRT_TYPE`  |  El tipo de virtualización según lo proporcionan los metadatos de la instancia. Ejemplos: [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/es_es/AWSEC2/latest/UserGuide/ec2rl_moduledev.html)  | 
|  `EC2RL_INTERFACES`  |  Una lista numerada de interfaces en el sistema. El valor es una cadena que contiene nombres como `eth0`, `eth1`, etcétera. Se genera mediante `functions.bash` y solo está disponible para los módulos de los que se obtiene.  | 

## Usar sintaxis YAML
<a name="ec2rl_yamlsyntax"></a>

Cuando se construyen los archivos YAML de un módulo, se debe tener en cuenta lo siguiente:
+ Tres guiones (`---`) denotan el inicio explícito de un documento.
+ La etiqueta `!ec2rlcore.module.Module` dice al analizador YAML a qué constructor llamar cuando se crea el objeto del flujo de datos. Encontrará el constructor dentro del archivo `module.py`.
+ La etiqueta `!!str` indica al analizador YAML que no intente determinar el tipo de datos y que interprete el contenido como un literal de cadena.
+ El carácter `|` indica al analizador YAML que el valor es un escalar de estilo literal. En este caso, el analizador incluye todos los espacios en blanco. Esto es importante para los módulos porque se mantienen la sangría y los caracteres de nueva línea.
+ La sangría estándar de YAML son dos espacios, como se puede ver en los ejemplos siguientes. Asegúrese de que mantiene la sangría estándar (por ejemplo, cuatro espacios para Python) para el script y después sangría de dos espacios para todo el contenido en el archivo del módulo.

## Módulos de ejemplo
<a name="ec2rl_example"></a>

Ejemplo uno (`mod.d/ps.yaml`):

```
--- !ec2rlcore.module.Module
# Module document. Translates directly into an almost-complete Module object
name: !!str ps
path: !!str
version: !!str 1.0
title: !!str Collect output from ps for system analysis
helptext: !!str |
  Collect output from ps for system analysis
  Requires --times= for number of times to repeat
  Requires --period= for time period between repetition
placement: !!str run
package: 
  - !!str
language: !!str bash
content: !!str |
  #!/bin/bash
  error_trap()
  {
      printf "%0.s=" {1..80}
      echo -e "\nERROR:	"$BASH_COMMAND" exited with an error on line ${BASH_LINENO[0]}"
      exit 0
  }
  trap error_trap ERR

  # read-in shared function
  source functions.bash
  echo "I will collect ps output from this $EC2RL_DISTRO box for $times times every $period seconds."
  for i in $(seq 1 $times); do
      ps auxww
      sleep $period
  done
constraint:
  requires_ec2: !!str False
  domain: !!str performance
  class: !!str collect
  distro: !!str alami ubuntu rhel suse
  required: !!str period times
  optional: !!str
  software: !!str
  sudo: !!str False
  perfimpact: !!str False
  parallelexclusive: !!str
```