Как извлечь удаленный файл(например, из Github) в файловом ресурсе Puppet?
file { 'leiningen':
path => '/home/vagrant/bin/lein',
ensure => 'file',
mode => 'a+x',
source => 'https://raw.github.com/technomancy/leiningen/stable/bin/lein',
}
Это была моя идея, но марионетка не знает http://
. Есть ли что-то в puppet://
, что я пропустил?
Или, если нет, есть ли способ декларативно извлечь файл, а затем использовать его в качестве локального источника?
5 ответов:
Перед куклой 4.4, согласно http://docs.puppetlabs.com/references/latest/type.html#file , Источник файла принимает только puppet:// или file:// 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', }
Поскольку вы ссылаетесь на репозиторий 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
можно использовать для указания ревизии, тега или (как мы делаем здесь) ветка.Очевидно, что вы можете опустить объявление файла и просто обновить свой путь, чтобы включить
/opt/leiningen/bin/
.
Мне нравится модуль maestrodev-wget. Его можно найти наPuppetlabs Forge .
Установка проста. Я довольно часто пользуюсь vagrant и у меня есть '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, который довольно отлично,а также полезно для извлечения файлов из хранилищ артефактов.
Для пользователей Windows puppet можно использовать модуль 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' }
В то время как Puppet 4.4 и более новые поддерживают базовое извлечение файлов из источников http, встроенная поддержка очень, очень проста. Извлечение файлов лучше всего решать с помощью утилиты типа Puppet Forge.
Есть несколько вариантов. Высококачественный одобренный модуль, который работает на всех платформах, - это lwf/remote_file. Это реализовано как собственный кукольный тип, а не как оболочка Exec.
Пример использования:
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, }
Другие поддерживаемые функции включают передачу HTTP заголовки, управляющие требованием проверки SSL и использующие основное имя пользователя/пароль auth.