Подтвердить что ты не робот

Установка марионеточного модуля из манифеста script

Я использую марионетку для создания виртуальной машины с бродягой (ubuntu). В моем script мне нужно:

sudo apt-get build-dep python-lxml

Я знаю, что могу установить apt кукольный модуль, чтобы я мог использовать:

apt::builddep { 'python-lxml': }

Но я не могу найти ссылку на установку модуля из script и как включить/потребовать его. Мне кажется, что марионеточные документы относятся только к установке из кукольного инструмента командной строки

Я также попытался сделать что-то вроде:

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

но получил could not find declared class apt at..

любые идеи? направления? Я знаю, что мне не хватает чего-то очевидного, но не могу понять это.

EDIT: Если я предварительно устанавливаю (с puppet module install из командной строки), apt:builddep работает отлично. Но мне нужна марионетка для загрузки и установки модуля. Некоторые из других работ также работают для основного варианта использования, но не будут отвечать на мой главный вопрос.

4b9b3361

Ответ 1

Я столкнулся с этой проблемой. Трюк заключается в загрузке модулей с использованием команды бродячих оболочек перед запуском марионеточного устройства.

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

Порядок здесь важен, и поскольку марионетка не запускает папку /etc/puppet/modules еще не существует.

Причина, по которой я решил, как alonisser, установить модули, используя инструмент марионеточного модуля, вместо того, чтобы использовать папку с модулем с бродячим марионеточным средством, состояла в том, что я не хотел загружать все зависимости модулей я собирался использовать и хранить все эти модули в моем исходном контроле. Запуск этих двух команд приводит к 5 зависимостям, которые в противном случае могли бы находиться в моем хранилище git, занимающем место.

Ответ 2

Вот что я сделал, чтобы команда 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

Ответ 3

Я использую подход, похожий на @brain_bacon - дополнительное осложнение, которое у меня было, заключается в том, что помимо предварительно упакованных модулей, таких как puppetlabs/nodejs, мне нужны были локальные модули относительно моего Vagrantfile. Я не хотел проверять предварительно упакованные модули как часть моего репозитория и не использовать подмодули git из-за проблем, отмеченных @Igor Popov.

Наконец, решение, которое я выбрал, состояло в том, чтобы использовать оболочку script для загрузки модулей, но заставляя их путь в общий каталог между 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

В Vagrantfile

  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

Ответ 4

Вы можете установить кукольные модули на главной машине в vagrantdir:

puppet module --modulepath=./puppet/modules/ install puppetlabs/mysql

Вагрант заботится о том, чтобы установить эту директорию в нужное место. Таким образом, нет необходимости запускать скрипты, отличные от куклы на node.

Ответ 5

Вдохновленный ответом wtanaka.com, я реализовал решение, подобное ниже, которое, по моему мнению, более читаемо.

1) создайте новый рубиновый файл под названием 'puppet_deps.rb' в той же папке, что и Vagrantfile, с кодом, как показано ниже:

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) В вашем Vagrantfile вы можете загрузить этот рубиновый файл и использовать его для указания марионеточной зависимости:

# 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')

Ответ 6

Вы можете создать каталог для модулей и добавить модуль apt, который вы загрузили из кузницы. Это будет modules/apt/*. Затем вы можете указать этот каталог модуля в Vagrantfile (module_path относительно Vagrantfile):

Vagrant.configure("2") do |config|
  config.vm.provision :puppet do |puppet|
    puppet.module_path = "modules"
  end
end

Для получения дополнительной информации см. документацию .

Ответ 7

Стратегия

@brain_bacon работала почти идеально для меня, с одним небольшим предостережением - если модуль уже существует, то инициализация script завершается с ошибкой, останавливая процесс подготовки. Следующая настройка зафиксировала это:

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

Ответ 8

Используя ответы на этот вопрос, я создал этот script:

#!/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 "[email protected]" 
do
    install_module "$var"
done

Затем вы можете использовать его из своего Vagrantfile следующим образом:

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(" ")

Удаляет куклу из vm, если версия меньше, чем 3.8.7, затем устанавливает puppet 3.8.7, а затем устанавливает все модули.

Вероятно, он работает только в блоках debian/ubuntu.