Packer无法以sudo身份执行shell配置程序

时间:2018-01-31 07:55:48

标签: shell root provisioning packer

我的打包器中shell provisioner已连接到具有用户vagrant

的框
{
  "environment_vars": [
    "HOME_DIR=/home/vagrant"
  ],
  "expect_disconnect": true,
  "scripts": [
    "scripts/foo.sh"
  ],
  "type": "shell"
}

脚本的内容是:

whoami
sudo su
whoami

并且输出奇怪地保留:

==> virtualbox-ovf: Provisioning with shell script: scripts/configureProxies.sh
    virtualbox-ovf: vagrant
    virtualbox-ovf: vagrant

为什么我无法切换到root用户? 如何以root身份执行语句? 请注意,我不想引用像sudo "statement |foo"这样的所有语句,而是全局切换用户,如sudo su所示

4 个答案:

答案 0 :(得分:3)

您应该覆盖execute_command。例如:

  "provisioners": [
    {
      "execute_command": "echo 'vagrant' | {{.Vars}} sudo -S -E sh -eux '{{.Path}}'",
      "scripts": [
        "scripts/foo.sh"
      ],
      "type": "shell"
    }
  ],

答案 1 :(得分:0)

一个可能的答案似乎是: https://unix.stackexchange.com/questions/70859/why-doesnt-sudo-su-in-a-shell-script-run-the-rest-of-the-script-as-root

sudo su <<HERE
ls /root
whoami
HERE

也许有更好的答案?

答案 2 :(得分:0)

假设您正在使用的shell配置程序是bash脚本,则可以将我的技术添加到脚本中。

function if_not_root_rerun_as_root(){
    install_self
    if [[ "$(id -u)" -ne 0 ]]; then
        run_as_root_keeping_exports "$0" "$@"
        exit $?
    fi
}

function run_as_root_keeping_exports(){
    eval sudo $(for x in $_EXPORTS; do printf '%s=%q ' "$x" "${!x}"; done;) "$@"
}

export EXPORTS="PACKER_BUILDER_TYPE PACKER_BUILD_NAME"
if_not_root_rerun_as_root "$@"

"$@" here on StackOverflow有一个很好的解释。

答案 3 :(得分:0)

还有另一种解决方案,将2个预配器一起使用更为简单。

Package的外壳提供程序可以使用index.php特权运行bash。首先,您需要使用sudo供应商将脚本文件从本地计算机复制到远程,然后使用file供应商运行它。

shell

packer.json

{ "vars": [...], "builders": [ { # ... "ssh_username": "<some_user_other_than_root_with_passwordless_sudo>", } ], "provisioners": [ { "type": "file", "source": "scripts/foo.sh", "destination": "~/shell.tmp.sh" }, { "type": "shell", "inline": ["sudo bash ~/shell.tmp.sh"] } ] }

foo.sh

# ... whoami sudo su root whoami # ...

output

预配器完成其任务后,您可以使用Shell Provisioner删除文件。

<some_user_other_than_root_with_passwordless_sudo> root 已更新

packer.json