web-dev-qa-db-fra.com

Comment récupérer un fichier distant (par exemple à partir de Github) dans une ressource de fichier Puppet?

file { 'leiningen': 
    path => '/home/vagrant/bin/lein',
    ensure => 'file',
    mode => 'a+x',
    source => 'https://raw.github.com/technomancy/leiningen/stable/bin/lein',
}

était mon idée, mais Puppet ne sait pas http://. Y a-t-il quelque chose à propos de puppet:// J'ai raté?

Sinon, existe-t-il un moyen de récupérer le fichier de manière déclarative en premier, puis de l'utiliser comme source locale?

31
Profpatsch

Avant Puppet 4.4, selon http://docs.puppetlabs.com/references/latest/type.html#file , la source du fichier accepte uniquement marionnette:// ou fichier: // URI.

Depuis Puppet 4.4+, votre code d'origine serait possible .

Si vous utilisez une version plus ancienne, une façon de réaliser ce que vous voulez faire sans tirer vers le bas le référentiel Git entier serait d'utiliser la ressource exec pour récupérer le fichier.

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"],
}

Bien que l'utilisation de exec soit quelque peu désapprouvée, elle peut être utilisée efficacement pour créer vos propres types. Par exemple, vous pouvez prendre l'extrait ci-dessus et créer votre propre type de ressource.

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',
}
44
rdoyle

Comme vous faites référence à un référentiel GitHub, j'utiliserais le module Puppetlabs vcsrepo , ce qui donnerait l'avantage supplémentaire de pouvoir répercuter les modifications ou simplement se tenir à jour. Vous pouvez installer le module à partir de Puppet Forge en utilisant

Sudo puppet module install puppetlabs/vcsrepo

Ensuite, vous déclarez simplement le référentiel et utilisez les liens de fichiers pour placer le fichier exactement où vous le souhaitez.

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',
}

Notez que le paramètre revision peut être utilisé pour spécifier la révision, la balise ou (comme nous le faisons ici) la branche.

Évidemment, vous pouvez omettre la déclaration de fichier et simplement mettre à jour votre PATH pour inclure /opt/leiningen/bin/.

14
spikeheap

J'aime le module maestrodev-wget. Il peut être trouvé sur Puppetlabs Forge .

L'installation est simple. J'utilise beaucoup vagabond et j'ai un fichier 'bootstrap.sh' qui comprend:

puppet module install maestrodev-wget

Il s'agit alors de quelque chose comme ceci:

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,
}

Ensuite, j'utilise les fichiers dans mes cours comme d'habitude. J'ai ajouté le drapeau nocheckcertificate parce que je récupère de notre repo https local et j'oublie souvent le drapeau.

L'auteur crée également un module maven qui est assez génial et également utile pour récupérer des fichiers à partir de dépôts d'artefacts.

5
staylorx

Alors que Puppet 4.4 et les versions plus récentes prennent en charge la récupération de fichiers de base à partir de sources http, la prise en charge intégrée est très, très basique. La récupération de fichiers est mieux résolue en utilisant un type d'utilitaire de Puppet Forge.

Il existe quelques options. Un module approuvé de haute qualité qui fonctionne sur toutes les plateformes est lwf/remote_file . Ceci est implémenté comme un type Puppet natif plutôt que comme un wrapper Exec.

Exemple d'utilisation:

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,
}

Les autres fonctionnalités prises en charge incluent la transmission d'en-têtes HTTP contrôlant l'exigence de vérification SSL et l'utilisation d'un nom d'utilisateur/mot de passe d'authentification de base.

3
Reid Vandewiele

Pour les utilisateurs de marionnettes Windows, vous pouvez utiliser le module Powershell et le Powershell natif Invoke-WebRequest commande.

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'
}
0
Aaron D