Controlando La Ejecución De Exec en Puppet

En Puppet podemos ejecutar comando a nivel del sistema operativo por medio de Exec, en ocasiones sucede que tenemos declarada la sintaxis a ejecutar pero sucede que esta se aplica cada vez que corre el agente Puppet, Ejemplo:

1
2
3
4
exec{"install-rpm":
  ensure  => present,
  command => 'rpm -Uvh /root/package.rpm',
}

Lo anterior instalará un rpm llamado package.rpm cada vez que corra el agente, lo que pisará las configuraciones ya realizadas en la instalación y post-instalación del rpm. Para evitar que esto suceda Exec maneja dos atributos creates y onlyif ambos como condicionantes para que se puede ejecutar el comando.

  • creates
  • Funciona del modo que para ejecutar el atributo command no tiene que existir “algo” que se define con el atributo creates, ejemplo:

    1
    2
    3
    4
    5
    
    exec{"install-rpm":
    ensure  => present,
    creates => '/opt/rpm-directory/',
    command => 'rpm -Uvh /root/package.rpm',
    }
    

    Lo anterior dice que; para que se ejecute el exec no tiene que estar creado el directorio /opt/rpm-directory/, si este ya esta creado, es por que ya tenemos instalado el rpm y no es necesario volver a instalarlo.

  • onlyif
  • Funciona del modo que para ejecutar el atributo command el resultado del atributo onlyif debe retornar value 0 “nada” como respuesta a la condición, ejemplo:

    1
    2
    3
    4
    5
    
    exec{"install-rpm":
    ensure  => present,
    onlyif => "ls /opt/ |grep rpm-directory"
    command => 'rpm -Uvh /root/package.rpm',
    }
    

    Lo anterior dice que; para que se ejecute el exec la salida del onlyif debe retornar 0. Si el rpm ya lo tenemos instalado, este va a crear el directorio por lo que para evitar que se siga instalando solo vemos si este ya fue creado. Si el rpm fue instalado, el onlyif retornará un 1 por lo que no se volverá a ejecutar nuevamente.

    Link documentación

    Comments