How/where 为 Vagrant shell 提供者提供 sudo 密码?

How/where to provide sudo password for Vagrant shell provisioners?

我正在尝试构建一个将由 install.sh shell 脚本提供的 Vagrant box (CentOS)。这个脚本将做几件事,第一件事是在 /opt 下创建正确的目录结构,以便我的服务可以安装在那里并做其他事情,比如在那里写日志。

所以我的 Vagrant 项目(到目前为止)包括:

my-app-vagrant/
    Vagrantfile
    install.sh

其中 install.sh 看起来像:

mkdir /opt/myapp
mkdir /opt/myapp/bin        # Where we will install binary to (later in this script)
mkdir /opt/myapp/logs       # Where the binary will write logs to

现在二进制 不需要 需要提升权限才能 运行 (它是通过命令行参数配置的,将日志写入到哪里)。然而,我只是 想要 它以上述目录结构存在于 /opt 下,至少对于这台特定的机器。

问题是 /optroot 所有。这意味着我需要 运行 这些 mkdirssudo,为脚本提供 sudo 的密码,然后调整目录权限,以便当应用 运行 s,它有权 运行 并将日志写入我的预期目的地(同样,是 /opt/myapp/logs)。所以我将 install.sh 调整为如下所示:

mkdir /opt/myapp
mkdir /opt/myapp/bin
mkdir /opt/myapp/logs

chmod -R 777 /opt/myapp     # Now when the app runs as a normal non-privileged user, we can run + write logs

而且我知道我可以通过 echo <rootPswd> | sudo -S sh install.sh 为脚本提供密码(其中 <rootPswd> 是正确的 root 密码)。

现在我想弄清楚如何在 Vagrant 配置 VM 时正确地获得这个 running/working

我的 Vagrant 文件如下所示:

Vagrant.configure(2) do |config|
    config.vm.provision "shell", path: "install.sh"

    config.vm.box = "centos7"
    config.vm.box_url = "https://github.com/tommy-muehle/puppet-vagrant-boxes/releases/download/1.1.0/centos-7.0-x86_64.box"

    config.vm.network "private_network", ip: "10.0.1.2"

    config.vm.provider "virtualbox" do |vb|
        vb.memory = "2048"
    end
end

但我坚持的是:如何将整个“echo <rootPswd> | sudo -S sh install.sh”概念扩展到 Vagrant?根据他们的文档,我可能可以使用 privileged 选项,但无论如何默认设置为 true

但是在他们的文档中没有任何地方解释 how/where 以提供应该使用的 sudo 密码(至少从目前为止我能找到的)。

所以我问:

事实证明(对于几乎 所有 Vagrant boxes) vagrant 用户在 /etc/sudoers 中列出,具有 ALL=(ALL) NOPASSWD:ALL 权限,它指示Linux 到 永远不会 向该用户询问 "sudo password"。

因此,您无需为 privileged 用户提供 sudo 密码。

虽然直到今天 smeeb 的回答都是如此,但它并没有完全回答问题。根据您使用的供应商,确实有不同的方法可以做到这一点。例如,在 Ansible 中,您可以使用 ask_become_pass 来事先询问密码。

使用 shell 配置器,除了 Ansible 提供的那些之外,您将没有任何助手。如果特权不为你做,那么你可能需要手动 sudo。

为此,您可以使用以下方法:

echo "mypassword" | sudo -S command

不过请注意,在一次性使用的情况下执行此操作意味着您将在该密码的历史记录中留下痕迹。