Instalación de sistemas Oracle® Solaris 11.2

Salir de la Vista de impresión

Actualización: Julio de 2014
 
 

Creación de una secuencia de comandos de manifiestos derivados

En general, una secuencia de comandos de manifiestos derivados recupera información del cliente y utiliza esa información para modificar un manifiesto de AI base a fin de crear un manifiesto de AI personalizado sólo para este cliente. Una secuencia de comandos de manifiestos derivados también puede combinar varios manifiestos de AI parciales. El manifiesto derivado final debe estar completo y superar la validación.

Una secuencia de comandos de manifiestos derivados puede ser cualquier clase de secuencia de comandos que se admita en la imagen. Por ejemplo, ksh93 y python están en la imagen de manera predeterminada. Si desea utilizar otra clase de secuencia de comandos, asegúrese de que el soporte necesario esté en la imagen.

Recuperación de atributos de cliente

La secuencia de comandos de manifiestos derivados puede ejecutar comandos para leer los atributos del sistema. AI ejecuta la secuencia de comandos como un rol aiuser. El rol aiuser tiene todos los privilegios de un usuario que no dispone de privilegios, además de los siguientes privilegios adicionales:

solaris.network.autoconf.read
solaris.smf.read.*

El rol aiuser no dispone de privilegios, con la excepción de que puede leer más información del sistema que otros usuarios sin privilegios. El rol aiuser no puede cambiar el sistema.

Para obtener información sobre roles, perfiles y privilegios, consulte Protección de los usuarios y los procesos en Oracle Solaris 11.2 .

Además de utilizar comandos para leer los atributos del sistema, los atributos del cliente están disponibles por medio de las variables de entorno mostradas en la siguiente tabla.

Tabla 10-1  Variables de entorno de atributos de cliente
Nombre de variable de entorno
Descripción
SI_ARCH
Arquitectura del cliente que se instalará. Equivalente a la salida de uname -p.
SI_CONFIG_PROFILE_DIR
El directorio donde los perfiles de configuración del sistema proporcionados por el usuario se pueden almacenar y pueden ser utilizados por el servicio de instalación.
SI_CPU
ISA o tipo de procesador del cliente que se instalará. Equivalente a la salida de uname -p.
SI_DISKNAME_#
Conjunto plano de variables que representan los nombres de los discos detectados en el cliente. Existirán número SI_NUMDISKS de variables SI_DISKNAME_#, donde # se reemplaza por un número entero comenzando a partir del 1, hasta SI_NUMDISKS. Este conjunto de variables se correlaciona con el conjunto de variables descrito por SI_DISKSIZE_#.
SI_DISKSIZE_#
Conjunto plano de variables que representan el tamaño de los discos detectados en el cliente. Existirán número SI_NUMDISKS de variables SI_DISKSIZE_#, donde # se reemplaza por un número entero comenzando a partir del 1, hasta SI_NUMDISKS. Este conjunto de variables se correlaciona con el conjunto de variables descrito por SI_DISKNAME_#. Los tamaños son números enteros de megabytes.
SI_HOSTADDRESS
Dirección IP del cliente como se definió en el entorno de instalación.
SI_HOSTNAME
Nombre de host del cliente como se definió en el entorno de instalación.
SI_INSTALL_SERVICE
Nombre del servicio de instalación utilizado para obtener la secuencia de comandos del manifiesto. Esta variable de entorno sólo tiene un valor para los inicios desde redes, no para los inicios desde medios.
SI_KARCH
Arquitectura de núcleo del cliente. Equivalente a la salida de uname -m.
SI_MEMSIZE
Cantidad de memoria física en el cliente. El tamaño es un número entero de megabytes.
SI_NATISA
Arquitectura de conjunto de instrucciones nativa del cliente. Equivalente a la salida de isainfo -n.
SI_NETWORK
Número de red del cliente. El número de red es (IP_ADDR & netmask).
SI_NUMDISKS
Cantidad de discos en el cliente.
SI_PLATFORM (or SI_MODEL)
Plataforma del cliente. Equivalente a la salida de uname -i para los sistemas x86 y prtconf -b para los sistemas SPARC.
SI_SYSPKG
La versión del paquete de incorporación Oracle Solaris en el cliente (actualmente denominado entire). Si el paquete completo del cliente es pkg://solaris/entire@0.5.11,5.11-0.175.0.0.0.2.0:20111020T143822Z, el valor de SI_SYSPKG sería pkg:/entire@0.5.11-0.175.0. Para una SRU o versión actualizada, si el paquete completo del cliente es pkg://solaris/entire@0.5.11,5.11-0.175.1.19.0.6.0:20140508T221351Z, el valor de SI_SYSPKG sería pkg:/entire@0.5.11-0.175.1.

