我的打包器中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
所示
答案 0 :(得分:3)
您应该覆盖execute_command。例如:
"provisioners": [
{
"execute_command": "echo 'vagrant' | {{.Vars}} sudo -S -E sh -eux '{{.Path}}'",
"scripts": [
"scripts/foo.sh"
],
"type": "shell"
}
],
答案 1 :(得分:0)
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