2

我正在尝试使用 Packer.io 和 Puppet 构建一个 Vagrant box 文件。我有这个模板作为起点: https ://github.com/puphpet/packer-templates/tree/master/centos-7-x86_64

我在 shell 配置器之后添加了 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 登录到该框,我可以以 vagrant 用户身份运行rvmpuppet命令。我做错了什么?

4

2 回答 2

2

我正在尝试与您完全相同的路线:

  1. 使用相关脚本从此repo配置 vm 。
  2. 使用 puphpet.com 配置中的puppet脚本,在 packer 中使用 puppet-masterless provier 进一步配置 vm。

仍在努力,尚未成功构建,但我可以分享以下内容:

  • 从 中检查第 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 配置 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. 由于权限问题,可能以 vagrant 用户身份运行 puppet 将无法完成配置。在这种情况下,我们需要一种source /usr/local/rvm/scripts/rvm在 sudo 中运行并影响 puppet 配置命令范围的方法。
  2. puphpet.com 输出脚本/vagrant/puphpet在他们的 puppet 脚本中进行了硬编码(例如puphpet/puppet/nodes/Apache.pp第一行)。因此,在执行 puppet masterless 之前,您可能需要为您的 vm 配置一个打包程序文件,以便它在/vagrant/.... 我packer.json对此的看法:

    {
        "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上面的。

正如所说。在我这一边,完整的 puppet 配置还没有成功,但上面的内容让我超出了你目前陷入困境的程度。希望能帮助到你。


更新:

我用 puppet provisioner 替换了旧的执行命令

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

这将确保 puppet (rvm) 以 root 身份运行并成功完成配置。

于 2015-03-25T12:09:06.113 回答
1

作为我其他答案的替代方案,我特此提供我的步骤和配置,以使此配置方案与 packer 和 puphpet 一起使用。

假设满足以下条件:

  • ./:作为您自己的存储库的本地目录
  • ./ops/:ops存放打包脚本和所需文件的目录
  • ./ops/template.json: 用于构建 VM 的打包程序模板
  • ./ops/template.json预计以下内容已到位:
    • ./ops/packer-templates/:这个 repo的一个克隆
    • ./ops/ubuntu-14.04.2-server-amd64.iso:你想在你的虚拟机中运行的 ubuntu 的 iso
    • ./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 框的脚本执行 VM 的基本配置(第一个 shell 配置程序块)
  • /vagrant在VM中创建一个目录并为vagrant用户设置权限
  • 将本地存储库上传到/vagrant(很重要,因为 puphpet/puppet 期望它存在于其脚本中的该位置)
  • /vagrant上传后删除一些不需要的东西
  • execute_command使用自定义和facter配置启动 puppet 供应商
  • 处理剩余的供应脚本。要使用 exec 一次/始终进行扩展,请启动一次/始终文件

注意:在 puppet provisioner 启动之前,您可能需要准备更多的东西。例如,我需要一个目录,它将成为 apache 中虚拟主机的 docroot。使用 shell 配置来完成您自己的 puphpet 配置的模板。

于 2015-03-26T07:25:23.413 回答