Personalización del manifiesto AI

Para agregar o modificar elementos XML en un manifiesto AI, utilice el comando /usr/bin/aimanifest.

    Un archivo que se deba modificar mediante aimanifest debe contener, al menos, lo siguiente:

  • Una referencia !DOCTYPE a un DTD que es válido para el manifiesto XML en desarrollo.

  • El elemento raíz para este DTD.

El siguiente ejemplo muestra el archivo de manifiesto base mínimo para un manifiesto de AI, incluida la especificación del archivo DTD AI para el servicio de instalación, donde se agregará esta secuencia de comandos de manifiestos derivados:

<!DOCTYPE auto_install SYSTEM "file:///imagepath/auto_install/ai.dtd.1">
<auto_install/>

El valor del argumento imagepath es la ruta devuelta por el siguiente comando, donde svcname es el nombre del servicio de instalación en el que se agregará esta secuencia de comandos de manifiestos derivados:

$ installadm list -v -n svcname

Notas -  Cambie el valor imagepath nuevamente por ///usr/share, antes de usar la secuencia de comandos para instalar un cliente AI.

Utilice el subcomando load del comando aimanifest para cargar un manifiesto base antes que cualquier otra llamada de aimanifest en la secuencia de comandos de manifiestos derivados. Los archivos que cargue debe estar disponibles para el cliente en el momento de la instalación del cliente. Por ejemplo, puede cargar un manifiesto de imagepath/auto_install/manifest/ en el servicio de instalación de destino.

En los ejemplos de este capítulo, se carga el archivo /usr/share/auto_install/manifest/default.xml. Los ejemplos de manifiestos de /usr/share/auto_install/manifest/ pueden ser diferentes de los manifiestos del servicio de instalación de destino. En tareas de producción, no debe cargar manifiestos desde /usr/share/auto_install/manifest/.

El subcomando load también se puede utilizar para cargar o insertar manifiestos parciales.

Utilice el subcomando add para agregar nuevos elementos. Utilice el subcomando set para agregar atributos de elementos o cambiar valores de atributos o elementos. Consulte la página del comando man aimanifest(1M) para obtener información detallada. La página del comando man y las secuencias de comandos que figuran a continuación proporcionan ejemplos del uso del comando aimanifest.


Notas - Si un valor especificado en un comando aimanifest contiene uno de los siguientes caracteres, dicho valor se debe escribir entre comillas simples o dobles para evitar que el carácter se interprete como parte del nombre de la ruta XML:
/'"@[]=

Es posible que las comillas se deban escapar con un carácter de barra inversa (\) precedente en función de las reglas del shell utilizado, de modo que el shell no elimine ni interprete las comillas.


El siguiente ejemplo devuelve la acción del elemento software_data que contiene el nombre de paquete pkg:/entire. En este ejemplo, es necesario usar comillas antes y después de pkg:/entire porque el carácter de barra diagonal es un carácter especial. Los caracteres de barra invertida son necesarios para incluir un carácter de escape en las comillas si este comando se invoca en una secuencia de comandos de shell como una secuencia de comandos ksh93.

# /usr/bin/aimanifest get software_data[name=\"pkg:/entire\"]@action

Consejo  - Se recomienda configurar una captura que se detenga ante un error.

La siguiente secuencia de comandos parcial constituye un modelo adecuado para una secuencia de comandos de manifiestos derivados:

#!/bin/ksh93

SCRIPT_SUCCESS=0
SCRIPT_FAILURE=1

function handler
{
    exit $SCRIPT_FAILURE
}

trap handler ERR

/usr/bin/aimanifest load baseAImanifest.xml

# Customize AI manifest. For example:
/usr/bin/aimanifest load -i manifest_fragment.xml
/usr/bin/aimanifest set origin@name file:///net/myserver/myrepo/repo.redist

exit $SCRIPT_SUCCESS

Ejemplos de secuencias de comandos de manifiestos derivados

