Как получить удаленный файл (например, из Github) в ресурсе Puppet?
file { 'leiningen':
path => '/home/vagrant/bin/lein',
ensure => 'file',
mode => 'a+x',
source => 'https://raw.github.com/technomancy/leiningen/stable/bin/lein',
}
была моя идея, но Puppet не знает http://
. Есть что-то о puppet://
Я пропустил?
Или, если нет, есть способ декларативно извлечь файл первым, а затем использовать его как локальный источник?
Ответы
Ответ 1
До Puppet 4.4, согласно http://docs.puppetlabs.com/references/latest/type.html#file, файл source принимает только кукольный:// или файл:// URI.
Как и в Puppet 4.4+, ваш исходный код будет возможен.
Если вы используете более старую версию, один из способов добиться того, что вы хотите сделать, не сворачивая весь репозиторий Git, - это использовать ресурс exec для извлечения файла.
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"],
}
Хотя использование exec несколько неодобрительно, его можно эффективно использовать для создания ваших собственных типов. Например, вы можете взять фрагмент выше и создать свой собственный тип ресурса.
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',
}
Ответ 2
Поскольку вы ссылаетесь на репозиторий GitHub, я бы использовал модуль Puppetlabs vcsrepo, что придало бы дополнительное преимущество тому, чтобы возвращать изменения или просто обновляться. Вы можете установить модуль из кукольной кузницы с помощью
sudo puppet module install puppetlabs/vcsrepo
Затем вы просто объявляете репозиторий и используете ссылки на файлы, чтобы поместить файл именно там, где вы хотите.
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',
}
Обратите внимание, что параметр revision
может использоваться для указания ветки ревизии, тега или (как мы здесь делаем).
Очевидно, вы можете опустить объявление файла и просто обновить свой PATH, включив /opt/leiningen/bin/
.
Ответ 3
Мне нравится модуль maestrodev-wget. Его можно найти на Puppetlabs Forge.
Установка проста. Я использую бродягу довольно много, и у меня есть файл "bootstrap.sh", который включает в себя:
puppet module install maestrodev-wget
Тогда это вопрос примерно такого:
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,
}
Затем я использую файлы в своих классах, как обычно. Я добавил флаг nocheckcertificate, потому что получаю от нашего локального ретрансляции https, и я часто забываю флаг.
Автор также делает модуль maven, который довольно велик и также полезен для извлечения файлов из репозиториев артефактов.
Ответ 4
Для кукольных пользователей Windows вы можете использовать модуль Powershell и собственную команду 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'
}