Arhn - архитектура программирования

Установка модуля puppet из скрипта манифеста

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

sudo apt-get build-dep python-lxml

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

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

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

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

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";
}

Но puppet завершил работу с ошибкой. А также:

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

06.07.2013

Ответы:


1

Я тоже столкнулся с этой проблемой. Хитрость заключается в том, чтобы загрузить модули с помощью команды vagrant shell до запуска puppet Provisioner.

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 еще не запущено, папка /etc/puppet/modules еще не существует.

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

25.07.2013
  • Принял ответ, так как он работает (частично) и похож на путь, по которому я пошел. попытка точно настроить порядок выполнения марионеток укусила меня слишком много раз. На самом деле я использовал git submodule update --init для обработки (предопределения) зависимостей модулей. и запустите его предварительно puppet\vagrant 25.07.2013
  • Это работает до тех пор, пока вы снова не запустите этап подготовки на той же виртуальной машине... затем произойдет сбой с: Модуль, который уже установлен. 30.11.2013
  • Возможно, если вы используете параметр --force, как этот модуль puppet, установите --force puppetlabs/apache... Не должно произойти сбоя, но он переустановит модуль. Как указано в документе: используйте параметр --force для принудительной переустановки существующего модуля. См.: docs.puppetlabs.com/puppet/2.7/reference/ 30.12.2013
  • --force не будет устанавливать зависимые модули 02.01.2014
  • Мне удалось обойти множественную подготовку, заключив команду оболочки в значение true, например. (puppet module install puppetlabs/apache; true), но это может привести к непредвиденным последствиям, если модуль не установится по другим причинам. 10.02.2014
  • Ну, по крайней мере, в оболочку по-прежнему выводятся предупреждения, если установка модуля не удалась - пока это приемлемо для меня. 08.03.2014
  • чтобы избежать ошибки во втором положении или необходимости использовать --force, вы можете выполнить что-то вроде (puppet module list |grep puppetlabs-nodejs ) || (mkdir -p /etc/puppet/modules; puppet module install puppetlabs/nodejs) (в комментариях нет возврата каретки, извините) 06.04.2014
  • Кукольный код в бродяге живет на хосте, а не на виртуальной машине. Попытка установить на виртуальную машину является корнем проблемы. Просто сохраните модули кузницы вместе с любым пользовательским кодом марионетки. Используйте puppet на хосте, используйте puppet на госте и скопируйте модули через /vagrant или просто вручную загрузите на хост (убедившись, что вы также загружаете все зависимости). 03.11.2014
  • puppet module install puppetlabs-stdlib 2> /dev/null || /bin/true помог мне обойти сообщения об ошибках и сбои подготовки 28.09.2015
  • @SeanBurlington Хотел бы я последовать этому совету, но, боже мой, установка марионетки страшна. Проходя через загрузку марионетки с открытым исходным кодом, я чувствую, что отказываюсь от своего первенца, а затем мне нужно установить кукольный сервер, и, о, но сначала я должен включить обновления пакетов, и, боже мой, просто остановите это, пожалуйста. 23.04.2018

  • 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
    
    14.02.2014

    3

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

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

    On 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
    
    14.01.2014
  • Я последовал вашему пути (за исключением того, что я пытаюсь установить puppetlab-apache): установка встроенной оболочки и получение неизвестной функции validate_bool в /tmp/vagrant. Который появляется, когда одна из зависимостей не установлена. Как вы подошли к установке apache? 14.01.2014
  • @DiH - вы правы, обязательно прочитайте все зависимости для каждого из пакетов, потому что сообщения об ошибках, которые появляются, когда зависимости не выполняются, немного загадочны. Однако я не устанавливал apache2... у нас был nginx. 15.01.2014

  • 4

    Вы можете установить модули puppet на хост-компьютере в вашем vagrantdir:

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

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

    17.06.2014
  • Не совсем. Простое копирование модулей может вызвать проблемы: Unknown выберите функцию в /tmp/vagrant-puppet/modules-0/postgresql/manifests/params.pp:50. Я также сталкиваюсь с той же проблемой, и она несколько недетерминирована. Иногда бывает, иногда нет. Но в цитируемой ссылке говорится, что «просто копирование модулей» ЯВЛЯЕТСЯ его основной причиной. 12.09.2014

  • 5

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

    1) создайте новый файл ruby ​​с именем 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')
    
    29.07.2014

    6

    Стратегия @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
    
    12.11.2014

    7

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

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

    Дополнительные сведения см. в документации.

    07.07.2013
  • Это не отвечает на вопрос, как скачать и установить модуль автоматически из скрипта, без предварительной загрузки и т.д. 07.07.2013
  • Почему вы хотите это сделать? Сценарии марионеток обычно включаются в настройку vagrant. Позже они даже не будут доступны на вашей виртуальной машине (по крайней мере, не с конфигурацией марионетки по умолчанию). 09.07.2013

  • 8

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

    #!/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
    

    Затем вы можете использовать его из своего 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(" ")
    

    Он удаляет puppet из vm, если версия ниже 3.8.7, затем устанавливает puppet 3.8.7, а затем устанавливает все модули.

    Вероятно, это будет работать только на коробках Debian/Ubuntu.

    01.04.2017
    Новые материалы

    Коллекции публикаций по глубокому обучению
    Последние пару месяцев я создавал коллекции последних академических публикаций по различным подполям глубокого обучения в моем блоге https://amundtveit.com - эта публикация дает обзор 25..

    Представляем: Pepita
    Фреймворк JavaScript с открытым исходным кодом Я знаю, что недостатка в фреймворках JavaScript нет. Но я просто не мог остановиться. Я хотел написать что-то сам, со своими собственными..

    Советы по коду Laravel #2
    1-) Найти // You can specify the columns you need // in when you use the find method on a model User::find(‘id’, [‘email’,’name’]); // You can increment or decrement // a field in..

    Работа с временными рядами спутниковых изображений, часть 3 (аналитика данных)
    Анализ временных рядов спутниковых изображений для данных наблюдений за большой Землей (arXiv) Автор: Рольф Симоэс , Жильберто Камара , Жильберто Кейрос , Фелипе Соуза , Педро Р. Андраде ,..

    3 способа решить квадратное уравнение (3-й мой любимый) -
    1. Методом факторизации — 2. Используя квадратичную формулу — 3. Заполнив квадрат — Давайте поймем это, решив это простое уравнение: Мы пытаемся сделать LHS,..

    Создание VR-миров с A-Frame
    Виртуальная реальность (и дополненная реальность) стали главными модными терминами в образовательных технологиях. С недорогими VR-гарнитурами, такими как Google Cardboard , и использованием..

    Демистификация рекурсии
    КОДЕКС Демистификация рекурсии Упрощенная концепция ошеломляющей О чем весь этот шум? Рекурсия, кажется, единственная тема, от которой у каждого начинающего студента-информатика..