ユーザー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
で示されるようにユーザーをグローバルに切り替えることに注意してください。
execute_command をオーバーライドする必要があります。例:
"provisioners": [
{
"execute_command": "echo 'vagrant' | {{.Vars}} Sudo -S -E sh -eux '{{.Path}}'",
"scripts": [
"scripts/foo.sh"
],
"type": "Shell"
}
],
考えられる答えの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
多分もっと良い答えがありますか?
使用しているシェルプロビジョナーが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 についてはかなり良い説明があります。