Packer.io не работает при использовании средства подготовки марионеток: / usr / bin / puppet: строка 3: rvm: команда не найдена

Я пытаюсь создать файл коробки Vagrant, используя Packer.io и Puppet. У меня есть этот шаблон в качестве отправной точки: https://github.com/puphpet/packer-templates/tree/master/centos-7-x86_64.

Я добавил инициатор Puppet после инициатора оболочки:

        {
            "type": "puppet-masterless",
            "manifest_file": "../../puphpet/puppet/site.pp",
            "manifest_dir": "../../puphpet/puppet/nodes",
            "module_paths": [
                "../../puphpet/puppet/modules"
            ],
            "override": {
                "virtualbox-iso": {
                    "execute_command": "echo 'vagrant' | {{.FacterVars}}{{if .Sudo}} sudo -S -E bash {{end}}/usr/bin/puppet apply --verbose --modulepath='{{.ModulePath}}' {{if ne .HieraConfigPath \"\"}}--hiera_config='{{.HieraConfigPath}}' {{end}} {{if ne .ManifestDir \"\"}}--manifestdir='{{.ManifestDir}}' {{end}} --detailed-exitcodes {{.ManifestFile}}"
                }
            }
        }

Когда я начинаю строить образ, как

packer-io build -only = virtualbox-iso template.json

Затем я получаю такую ​​ошибку:

==> virtualbox-iso: Provisioning with Puppet...
    virtualbox-iso: Creating Puppet staging directory...
    virtualbox-iso: Uploading manifest directory from: ../../puphpet/puppet/nodes
    virtualbox-iso: Uploading local modules from: ../../puphpet/puppet/modules
    virtualbox-iso: Uploading manifests...
    virtualbox-iso:
    virtualbox-iso: Running Puppet: echo 'vagrant' |  sudo -S -E bash /usr/bin/puppet apply --verbose --modulepath='/tmp/packer-puppet-masterless/module-0'  --manifestdir='/tmp/packer-puppet-masterless/manifests'  --detailed-exitcodes /tmp/packer-puppet-masterless/manifests/site.pp
    virtualbox-iso: /usr/bin/puppet: line 3: rvm: command not found
==> virtualbox-iso: Unregistering and deleting virtual machine...
==> virtualbox-iso: Deleting output directory...
Build 'virtualbox-iso' errored: Puppet exited with a non-zero exit status: 127

Если я вхожу в систему через tty, я могу запускать команды rvm и puppet как бродячий пользователь. Что я сделал не так?


person medve    schedule 14.03.2015    source источник


Ответы (2)


Я пробую тот же маршрут, что и вы:

  1. Используйте соответствующие сценарии для подготовки виртуальной машины из этого репозитория.
  2. Используйте сценарии puppet из конфигурации puphpet.com для дальнейшей подготовки виртуальная машина, использующая провионер без хозяина марионеток в упаковщике.

