web-dev-qa-db-ja.com

PackerはShellプロビジョナーをsudoとして実行できません

ユーザーvagrantのボックスに接続されたパッカーにShell provisionerがあります

{
  "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で示されるようにユーザーをグローバルに切り替えることに注意してください。

6
Georg Heiler

execute_command をオーバーライドする必要があります。例:

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

考えられる答えの1つは次のようです: 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

多分もっと良い答えがありますか?

1
Georg Heiler

使用しているシェルプロビジョナーが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 "$@"

"$@"ここではStackOverflow についてはかなり良い説明があります。

0
Bruno Bronosky