Vagrant 从清单脚本安装puppet模块

Vagrant 从清单脚本安装puppet模块,vagrant,puppet,Vagrant,Puppet,我正在使用puppet提供一个流浪者(基于ubuntu)虚拟机。 在我的脚本中,我需要: sudo apt-get build-dep python-lxml 我知道我可以安装apt,因此我可以使用: apt::builddep { 'python-lxml': } 但是我在脚本中找不到关于安装模块以及如何包含/要求模块的任何参考资料。在我看来,傀儡文档只是指 我还试着做一些类似的事情: define build_dep($pkgname){ exec { "builddep

我正在使用puppet提供一个流浪者(基于ubuntu)虚拟机。 在我的脚本中,我需要:

sudo apt-get build-dep python-lxml
我知道我可以安装
apt
,因此我可以使用:

apt::builddep { 'python-lxml': }
但是我在脚本中找不到关于安装模块以及如何包含/要求模块的任何参考资料。在我看来,傀儡文档只是指

我还试着做一些类似的事情:

define build_dep($pkgname){
    exec {
    "builddepend_$pkgname":
    commmand => "sudo apt-get build-dep $pkgname";
    }
}
build_dep{
    "python-imaging":
    pkgname => "python-imaging";

    "python-lxml":
    pkgname => "python-lxml";
}
但傀儡在这方面出了差错。而且:

exec{"install apt module":

    command => "puppet module install puppetlabs/apt"
}

class { 'apt':
        require => Exec["install apt module"]}
include apt

apt::builddep { 'python-imaging':
 }
但是Get
在..

有什么想法吗?方向?我知道我漏掉了一些明显的东西,但我想不出来


编辑:如果我预先安装(使用命令行中的
puppet模块安装
),则
apt:builddep
工作正常但我需要puppet来处理模块下载和安装。其他一些解决方法也适用于基本用例,但不会回答我的主要问题。

您可以为模块创建一个目录,并添加从forge下载的
apt
模块。因此,它将是
modules/apt/*
。然后您可以在
Vagrantfile
中指定此模块目录(
module_path
是相对于
Vagrantfile
):


有关更多信息,请参阅。

我也遇到了这个问题。诀窍是在puppet provisioner运行之前,使用vagrant shell命令下载模块

config.vm.provision :shell do |shell|
  shell.inline = "mkdir -p /etc/puppet/modules;
                  puppet module install puppetlabs/nodejs;
                  puppet module install puppetlabs/apache"
end

config.vm.provision :puppet do |puppet|
  puppet.manifests_path = "puppet/manifests"
  puppet.manifest_file = "site.pp"
end
顺序在这里很重要,因为puppet Provisionier尚未运行/etc/puppet/modules文件夹,所以还不存在


与alonisser一样,我决定使用puppet模块工具安装模块,而不是使用带有vagrant puppet provisioner的模块文件夹,原因是我不想下载要使用的模块的所有依赖项,并将所有这些模块存储在源代码管理中。运行这两个命令会产生5个依赖项,否则这些依赖项会占用我的git存储库的空间。

我使用一种类似于@brain_bacon的方法-我遇到的另一个复杂问题是,除了预打包的模块(如puppetlabs/nodejs),我还需要与我的文件相关的本地模块。我不想将预打包的模块作为存储库的一部分签入,也不想使用git子模块,因为@Igor Popov指出了一些问题

最后,我选择的解决方案是使用一个shell脚本下载模块,但将它们的路径强制到Vagrant VM和主机之间的共享目录中,并使用.gitignore避免该路径受源代码控制

要清楚,使用此树:

jcmendez$ tree
.
├── README.md
├── Vagrantfile
├── files
├── puppet
│   ├── manifests
│   │   └── init.pp
│   └── modules
│       ├── misc
│       │   └── manifests
│       │       └── init.pp
│       ├── mysql
   ...
│       └── wordpress
│           ├── files
│           │   ├── wordpress-db.sql
│           │   ├── wp-config.php
│           │   └── wp-tests-config.php
│           └── manifests
│               └── init.pp
└── wordpress
.gitignore
上,我添加了

  /puppet/modules/mysql
vagrant文件上

  config.vm.provision :shell do |shell|
    shell.inline = "puppet module install puppetlabs/mysql --force --modulepath '/vagrant/puppet/modules'"
  end

  config.vm.provision :puppet do |puppet|
    puppet.manifests_path = 'puppet/manifests'
    puppet.module_path = 'puppet/modules'
    puppet.manifest_file  = "init.pp"
    puppet.options="--verbose --debug"
  end

下面是我为使
puppet module install
命令最多运行一次所做的工作:

$script = <<EOF
mkdir -p /etc/puppet/modules
(puppet module list | grep puppetlabs-mysql) ||
   puppet module install -v 2.1.0 puppetlabs/mysql
EOF

Vagrant::Config.run do |config|
   config.vm.provision :shell, :inline => $script

$script=您可以在主机上的
vagrantdir
中安装puppet模块:

puppet module --modulepath=./puppet/modules/ install puppetlabs/mysql
Vagrant负责将此目录装载到正确的位置。
因此,除了在节点上运行puppet本身之外,无需运行其他脚本。

受wtanaka.com答案的启发,我实现了一个类似于下面的解决方案,我认为它更具可读性

1) 在与Vagrantfile相同的文件夹下创建一个名为“puppet_deps.rb”的新ruby文件,代码如下:

def install_dep(name, version, install_dir = nil)
    install_dir ||= '/etc/puppet/modules'
    "mkdir -p #{install_dir} && (puppet module list | grep #{name}) || puppet module install -v #{version} #{name}"
end
2) 在Vagrant文件中,您可以加载此ruby文件并使用它指定puppet依赖项:

# on top of your Vagrantfile
require './puppet_deps'
...
...
# in your vm definition, use a shell provisioning this:
config.vm.provision :shell, :inline => install_dep('puppetlabs-firewall', '1.1.3')
config.vm.provision :shell, :inline => install_dep('puppetlabs-stdlib', '4.3.2')

@brain_bacon的策略对我来说几乎是完美的,但有一个小小的警告——如果模块已经存在,那么配置脚本就会失败,从而停止配置过程。以下调整修复了此问题:

config.vm.provision :shell, :run => "always" do |shell|
  shell.inline = %{
    mkdir -p /etc/puppet/modules;
    function install_module {
      folder=`echo $1 | sed s/.*-//`
      if [ ! -d /etc/puppet/modules/$folder ]; then
        puppet module install $1
      fi
    }
    install_module stdlib
    install_module apt
    install_module ruby
  }
end

使用这个问题的答案,我创建了这个脚本:

#!/bin/bash

function install_module {
   IFS=':' read module version <<< "$1"
   if (puppet module list | grep $module ) >/dev/null; then
    echo "Module $module is already installed"
   else
        if [ -z "$version" ]; then
            puppet module install $module
        else 
        puppet module install -v $version $module
    fi
    fi  
}

if dpkg --compare-versions `puppet --version` "lt" 3.8.7; then
    sudo apt-get remove --purge -y puppet
    sudo apt-get -y autoremove
fi

if which puppet >/dev/null; then
    echo "Puppet is already installed"
else
    echo "Installing puppet"
    wget https://apt.puppetlabs.com/puppetlabs-release-trusty.deb
    sudo dpkg -i puppetlabs-release-trusty.deb
    sudo apt-get update
    sudo apt-get install -y puppet=3.8.7*
    mkdir -p /etc/puppet/modules
fi

for var in "$@" 
do
    install_module "$var"
done
如果版本低于
3.8.7
,它将从vm中删除puppet,然后安装
puppet 3.8.7
,然后安装所有模块


它可能只在debian/ubuntu设备上工作。

这并不能回答如何从脚本中自动下载和安装模块,而无需预下载等问题。为什么要这样做?傀儡脚本通常包含在流浪设置中。它们以后甚至不会出现在你的虚拟机上(至少不会使用默认的puppet配置)。我接受了答案,因为它似乎可以(部分)工作,而且它与我所走的道路相似。试图微调木偶的执行顺序已经让我吃了太多的苦头。实际上,我使用了
git子模块更新--init
来处理(预定义)模块依赖关系。并在同一虚拟机上再次运行资源调配步骤之前,它将一直工作。。。然后它会失败:“Module which is ready installed”。--force不会安装依赖模块,尽管我通过使用true包装shell命令绕过了多次设置,例如
(puppet Module install puppetlabs/apache;true)
但是如果模块由于其他原因无法安装,这可能会产生意外的后果。为了避免第二个规定上的错误或使用
--force
的必要性,您可以执行类似
(puppet模块列表| grep puppetlabs nodejs)|(mkdir-p/etc/puppet/modules;puppet模块安装puppetlabs/nodejs)的操作
(抱歉,评论中没有回车符)我按照您的方式(除了我正在尝试puppetlab apache安装):内联shell安装,并在/tmp/vagrant获得了“未知函数验证”。当其中一个依赖项未安装时显示。您是如何安装apache的?@DiH-您是对的,请确保通读每个包的所有依赖项,因为不满足依赖项时出现的错误消息有点神秘。但是我没有安装apache2。。。我们的设置中有nginx。不是真的。简单复制模块可能会给您带来麻烦:。我也面临着同样的问题,这有点不确定。有时发生,有时不发生。但是引用的链接表示“只是复制模块”是它的根c
#!/bin/bash

function install_module {
   IFS=':' read module version <<< "$1"
   if (puppet module list | grep $module ) >/dev/null; then
    echo "Module $module is already installed"
   else
        if [ -z "$version" ]; then
            puppet module install $module
        else 
        puppet module install -v $version $module
    fi
    fi  
}

if dpkg --compare-versions `puppet --version` "lt" 3.8.7; then
    sudo apt-get remove --purge -y puppet
    sudo apt-get -y autoremove
fi

if which puppet >/dev/null; then
    echo "Puppet is already installed"
else
    echo "Installing puppet"
    wget https://apt.puppetlabs.com/puppetlabs-release-trusty.deb
    sudo dpkg -i puppetlabs-release-trusty.deb
    sudo apt-get update
    sudo apt-get install -y puppet=3.8.7*
    mkdir -p /etc/puppet/modules
fi

for var in "$@" 
do
    install_module "$var"
done
puppet_modules = [
    'puppetlabs-stdlib:4.16.0',
    'puppetlabs-apt:2.3.0',
    'puppet-nodejs:2.3.0'
    ]

config.vm.provision "shell", path: "puppet/scripts/puppet.sh", args: puppet_modules.join(" ")