Ejecute `apt-get update` antes de instalar otros paquetes con Puppet
zend-server (7)
Estoy intentando crear un módulo de títere que automatiza la instalación del servidor CE de zend, esto no es importante aquí, pero los pasos son los siguientes
- actualizar /etc/apt/source.list
- descargar la clave de repos a través de wget
- hacer apt-get update
- hacer apt-get install zend-server-ce-5.2
Tengo el archivo init.pp
class zendserverce {
# https://github.com/puppetlabs/puppetlabs-stdlib
file_line { ''debian_package'':
path => ''/etc/apt/sources.list'',
line => ''deb http://repos.zend.com/zend-server/deb server non-free''
}
exec { "wget http://repos.zend.com/zend.key -O- |apt-key add -":
path => ["/usr/bin", "/usr/sbin"]
}
exec { "apt-get update":
command => "/usr/bin/apt-get update",
onlyif => "/bin/sh -c ''[ ! -f /var/cache/apt/pkgcache.bin ] || /usr/bin/find /etc/apt/* -cnewer /var/cache/apt/pkgcache.bin | /bin/grep . > /dev/null''",
}
package { "zend-server-ce-php-5.2":
ensure => "latest"
}
}
Parece que el títere ejecuta los comandos en un orden diferente del que necesito. ¿Hay alguna manera de decirle que corra en el orden deseado?
La salida de tal fragmento es
[0;36mnotice: /Stage[main]/Mc/Package[mc]/ensure: ensure changed ''purged'' to ''latest''[0m
[1;35merr: /Stage[main]/Zendserverce/Package[zend-server-ce-php-5.2]/ensure: change from purged to latest failed: Could not update: Execution of ''/usr/bin/apt-get -q -y -o DPkg::Options::=--force-confold install zend-server-ce-php-5.2'' returned 100: Reading package lists...
Building dependency tree...
Reading state information...
E: Couldn''t find package zend-server-ce-php-5.2 at /tmp/vagrant-puppet/modules 0/zendserverce/manifests/init.pp:28[0m
[0;36mnotice: /Stage[main]/Zendserverce/Exec[wget http://repos.zend.com/zend.key -O- |apt-key add -]/returns: executed successfully[0m
[0;36mnotice: /Stage[main]/Zendserverce/File_line[debian_package]/ensure: created[0m
[0;36mnotice: Finished catalog run in 6.75 seconds[0m
Eso dice: No se pudo encontrar el paquete zend-server-ce-php-5.2
¿Alguien puede guiarme lo que está mal?
Añadiendo este fragmento de vudú funcionó para nosotros:
Apt::Pin <| |> -> Package <| |>
Apt::Source <| |> -> Package <| |>
Esto obligó a una actualización. YMMV.
Desde Puppet 2.6.0 se introduced una nueva característica "sintaxis de relación".
Un ejemplo en Puppet 2.6.0 y superior se vería así:
exec { "apt-update":
command => "/usr/bin/apt-get update"
}
Exec["apt-update"] -> Package <| |>
Cada vez que se ejecuta un comando de paquete, la dependencia (en nuestro caso ''apt-update'') se activará fist. Incluso puedes definir cadenas más largas.
El paquete que necesita actualizar las listas APT debe requerir la Class[''apt::update'']
package { "zend-server-ce-php-5.2":
ensure => "latest",
require => Class[''apt::update'']
}
Si está utilizando una fuente APT personalizada, solo asegúrese de realizar el pedido correcto:
Apt::Source[''my_source'']
-> Class[''apt::update'']
En Puppet 3, esto puede hacerse mediante la realización de recursos virtuales utilizando recolectores de recursos.
# so you don''t have to fully qualify paths to binaries
Exec { path => [''/usr/bin''] }
# virtual resource
@exec { ''sudo apt-get update'':
tag => foo_update
}
# realize resource. filter by arbitrary "foo_update"
# tag and relate it to all Package resources
Exec <| tag == foo_update |> -> Package <| |>
Es necesario especificar las relaciones de dependencia. El enfoque más fácil / limpio es usar el parámetro require que está disponible para todos los tipos de recursos.
package { "zend-server-ce-php-5.2":
ensure => latest,
require => Exec[''apt-get update''],
}
etc.
Prefiero poner apt-upgrade en una etapa separada antes de la etapa principal, por lo que no tengo que conectar ninguna dependencia. Consulte aquí: http://docs.puppetlabs.com/puppet/2.7/reference/lang_run_stages.html .
Un ejemplo simple se vería a continuación. Implica que tienes una clase separada para hacer la actual actualización de apt:
stage { "init": before => Stage["main"] }
class {"apt-update":
stage => init,
apt_mirror => $apt_mirror
}
Revise mi muestra LAMPP-box en github para ver cómo encajan las piezas: https://github.com/joerx/vagrant-lampp
Nota: tenga cuidado con apt-upgrade, ya que algunas cajas base se rompen con cosas como las actualizaciones del kernel.
Probé la variante anterior pero no me funciona en Ubuntu 10.04
Finalmente, preparé el siguiente script, que se ejecuta cada vez que el repositorio tiene más de una semana de antigüedad:
exec { ''apt-get update'':
command => "/usr/bin/apt-get update",
onlyif => "/bin/bash -c ''exit $(( $(( $(date +%s) - $(stat -c %Y /var/lib/apt/lists/$( ls /var/lib/apt/lists/ -tr1|tail -1 )) )) <= 604800 ))''"
}
Espero eso ayude.