http - tag - ¿Cómo obtener un archivo remoto(por ejemplo, desde Github) en un recurso de archivo Puppet?
que es un repositorio git (5)
file { ''leiningen'':
path => ''/home/vagrant/bin/lein'',
ensure => ''file'',
mode => ''a+x'',
source => ''https://raw.github.com/technomancy/leiningen/stable/bin/lein'',
}
fue idea mía, pero Puppet no sabe http://
. ¿Hay algo sobre el puppet://
lo he echado de menos?
O si no, ¿hay una manera de obtener declarativamente el archivo primero y luego usarlo como fuente local?
Antes de Puppet 4.4, según http://docs.puppetlabs.com/references/latest/type.html#file , la fuente del archivo solo acepta puppet: // o file: // URIs.
A partir de Puppet 4.4+, su código original sería posible .
Si está utilizando una versión anterior, una forma de lograr lo que quiere hacer sin tener que abrir todo el repositorio de Git sería utilizar el recurso exec para recuperar el archivo.
exec{''retrieve_leiningen'':
command => "/usr/bin/wget -q https://raw.github.com/technomancy/leiningen/stable/bin/lein -O /home/vagrant/bin/lein",
creates => "/home/vagrant/bin/lein",
}
file{''/home/vagrant/bin/lein'':
mode => 0755,
require => Exec["retrieve_leiningen"],
}
Aunque el uso de exec es algo mal visto, puede usarse de manera efectiva para crear sus propios tipos. Por ejemplo, puede tomar el fragmento anterior y crear su propio tipo de recurso.
define remote_file($remote_location=undef, $mode=''0644''){
exec{"retrieve_${title}":
command => "/usr/bin/wget -q ${remote_location} -O ${title}",
creates => $title,
}
file{$title:
mode => $mode,
require => Exec["retrieve_${title}"],
}
}
remote_file{''/home/vagrant/bin/lein'':
remote_location => ''https://raw.github.com/technomancy/leiningen/stable/bin/lein'',
mode => ''0755'',
}
Como usted hace referencia a un repositorio de GitHub, usaría el módulo Puppetlabs vcsrepo , que brindaría el beneficio adicional de poder retroalimentar cambios o simplemente mantenerse actualizado. Puedes instalar el módulo desde el Puppet Forge usando
sudo puppet module install puppetlabs/vcsrepo
Luego simplemente declara el repositorio y usa los enlaces de archivo para colocar el archivo exactamente donde lo desea.
vcsrepo { ''/opt/leiningen'':
ensure => present,
provider => git,
source => ''https://github.com/technomancy/leiningen.git'',
revision => ''stable'',
}
file { "/usr/local/bin/lein": # or wherever you want the file to be
ensure => symlink,
target => ''/opt/leiningen/bin/lein'',
}
Tenga en cuenta que el parámetro de revision
se puede usar para especificar la revisión, la etiqueta o (como lo hacemos aquí) la rama.
Obviamente, podría omitir la declaración del archivo y simplemente actualizar su PATH para incluir /opt/leiningen/bin/
.
Me gusta el módulo maestrodev-wget. Se puede encontrar en Puppetlabs Forge .
La instalación es simple. Uso vagrant bastante y tengo un archivo ''bootstrap.sh'' que incluye:
puppet module install maestrodev-wget
Entonces es cuestión de algo como esto:
include wget
wget::fetch { "download the jdk7 file":
source => ''https://a_path_to_our_internal_artifact_repo/oracle/jdk7...'',
destination => ''/tmp/jdk7...'',
timeout => 0,
verbose => true,
nocheckcertificate => true,
}
Luego uso los archivos en mis clases como normal. Agregué la bandera nocheckcertificate porque obtengo de nuestro repositorio https local y a menudo olvido la bandera.
El autor también hace un módulo de Maven que es bastante bueno y también útil para recuperar archivos de repositorios de artefactos.
Para usuarios de Windows Puppet, puede usar el módulo Powershell y el comando nativo Powershell Invoke-WebRequest
.
exec { ''C:/home/vagrant/bin/lein'':
command => ''Invoke-WebRequest "https://raw.github.com/technomancy/leiningen/stable/bin/lein" -OutFile "C:/home/vagrant/bin/lein"'',
provider => powershell,
creates => ''C:/home/vagrant/bin/lein''
}
Si bien Puppet 4.4 y las versiones más nuevas admiten la recuperación de archivos básicos de fuentes http, la compatibilidad integrada es muy, muy básica. La recuperación de archivos se resuelve mejor usando un tipo de utilidad de Puppet Forge.
Hay algunas opciones por ahí. Un módulo aprobado de alta calidad que funciona en todas las plataformas es lwf/remote_file . Esto se implementa como un tipo Puppet nativo en lugar de como un contenedor Exec.
Ejemplo de uso:
remote_file { ''/path/to/your/file'':
ensure => present,
source => ''https://example.com/file.tar.gz'',
checksum => ''d41d8cd98f00b204e9800998ecf8427e''
proxy_host => ''192.168.12.40'',
proxy_port => 3128,
}
Otras características admitidas incluyen la aprobación de encabezados HTTP que controlan el requisito de verificación SSL y el uso de un nombre de usuario / contraseña de autenticación básica.