33
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://我错过了什么吗?

或者如果没有,有没有办法先声明性地获取文件,然后将其用作本地源?

4

5 回答 5

48

在 Puppet 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',
}
于 2013-09-17T09:54:50.513 回答
14

当您引用 GitHub 存储库时,我将使用Puppetlabs vcsrepo 模块,这将带来额外的好处,即能够反馈更改或保持最新状态。您可以使用 Puppet Forge 安装模块

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/.

于 2013-09-17T09:41:43.750 回答
5

我喜欢 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 模块,对于从工件存储库中获取文件也很有用。

于 2015-12-03T23:35:30.207 回答
3

虽然 Puppet 4.4 和更新版本支持从 http 源检索基本文件,但内置支持非常非常基础。最好使用 Puppet Forge 中的实用程序类型来解决文件检索问题。

有几个选择。lwf/remote_file是一个可以在所有平台上运行的高质量的认可模块。这是作为原生 Puppet 类型实现的,而不是作为 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,
}

支持的其他功能包括传递控制 SSL 验证要求的 HTTP 标头,以及使用基本身份验证用户名/密码。

于 2018-04-25T16:18:01.330 回答
0

对于 Windows puppet 用户,您可以使用Powershell 模块和本机 PowershellInvoke-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'
}
于 2015-04-22T20:41:46.763 回答