Все еще работаю над этим, пока не удачная сборка, но я могу поделиться следующим:

  • Осмотрите строку 50 от puphpet/shell/install-puppet.sh. Таким образом, команда puppet инициирует выполнение rvm.
  • Проверяйте выходные данные вашего упаковщика во время подготовки. Вы прочитали что-то вроде:

    ...
    Creating alias default for ruby-1.9.3-p551
    
    To start using RVM you need to run `source /usr/local/rvm/scripts/rvm` in all
    your open shell windows, in rare cases you need to reopen all shell windows.
    Cleaning up rvm archives
    ....
    
  • Очевидно, команда source /usr/local/rvm/scripts/rvm нужна каждому пользователю, которому нужно запустить rvm. Он запускается и настраивается на профили bash в скрипте puphpet/shell/install-ruby.sh. Однако это, похоже, не влияет на контекст / область действия Puppet Masterless Provisioning execute_command упаковщика. Причина появления строки /usr/bin/puppet: line 3: rvm: command not found в вашем выводе.

  • Мой текущий путь вперед - это следующая конфигурация в template.json (шаблон упаковщика), вторая и третья строки помогут выйти за пределы точки, в которой вы застряли в данный момент:

    {
        "type": "puppet-masterless",
        "prevent_sudo": true,
        "execute_command": "{{if .Sudo}}sudo -E {{end}}bash -c \"source /usr/local/rvm/scripts/rvm; {{.FacterVars}} puppet apply --verbose --parser future --modulepath='{{.ModulePath}}' {{if ne .HieraConfigPath \"\"}}--hiera_config='{{.HieraConfigPath}}' {{end}} {{if ne .ManifestDir \"\"}}--manifestdir='{{.ManifestDir}}' {{end}} --detailed-exitcodes {{.ManifestFile}}\"",
        "manifest_file": "./puphpet/puppet/site.pp",
        "manifest_dir": "./puphpet/puppet",
        "hiera_config_path": "./puphpet/puppet/hiera.yaml",
        "module_paths": [
            "./puphpet/puppet/modules"
        ],
        "facter": {
            "ssh_username": "vagrant",
            "provisioner_type": "virtualbox",
            "vm_target_key": "vagrantfile-local"
        }
    },
    