En esta sección se muestra cómo escribir secuencias de comandos de manifiestos derivados para determinar los atributos de cliente y utilizar esa información para personalizar el manifiesto de AI. Estos ejemplos no incluyen necesariamente toda la información necesaria para generar un manifiesto AI válido.

    Para intentar estos ejemplos, realice los siguientes pasos de configuración:

  1. Defina la variable de entorno AIM_MANIFEST en una ubicación donde la secuencia de comandos desarrollará el manifiesto AI.

    El archivo $AIM_MANIFEST se vuelve a escribir para cada comando aimanifest que modifica el archivo. Cada invocación de aimanifest con el subcomando load, add, delete o set abre, modifica y guarda el archivo AIM_MANIFEST. Si AIM_MANIFEST no está definido, se produce un error en el comando aimanifest.

  2. Defina la variable de entorno AIM_LOGFILE en una ubicación en la que la secuencia de comandos pueda escribir información detallada y mensajes de error.

    El comando aimanifest registra el nombre del subcomando, los valores de argumentos y el estado de retorno de cada llamada aimanifest en la pantalla y en el archivo $AIM_LOGFILE si se ha definido.

  3. Asegúrese de que el comando aimanifest esté disponible en el sistema en el que se ejecuta la secuencia de comandos. Si el comando aimanifest no está disponible, instale el paquete auto-install-common.

  4. Configure variables de entorno. Estos ejemplos demuestran cómo usar variables de entorno para recuperar información sobre el cliente. Para intentar estos ejemplos, es preciso configurar valores para estas variables de entorno.

    Al instalar un sistema con AI, las variables de entorno que se muestran en la Table 10–1 tienen valores y están disponibles para que se utilicen en una secuencia de comandos de manifiestos derivados.

Ejemplo 10-1  Especificación de las particiones de discos en función del tamaño de disco

En este ejemplo, se personaliza el manifiesto AI para utilizar sólo la mitad del disco de destino para una partición fdisk de Oracle Solaris si el tamaño del disco es mayor que 1 TB. Intente configurar SI_DISKSIZE_1 en menos de 1 TB y, luego, en más de 1 TB para efectuar diferentes ejecuciones de esta secuencia de comandos. Defina también SI_NUMDISKS y SI_DISKNAME_1 antes de ejecutar la secuencia de comandos. Tenga en cuenta que esta secuencia de comandos sólo se utiliza en los clientes x86 porque la partición especificada sólo se aplica a los clientes x86.

#!/bin/ksh93

SCRIPT_SUCCESS=0
SCRIPT_FAILURE=1

function handler
{
    exit $SCRIPT_FAILURE
}

trap handler ERR

/usr/bin/aimanifest load /usr/share/auto_install/manifest/default.xml

# Check that there is only one disk on the system.
if [[ $SI_NUMDISKS -gt "1" ]] ; then
    print -u2 "System has too many disks for this script."
    exit $SCRIPT_FAILURE
fi

/usr/bin/aimanifest add \
    /auto_install/ai_instance/target/disk/disk_name@name $SI_DISKNAME_1

