如何在 packer shell provisioner 中提供 sudo pwd

如何在 packer shell provisioner 中提供 sudo pwd

我想使用打包程序创建一个 AWS AMI。设置过程的一部分是运行构建脚本,该脚本将设置服务并为非 root 的系统用户 averagejoe 配置环境。设置脚本基本上如下所示:

# some cmds that need to be run by averagejoe
echo "alias ll='ls -Alfh'" > $HOME/.bashrc
# some cmds that need to be run by a privileged user
sudo firewall-cmd --zone=public --permanent --add-port=3389/tcp

因此,脚本的一部分应该以系统用户 averagejoe 的身份执行,另一部分应该使用 sudo 以特权用户的身份执行。因此,按照建议以特权用户身份运行整个脚本这里不是一个选择。

当脚本由打包程序配置程序执行时,如何提供 sudo 密码?我想到了一个三阶段方法,首先将 sudo 重新配置为不需要密码,然后运行安装脚本,然后将 sudo 重置为要求输入密码,但还有什么更优雅的方法吗?

答案1

我最终在执行安装脚本时关闭了 sudo 密码,如下所示:

    "provisioners": [
    {
        "type": "shell",
        "script": "project/packer/pwd_less_sudo.sh",
        "execute_command": "echo {{user `password`}} | sudo -S bash -c '{{ .Path }}'"
    },
    {
        "type": "shell",
        "script": "project/scripts/bootstrap.sh",
        "execute_command": "{{ .Path }}  --branch feature/ods-devenv"
    },
    {
        "type": "shell",
        "script": "project/packer/pwd_sudo.sh",
        "execute_command": "echo {{user `password`}} | sudo -S bash -c '{{ .Path }}'"
    }
]

其中 pwd_less_sudo.sh 是

#!/usr/bin/env bash
# make wheel pwd free
sudo sed -i '0,/%wheel[[:space:]]*ALL=(ALL)[[:space:]]*ALL/{s||%wheel        ALL=(ALL)       NOPASSWD: ALL|}' /etc/sudoers

并且 pwd_sudo.sh 是

#!/usr/bin/env bash
# give wheel their pwd back
sudo sed -i '0,/%wheel[[:space:]]*ALL=(ALL)[[:space:]]*NOPASSWD:[[:space:]]*ALL/{s||%wheel  ALL=(ALL)       ALL|}' /etc/sudoers

答案2

某些操作系统默认为非 root 用户。例如,如果您以 ubuntu 身份登录并且可以使用密码打包程序使用 sudo,则您需要将 execute_command 更改为:

"provisioners": [
  {
    "type": "shell",
    "exec_command": "echo 'your-password' | sudo -S [your-comand-here]"
  }       
]

-S 标志告诉 sudo 从 stdin 读取密码,在本例中,密码通过 packer 的值传输。

我发生这个错误是因为打包程序的这一部分:

"shutdown_command": "echo 'password-here' | sudo -S shutdown -P now",

我输入了错误密码的地方

相关内容