webentwicklung-frage-antwort-db.com.de

Wie rufe ich eine entfernte Datei (z. B. von Github) in einer Puppet-Dateiressource ab?

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

war meine Idee, aber Puppet weiß es nicht http://. Gibt es etwas über puppet:// Ich habe verpasst?

Oder wenn nicht, gibt es eine Möglichkeit, die Datei zuerst deklarativ abzurufen und dann als lokale Quelle zu verwenden?

31
Profpatsch

Vor Puppet 4.4 akzeptiert die Dateiquelle gemäß http://docs.puppetlabs.com/references/latest/type.html#file nur puppet:// oder file: // URIs.

Ab Puppet 4.4+ Ihr ursprünglicher Code wäre möglich .

Wenn Sie eine ältere Version verwenden, können Sie die exec -Ressource verwenden, um zu erreichen, was Sie tun möchten, ohne das gesamte Git-Repository herunterzufahren um die Datei abzurufen.

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

Obwohl die Verwendung von exec etwas verpönt ist, kann sie effektiv zum Erstellen eigener Typen verwendet werden. Zum Beispiel könnten Sie das obige Snippet nehmen und Ihren eigenen Ressourcentyp erstellen.

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

Wenn Sie auf ein GitHub-Repository verweisen, würde ich das Puppetlabs vcsrepo-Modul verwenden, das den zusätzlichen Vorteil bietet, Änderungen rückmelden zu können oder einfach nur auf dem neuesten Stand zu bleiben. Sie können das Modul von der Puppet Forge mit installieren

Sudo puppet module install puppetlabs/vcsrepo

Dann deklarieren Sie einfach das Repository und verwenden Dateilinks, um die Datei genau dort abzulegen, wo Sie sie haben möchten.

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

Beachten Sie, dass der Parameter revision verwendet werden kann, um die Revision, das Tag oder (wie hier) den Zweig anzugeben.

Offensichtlich könnten Sie die Dateideklaration weglassen und einfach Ihren PFAD so aktualisieren, dass er /opt/leiningen/bin/ Enthält.

14
spikeheap

Ich mag das Modul maestrodev-wget. Es kann auf Puppetlabs Forge gefunden werden.

Die Installation ist einfach. Ich benutze vagrant ziemlich oft und ich habe eine 'bootstrap.sh'-Datei, die folgendes enthält:

puppet module install maestrodev-wget

Dann geht es um so etwas:

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

Dann benutze ich die Dateien in meinen Klassen wie gewohnt. Ich habe das nocheckcertificate-Flag hinzugefügt, weil ich es von unserem lokalen https-Repo abhole und das Flag oft vergesse.

Der Autor macht auch ein Maven-Modul, das sehr gut ist und auch zum Abrufen von Dateien aus Artefakt-Repos nützlich ist.

5
staylorx

Puppet 4.4 und neuere Versionen unterstützen das grundlegende Abrufen von Dateien aus http-Quellen, die integrierte Unterstützung ist jedoch sehr, sehr einfach. Das Abrufen von Dateien wird am besten mit einem Dienstprogramm der Puppet Forge gelöst.

Es gibt da draußen ein paar Möglichkeiten. Ein qualitativ hochwertiges, zugelassenes Modul, das auf allen Plattformen funktioniert, ist lwf/remote_file . Dies wird eher als nativer Puppet-Typ als als Exec-Wrapper implementiert.

Anwendungsbeispiel:

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

Weitere unterstützte Funktionen sind die Übergabe von HTTP-Headern, die die SSL-Überprüfungsanforderung steuern, sowie die Verwendung des grundlegenden Benutzernamens und Kennworts für die Authentifizierung.

3
Reid Vandewiele

Für Benutzer von Windows-Puppets können Sie den Befehl Powershell-Modul und den nativen Befehl Powershell Invoke-WebRequest Verwenden.

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