Обратите внимание на следующее:

  1. Вероятно, запуск марионетки как бродячий пользователь не завершит подготовку из-за проблем с разрешениями. В этом случае нам нужен способ запустить source /usr/local/rvm/scripts/rvm в sudo и повлиять на область действия команды подготовки марионетки.
  2. Сценарии вывода puphpet.com /vagrant/puphpet жестко запрограммированы в сценариях марионеток (например, puphpet/puppet/nodes/Apache.pp первая строка). Таким образом, вам может потребоваться инициализация файла упаковщика для вашей виртуальной машины перед выполнением марионетки без мастера, чтобы она могла найти зависимости в /vagrant/.... Моя packer.json conf для этого:

    {
        "type": "shell",
        "execute_command": "sudo bash '{{.Path}}'",
        "inline": [
            "mkdir /vagrant",
            "chown -R vagrant:vagrant /vagrant"
         ]
    },
    {
        "type": "file",
        "source": "./puphpet",
        "destination": "/vagrant"
    },
    
  3. Puppet потребуются некоторые переменные Facter, как ожидается в сценариях puphpet/puppet/nodes/*.pp. Обратитесь к моему template.json выше.

Как сказано. На моей стороне пока нет успеха в полной подготовке марионеток, но вышеперечисленное вывело меня за пределы той точки, в которой вы застряли в данный момент. Надеюсь, это поможет.


Обновление:

Я заменил свою старую команду выполнения для средства подготовки марионеток

"execute_command": "source /usr/local/rvm/scripts/rvm && {{.FacterVars}}{{if .Sudo}} sudo -E{{end}} puppet apply --verbose --parser future --modulepath='{{.ModulePath}}' {{if ne .HieraConfigPath \"\"}}--hiera_config='{{.HieraConfigPath}}' {{end}} {{if ne .ManifestDir \"\"}}--manifestdir='{{.ManifestDir}}' {{end}} --detailed-exitcodes {{.ManifestFile}}"

с новым

"execute_command": "{{if .Sudo}}sudo -E {{end}}bash -c \"source /usr/local/rvm/scripts/rvm; {{.FacterVars}} puppet apply --verbose --parser future --modulepath='{{.ModulePath}}' {{if ne .HieraConfigPath \"\"}}--hiera_config='{{.HieraConfigPath}}' {{end}} {{if ne .ManifestDir \"\"}}--manifestdir='{{.ManifestDir}}' {{end}} --detailed-exitcodes {{.ManifestFile}}\""

Это гарантирует, что марионетка (rvm) будет запущена от имени пользователя root и успешно завершит подготовку.

person mkd    schedule 25.03.2015
comment
Согласовано. sudo -i мог бы быть более элегантным. Обратитесь к man sudo и sudoers раздел командной строки. Все еще нужно это проверить. - person mkd; 26.03.2015
comment
Это может подойти вам больше, просто убедитесь, что FacterVars находятся внутри sudo, а не раньше: "execute_command": "{{if .Sudo}}sudo -i {{end}}{{.FacterVars}} puppet apply --verbose --parser future --modulepath='{{.ModulePath}}' {{if ne .HieraConfigPath \"\"}}--hiera_config='{{.HieraConfigPath}}' {{end}} {{if ne .ManifestDir \"\"}}--manifestdir='{{.ManifestDir}}' {{end}} --detailed-exitcodes {{.ManifestFile}}" - person mkd; 26.03.2015

В качестве альтернативы другому моему ответу я настоящим предоставляю свои шаги и конфигурацию, чтобы этот сценарий подготовки работал с packer & puphpet.

Предполагая, что имеется следующее:

  • ./: локальный каталог, действующий как ваш собственный репозиторий,
  • ./ops/: каталог ops, внутри которого хранятся сценарии упаковщика и необходимые файлы.
  • ./ops/template.json: шаблон упаковщика, используемый для создания виртуальной машины.
  • ./ops/template.json expects the following is in place:
    • ./ops/packer-templates/: a clone of this repo
    • ./ops/ubuntu-14.04.2-server-amd64.iso: iso для ubuntu, который вы хотите запустить на своей виртуальной машине
    • ./puphpet: результат выполнения шагов настройки на puphpet.com (так что это на один уровень выше, чем ops)

Содержимое template.json:

{
    "variables": {
        "ssh_name": "vagrant",
        "ssh_pass": "vagrant",
        "local_packer_templates_dir": "./packer-templates/ubuntu-14.04-x86_64",
        "local_puphput_dir": "../puphpet",
        "local_repo_dir": "../",
        "repo_upload_dir": "/vagrant"
    },
    "builders": [
        {
            "name": "ubuntu-14.04.amd64.virtualbox",
            "type": "virtualbox-iso",
            "headless": false,
            "boot_command": [
                "<esc><esc><enter><wait>",
                "/install/vmlinuz noapic preseed/url=http://{{ .HTTPIP }}:{{ .HTTPPort }}/preseed.cfg ",
                "debian-installer=en_US auto locale=en_US kbd-chooser/method=us ",
                "hostname={{ .Name }} ",
                "fb=false debconf/frontend=noninteractive ",
                "keyboard-configuration/modelcode=SKIP keyboard-configuration/layout=USA keyboard-configuration/variant=USA console-setup/ask_detect=false ",
                "initrd=/install/initrd.gz -- <enter>"
            ],
            "boot_wait": "10s",
            "disk_size": 20480,
            "guest_os_type": "Ubuntu_64",
            "http_directory": "{{user `local_packer_templates_dir`}}/http",
            "iso_checksum": "83aabd8dcf1e8f469f3c72fff2375195",
            "iso_checksum_type": "md5",
            "iso_url": "./ubuntu-14.04.2-server-amd64.iso",
            "ssh_username": "{{user `ssh_name`}}",
            "ssh_password": "{{user `ssh_pass`}}",
            "ssh_port": 22,
            "ssh_wait_timeout": "10000s",
            "shutdown_command": "echo '/sbin/halt -h -p' > shutdown.sh; echo '{{user `ssh_pass`}}'|sudo -S bash 'shutdown.sh'",
            "guest_additions_path": "VBoxGuestAdditions_{{.Version}}.iso",
            "virtualbox_version_file": ".vbox_version",
            "vboxmanage": [
                ["modifyvm", "{{.Name}}", "--memory", "2048"],
                ["modifyvm", "{{.Name}}", "--cpus", "4"]
            ]
        }
    ],
    "provisioners": [
        {
            "type": "shell",
            "execute_command": "echo '{{user `ssh_pass`}}'|sudo -S bash '{{.Path}}'",
            "scripts": [
                "{{user `local_packer_templates_dir`}}/scripts/base.sh",
                "{{user `local_packer_templates_dir`}}/scripts/virtualbox.sh",
                "{{user `local_packer_templates_dir`}}/scripts/vagrant.sh",
                "{{user `local_packer_templates_dir`}}/scripts/puphpet.sh",
                "{{user `local_packer_templates_dir`}}/scripts/cleanup.sh",
                "{{user `local_packer_templates_dir`}}/scripts/zerodisk.sh"
            ]
        },
        {
            "type": "shell",
            "execute_command": "sudo bash '{{.Path}}'",
            "inline": [
                "mkdir {{user `repo_upload_dir`}}",
                "chown -R vagrant:vagrant {{user `repo_upload_dir`}}"
             ]
        },
        {
            "type": "file",
            "source": "{{user `local_repo_dir`}}",
            "destination": "{{user `repo_upload_dir`}}"
        },
        {
            "type": "shell",
            "execute_command": "sudo bash '{{.Path}}'",
            "inline": [
                "rm -fR {{user `repo_upload_dir`}}/.vagrant",
                "rm -fR {{user `repo_upload_dir`}}/ops"
             ]
        },
        {
            "type": "puppet-masterless",
            "execute_command": "{{if .Sudo}}sudo -E {{end}}bash -c \"source /usr/local/rvm/scripts/rvm; {{.FacterVars}} puppet apply --verbose --parser future --modulepath='{{.ModulePath}}' {{if ne .HieraConfigPath \"\"}}--hiera_config='{{.HieraConfigPath}}' {{end}} {{if ne .ManifestDir \"\"}}--manifestdir='{{.ManifestDir}}' {{end}} --detailed-exitcodes {{.ManifestFile}}\"",
            "manifest_file": "{{user `local_puphput_dir`}}/puppet/site.pp",
            "manifest_dir": "{{user `local_puphput_dir`}}/puppet",
            "hiera_config_path": "{{user `local_puphput_dir`}}/puppet/hiera.yaml",
            "module_paths": [
                "{{user `local_puphput_dir`}}/puppet/modules"
            ],
            "facter": {
                "ssh_username": "{{user `ssh_name`}}",
                "provisioner_type": "virtualbox",
                "vm_target_key": "vagrantfile-local"
            }
        },
        {
            "type": "shell",
            "execute_command": "sudo bash '{{.Path}}'",
            "inline": [
                 "echo '{{user `repo_upload_dir`}}/puphpet' > '/.puphpet-stuff/vagrant-core-folder.txt'",
                 "sudo bash {{user `repo_upload_dir`}}/puphpet/shell/important-notices.sh"
             ]
        }
    ],
    "post-processors": [
        {
          "type": "vagrant",
          "output": "./build/{{.BuildName}}.box",
          "compression_level": 9
        }
    ]
}

Повествование о том, что происходит:

  • выполнить базовую подготовку виртуальной машины, используя сценарии, которые используются для создания блоков puphpet (первый блок подготовки оболочки)
  • создать каталог /vagrant на виртуальной машине и установить разрешения для пользователя vagrant
  • загрузить локальный репозиторий в /vagrant (важно, поскольку puphpet / puppet ожидает, что он будет существовать в этом месте в своих скриптах)
  • удалите ненужный материал из /vagrant после загрузки
  • запустить средство подготовки марионеток с настраиваемой конфигурацией execute_command и facter
  • обработать оставшиеся сценарии подготовки. Чтобы быть расширенным с помощью exec once / always, запускайте файлы once / always

Примечание. вам может потребоваться подготовить еще кое-что, прежде чем запускается инициатор марионеток. Например. Мне нужен каталог, который будет корневым каталогом виртуального хоста в apache. Используйте подготовку оболочки, чтобы заполнить шаблон для вашей собственной конфигурации puphpet.

person mkd    schedule 26.03.2015