if [[ $SI_DISKSIZE_1 -gt "1048576" ]] ; then
    typeset -i PARTN_SIZE=$SI_DISKSIZE_1/2

    # Default action is to create.
    /usr/bin/aimanifest add \
        /auto_install/ai_instance/target/disk[disk_name@name=\"$SI_DISKNAME_1\"]/partition@name 1
    /usr/bin/aimanifest add \
        /auto_install/ai_instance/target/disk/partition[@name=1]/size@val \
        ${PARTN_SIZE}mb
else
    /usr/bin/aimanifest add \
        /auto_install/ai_instance/target/disk[disk_name@name=\"$SI_DISKNAME_1\"]/partition@action \
        use_existing_solaris2
fi
exit $SCRIPT_SUCCESS

Para los clientes en los que el valor de SI_DISKSIZE_1 es menor o igual que 1048576, se agregan los siguientes elementos en $AIM_MANIFEST:

<target>
  <disk>
    <disk_name name="/dev/dsk/c0t0d0s0"/>
    <partition action="use_existing_solaris2"/>
  </disk>
  <!-- <logical> section -->
</target>

Para los clientes en los que el valor de SI_DISKSIZE_1 es mayor que 1048576, se agregan elementos similares a los siguientes en $AIM_MANIFEST, según el valor de SI_DISKSIZE_1:

<target>
  <disk>
    <disk_name name="/dev/dsk/c0t0d0s0"/>
    <partition name="1">
      <size val="524288mb"/>
    </partition>
  </disk>
  <!-- <logical> section -->
</target>

disk_name se especifica en el comando para agregar la partición a fin de evitar la creación de una especificación de disco independiente para la partición. La secuencia de comandos de este ejemplo especifica que la partición está en el disco $SI_DISKNAME_1 y no en un disco diferente. Si las líneas adecuadas de este ejemplo se reemplazan por las siguientes líneas, no se obtiene el resultado previsto:

    /usr/bin/aimanifest add \
        /auto_install/ai_instance/target/disk/partition@name 1
    /usr/bin/aimanifest add \
        /auto_install/ai_instance/target/disk/partition[@name=1]/size@val \
        ${PARTN_SIZE}mb
else
    /usr/bin/aimanifest add \
        /auto_install/ai_instance/target/disk/partition@action \
        use_existing_solaris2

En lugar de la salida anterior, esta secuencia de comandos generará la siguiente salida incorrecta:

<target>
  <disk>
    <disk_name name="c0t0d0s0"/>
  </disk>
  <disk>
    <partition name="1">
      <size val="524288mb"/>
    </partition>
  </disk>
</target>
Ejemplo 10-2  Especificación del diseño de la agrupación raíz en función de la existencia de discos adicionales

En este ejemplo, se personaliza el manifiesto AI para configurar un reflejo de la agrupación root si existe un segundo disco y para configurar un reflejo de tres vías si existe un tercer disco. Defina SI_NUMDISKS y SI_DISKNAME_1 antes de ejecutar la secuencia de comandos. Defina SI_DISKNAME_2, SI_DISKNAME_3 y todos los demás elementos como sea necesario, según el valor definido para SI_NUMDISKS. Estas variables de entorno se definirán y estarán disponibles para las secuencias de comandos de manifiestos derivados durante las instalaciones AI.

En este ejemplo, se demuestra el uso de la ruta de retorno aimanifest (opción –r). Consulte la página del comando man aimanifest(1M) para obtener más información sobre la ruta de retorno.

#!/bin/ksh93

SCRIPT_SUCCESS=0
SCRIPT_FAILURE=1

function handler
{
    exit $SCRIPT_FAILURE
}

trap handler ERR

/usr/bin/aimanifest load /usr/share/auto_install/manifest/default.xml

# Use the default if there is only one disk.
if [[ $SI_NUMDISKS -ge 2 ]] ; then
    typeset -i disk_num

    # Turn on mirroring. Assumes a root zpool is already set up.
    vdev=$(/usr/bin/aimanifest add -r \
        target/logical/zpool[@name=rpool]/vdev@name mirror_vdev)
    /usr/bin/aimanifest set ${vdev}@redundancy mirror

    for ((disk_num = 1; disk_num <= $SI_NUMDISKS; disk_num++)) ; do
        eval curr_disk="$"SI_DISKNAME_${disk_num}
        disk=$(/usr/bin/aimanifest add -r target/disk@in_vdev mirror_vdev)
        /usr/bin/aimanifest set ${disk}@in_zpool rpool
        /usr/bin/aimanifest set ${disk}@whole_disk true
        disk_name=$(/usr/bin/aimanifest add -r \
            ${disk}/disk_name@name $curr_disk)
        /usr/bin/aimanifest set ${disk_name}@name_type ctd
    done
fi
exit $SCRIPT_SUCCESS

Para un sistema con dos discos denominados c0t0d0 y c0t1d0, la salida de este ejemplo es el siguiente elemento XML:

<target>
  <disk in_vdev="mirror_vdev" in_zpool="rpool" whole_disk="true">
    <disk_name name="c0t0d0" name_type="ctd"/>
  </disk>
  <disk in_vdev="mirror_vdev" in_zpool="rpool" whole_disk="true">
    <disk_name name="c0t1d0" name_type="ctd"/>
  </disk>
  <logical>
    <zpool name="rpool" is_root="true">
      <vdev name="mirror_vdev" redundancy="mirror"/>
      <filesystem name="export" mountpoint="/export"/>
      <filesystem name="export/home"/>
      <be name="solaris"/>
    </zpool>
  </logical>
</target>
Ejemplo 10-3  Especificación de una configuración reflejada si al menos están presentes dos discos del tamaño especificado

En este ejemplo, se personaliza el manifiesto AI para especificar una configuración reflejada si el sistema tiene al menos dos discos de 200 GB. Utilice los primeros dos discos detectados que tengan al menos 200 GB. Defina SI_NUMDISKS, SI_DISKNAME_1 y SI_DISKSIZE_1 en el entorno de prueba antes de ejecutar la secuencia de comandos. También defina SI_DISKNAME_2, SI_DISKSIZE_2 y todos los demás elementos como sea necesario, según el valor definido para SI_NUMDISKS . Estas variables de entorno se definirán y estarán disponibles para las secuencias de comandos de manifiestos derivados durante las instalaciones AI.

En este ejemplo, se muestra cómo modificar un nodo cuando más de un nodo con la misma ruta está presente. La implementación de shell utiliza la opción de ruta de retorno (–r) de aimanifest para devolver la ruta a un nodo específico, y utiliza esa ruta para realizar modificaciones adicionales en el mismo nodo. La implementación de Python demuestra el uso de subrutas (cuando se utiliza [] dentro de una ruta de nodo) para realizar modificaciones adicionales en el mismo nodo.

#!/bin/ksh93

SCRIPT_SUCCESS=0
SCRIPT_FAILURE=1

function handler
{
    exit $SCRIPT_FAILURE
}

trap handler ERR

# Find the disks first.
typeset found_1
typeset found_2
typeset -i disk_num

for ((disk_num = 1; disk_num <= $SI_NUMDISKS; disk_num++)) ; do
    eval curr_disk="$"SI_DISKNAME_${disk_num}
    eval curr_disk_size="$"SI_DISKSIZE_${disk_num}
    if [[ $curr_disk_size -ge "204800" ]] ; then
        if [ -z $found_1 ] ; then
            found_1=$curr_disk
        else
            found_2=$curr_disk
            break
        fi
    fi
done

# Now, install them into the manifest.
# Let the installer take the default action if two large disks are not found.

/usr/bin/aimanifest load /usr/share/auto_install/manifest/default.xml

if [[ -n $found_2 ]] ; then
    # Turn on mirroring.
    vdev=$(/usr/bin/aimanifest add -r \
        /auto_install/ai_instance/target/logical/zpool/vdev@redundancy mirror)
    /usr/bin/aimanifest set ${vdev}@name mirror_vdev

    disk=$(/usr/bin/aimanifest add -r \
        /auto_install/ai_instance/target/disk@in_vdev mirror_vdev)
    disk_name=$(/usr/bin/aimanifest add -r ${disk}/disk_name@name $found_1)
    /usr/bin/aimanifest set ${disk_name}@name_type ctd

    disk=$(/usr/bin/aimanifest add -r \
        /auto_install/ai_instance/target/disk@in_vdev mirror_vdev)
    disk_name=$(/usr/bin/aimanifest add -r ${disk}/disk_name@name $found_2)
    /usr/bin/aimanifest set ${disk_name}@name_type ctd
fi

exit $SCRIPT_SUCCESS

La siguiente secuencia de comandos es una versión de Python de la versión de shell Korn anterior.

#!/usr/bin/python2.6

import os
import sys

from subprocess import check_call, CalledProcessError

SCRIPT_SUCCESS = 0
SCRIPT_FAILURE = 1

def main():

    # Find the disks first.
    found_1 = ""
    found_2 = ""

    si_numdisks = int(os.environ["SI_NUMDISKS"])
    for disk_num in range(1, si_numdisks + 1):
        curr_disk_var = "SI_DISKNAME_" + str(disk_num)
        curr_disk = os.environ[curr_disk_var]
        curr_disk_size_var = "SI_DISKSIZE_" + str(disk_num)
        curr_disk_size = os.environ[curr_disk_size_var]
        if curr_disk_size >= "204800":
            if not len(found_1):
                found_1 = curr_disk
            else:
                found_2 = curr_disk
                break

    # Now, write the disk specifications into the manifest.
    # Let the installer take the default action if two large disks are not found.

    try:
        check_call(["/usr/bin/aimanifest", "load",
            "/usr/share/auto_install/manifest/default.xml"])
    except CalledProcessError as err:
        sys.exit(err.returncode)

    if len(found_2):
        try:
            check_call(["/usr/bin/aimanifest", "add",
               "target/logical/zpool[@name=rpool]/vdev@redundancy", "mirror"])
            check_call(["/usr/bin/aimanifest", "set",
               "target/logical/zpool/vdev[@redundancy='mirror']@name", "mirror_vdev"])

            check_call(["/usr/bin/aimanifest", "add",
                "target/disk/disk_name@name", found_1])
            check_call(["/usr/bin/aimanifest", "set",
                "target/disk/disk_name[@name='" + found_1 + "']" + "@name_type", "ctd"])
            check_call(["/usr/bin/aimanifest", "set",
                "target/disk[disk_name@name='" + found_1 + "']" + "@in_vdev", "mirror_vdev"])

            check_call(["/usr/bin/aimanifest", "add",
                "target/disk/disk_name@name", found_2])
            check_call(["/usr/bin/aimanifest", "set",
                "target/disk/disk_name[@name='" + found_2 + "']" + "@name_type", "ctd"])
            check_call(["/usr/bin/aimanifest", "set",
                "target/disk[disk_name@name='" + found_2 + "']" + "@in_vdev", "mirror_vdev"])
        except CalledProcessError as err:
            sys.exit(err.returncode)

    sys.exit(SCRIPT_SUCCESS)

if __name__ == "__main__":
    main()
Ejemplo 10-4  Especificación de paquetes para instalar en función de la dirección IP

En este ejemplo, se personaliza el manifiesto AI para instalar un paquete si la dirección IP del cliente están en un rango especificado y para instalar un paquete distinto si la dirección IP del cliente está en un rango diferente. Defina SI_HOSTADDRESS en el entorno de prueba antes de ejecutar la secuencia de comandos. Esta variable de entorno se definirá y estará disponible para las secuencias de comandos de manifiestos derivados durante las instalaciones AI.

#!/bin/ksh93

SCRIPT_SUCCESS=0
SCRIPT_FAILURE=1

function handler
{
    exit $SCRIPT_FAILURE
}

trap handler ERR

/usr/bin/aimanifest load /usr/share/auto_install/manifest/default.xml

# First determine which range the host IP address of the client is in.
echo $SI_HOSTADDRESS | sed 's/\./ /g' | read a b c d

# Assume all systems are on the same class A and B subnets.

# If the system is on class C subnet = 100, then install the /pkg100 package.
# If the system is on class C subnet = 101, then install the /pkg101 package.
# Otherwise, do not install any other additional package.

if ((c == 100)) ; then
    /usr/bin/aimanifest add \
    software/software_data[@action='install']/name pkg:/pkg100
fi
if ((c == 101)) ; then
    /usr/bin/aimanifest add \
    software/software_data[@action='install']/name pkg:/pkg101
fi

exit $SCRIPT_SUCCESS
Ejemplo 10-5  Especificación de un tamaño mínimo para el disco de destino

En este ejemplo, se personaliza el manifiesto AI para que sólo se instale en un disco que tenga al menos 50 GB. Ignore los discos más pequeños. Defina SI_NUMDISKS, SI_DISKNAME_1 y SI_DISKSIZE_1 en el entorno de prueba antes de ejecutar la secuencia de comandos. También defina SI_DISKNAME_2, SI_DISKSIZE_2 y todos los demás elementos como sea necesario, según el valor definido para SI_NUMDISKS . Estas variables de entorno se definirán y estarán disponibles para las secuencias de comandos de manifiestos derivados durante las instalaciones AI.

#!/bin/ksh93

SCRIPT_SUCCESS=0
SCRIPT_FAILURE=1

function handler
{
    exit $SCRIPT_FAILURE
}

trap handler ERR

/usr/bin/aimanifest load /usr/share/auto_install/manifest/default.xml

typeset found
typeset -i disk_num
for ((disk_num = 1; disk_num <= $SI_NUMDISKS; disk_num++)) ; do
    eval curr_disk="$"SI_DISKNAME_${disk_num}
    eval curr_disk_size="$"SI_DISKSIZE_${disk_num}
    if [[ $curr_disk_size -ge "512000" ]] ; then
        found=$curr_disk
        /usr/bin/aimanifest add \
            /auto_install/ai_instance/target/disk/disk_name@name $found
        break
    fi
done

if [[ -z $found ]] ; then
    exit $SCRIPT_FAILURE
fi

exit $SCRIPT_SUCCESS
Ejemplo 10-6  Agregación de un perfil de configuración de sistema

A veces, es necesario un cambio de configuración del sistema para cada cliente. En lugar de tener que crear un perfil de configuración de sistema individual en el servidor AI para cada cliente, puede configurar una secuencia de comandos de manifiestos derivados para crear el perfil para usted. El perfil se debe almacenar en /system/volatile/profile para que el servicio de instalación pueda utilizarlo. En este ejemplo, los valores de configuración del enrutador predeterminado local se utilizan cuando el cliente se vuelve a configurar.

ROUTER-CONFIG=/system/volatile/profile/router-config.xml
ROUTER=`netstat -rn | grep "^default" | awk '{print $2}'`

cat<<EOF>${ROUTER-CONFIG}
<!DOCTYPE service_bundle SYSTEM "/usr/share/lib/xml/dtd/service_bundle.dtd.1">
 <service_bundle type="profile" name="router">
   <service name="network/install" version="1" type="service">
     <instance name="default" enabled="true">
       <property_group name="install_ipv4_interface" type="application">
         <propval name="default_route" type="net_address_v4" value="${ROUTER}"/>
       </property_group>
     </instance>
   </service>
 </service_bundle>
EOF
Ejemplo 10-7  Secuencia de comandos con especificaciones de manifiesto incorrectas

La secuencia de comandos de este ejemplo contiene errores.

#!/bin/ksh93

SCRIPT_SUCCESS=0
SCRIPT_FAILURE=1

function handler
{
    exit $SCRIPT_FAILURE
}

trap handler ERR

/usr/bin/aimanifest load /usr/share/auto_install/manifest/default.xml

/usr/bin/aimanifest set \
    software[@type="IPS"]/software_data/name pkg:/driver/pcmcia
/usr/bin/aimanifest set \
    software/software_data[@name=pkg:/driver/pcmcia]@action uninstall

return $SCRIPT_SUCCESS

    En este ejemplo, existen tres problemas con la escritura en $AIM_MANIFEST.

  1. El subcomando set de aimanifest puede cambiar el valor de un elemento o un atributo existente, o puede crear un nuevo atributo. El subcomando set no puede crear un nuevo elemento. El primer subcomando set intenta modificar un nombre de paquete existente en el manifiesto, en lugar de crear un nuevo nombre de paquete. Si ya existe más de un nombre de paquete en el manifiesto, se produce un error de ambigüedad porque no es posible determinar cuál es el paquete que se debe modificar. El primer subcomando set de este ejemplo debería haber sido un subcomando add.

  2. En el segundo subcomando set de este ejemplo, se especifica un elemento name con el valor pkg:/driver/pcmcia con un signo @ precedente. Aunque los valores de atributos se especifican precedidos por un signo @, los valores de elementos no.

  3. El valor pkg:/driver/pcmcia debe estar entre comillas. Los valores con barras diagonales u otros caracteres especiales deben estar entre comillas.

Las siguientes líneas debe reemplazar las dos líneas set de este ejemplo:

/usr/bin/aimanifest add \
    software[@type="IPS"]/software_data@action uninstall
/usr/bin/aimanifest add \
    software/software_data[@action=uninstall]/name pkg:/driver/pcmcia

Estos dos subcomandos add agregan las siguientes líneas al final de la sección software del manifiesto que se desea escribir:

<software_data action="uninstall">
  <name>pkg:/driver/pcmcia</name>
</software_data>

Prueba de secuencias de comandos de manifiestos derivados

    Para probar la secuencia de comandos de manifiestos derivados, ejecute la secuencia de comandos en un entorno similar al entorno de instalación AI.

  1. Configure un manifiesto AI base para que la secuencia de comandos lo modifique.

    1. Asegúrese de que el primer comando aimanifest de la secuencia de comandos sea un comando aimanifest load. Asegúrese de que el archivo que desea cargar contenga una definición <!DOCTYPE> que especifique el DTD adecuado que se debe utilizar para la validación del manifiesto de AI del servicio de instalación de destino. El siguiente ejemplo muestra el archivo de manifiesto base mínimo para un manifiesto de AI, incluida la especificación del archivo DTD AI para el servicio de instalación, donde se agregará esta secuencia de comandos de manifiestos derivados:

      <!DOCTYPE auto_install SYSTEM "file:///imagepath/auto_install/ai.dtd.1">
      <auto_install/>

      El valor del argumento imagepath es la ruta devuelta por el siguiente comando, donde svcname es el nombre del servicio de instalación en el que se agregará esta secuencia de comandos de manifiestos derivados:


      Notas -  Asegúrese de restablecer el valor imagepath con la ruta predeterminada, ///usr/share, antes de intentar utilizar la secuencia de comandos en un cliente.
      $ installadm list -v -n svcname| grep Image
    2. Defina AIM_MANIFEST en una ubicación en la que la secuencia de comandos desarrollará el manifiesto AI. El usuario sin privilegios aiuser debe poder escribir esta ubicación.


      Notas - Cuando AI realiza la instalación, no es necesario definir AIM_MANIFEST. AI establece un valor predeterminado.
  2. Defina AIM_LOGFILE en una ubicación en la que la secuencia de comandos puede escribir información detallada y mensajes de error. El usuario sin privilegios aiuser debe poder escribir esta ubicación.


    Notas - Cuando AI realiza la instalación, no es necesario definir AIM_LOGFILE. Esta información de registro forma parte del registro de instalación más extenso, /system/volatile/install_log.
  3. Asegúrese de que el comando aimanifest esté disponible en el sistema en el que probará la secuencia de comandos. Si el comando aimanifest no está disponible, instale el paquete auto-install-common.

  4. Establezca variables de entorno en el entorno de prueba con valores que representen los sistemas cliente que se instalarán mediante esta secuencia de comandos de manifiestos derivados. El archivo de muestra /usr/share/auto_install/derived_manifest_test_env.sh se puede utilizar como una plantilla. Cambie los valores según corresponda.

    Cuando AI realiza la instalación, las variables de entorno que se muestran en la Table 10–1 tienen valores y están disponibles para que las utilice una secuencia de comandos de manifiestos derivados.

  5. Asegúrese de que puede asumir el rol de usuario root. Desde el rol de usuario root, puede asumir el rol aiuser sin especificar una contraseña.

    $ su
    Password: 
    # su aiuser -c ./script
    # 

    AI ejecuta la secuencia de comandos de manifiestos derivados como el rol aiuser. Para aproximar el entorno de instalación AI, asuma el rol aiuser para ejecutar la secuencia de comandos. Si ejecuta la secuencia de comandos como un usuario con privilegios distintos que los que tiene el rol aiuser, algunas operaciones de la secuencia de comandos pueden tener resultados diferentes.

  6. Utilice el subcomando validate en el manifiesto resultante.

    $ /usr/bin/aimanifest validate

    Se muestran mensajes sólo si falla la validación.

El sistema cliente deseado puede ser muy distinto del servidor AI u otro sistema en el que puede probar la secuencia de comandos de manifiestos derivados. Es posible que los comandos que se llamen en la secuencia de comandos no estén disponibles o que tengan una versión diferente con un comportamiento distinto. Es posible que los sistemas tengan arquitecturas diferentes o que la cantidad y el tamaño de los discos sean diferentes. La configuración de variables en el entorno de prueba como se describió anteriormente aborda algunas de estas diferencias.

Cómo probar la secuencia de comandos de manifiestos derivados en un entorno de instalación

Este procedimiento describe cómo probar la secuencia de comandos de manifiestos derivados en uno de los sistemas cliente deseados sin ejecutar el proceso de instalación completo.

  1. Inicie una imagen AI en ese sistema cliente.

    Inicie una imagen AI en ese sistema cliente con el modo "Text Installer and command line".

  2. Seleccione Shell en el menú inicial del instalador.
  3. Copie la secuencia de comandos desde el servidor AI.

    Utilice wget o sftp para copiar su secuencia de comandos desde el servidor AI.

  4. Depure la secuencia de comandos.

    Utilice uno de los siguientes métodos para depurar la secuencia de comandos:

    • Ejecute la secuencia de comandos manualmente.
    • Ejecute AI en modo de prueba.

      Utilice el siguiente comando para ejecutar AI en modo de prueba:

      $ auto-install -m script -i

    Inspeccione el archivo de registro AI /system/volatile/install_log. El archivo de registro debe contener la siguiente línea para indicar la validación de la secuencia de comandos:

    Derived Manifest Module: XML validation completed successfully
  5. Copie la secuencia de comandos de nuevo en el servidor de instalación.

    Copie la secuencia de comandos de nuevo en el servidor AI, si se han realizado cambios.