当尝试使用 Puppet Bolt 在远程计算机上运行 Bash 脚本时,我总是遇到脚本无法正常工作的情况,因为它们没有接收到 Bolt 命令传递的参数。如果将脚本作为这样的任务运行:
bolt task run --targets localhost madeUpModule::scriptTakeInUserAndGroup user='testuser' group='testgroup'
No user or group defined
根据我为脚本定义的条件。
这一切都是在本地测试脚本并知道它可以处理参数之后完成的。
为什么脚本/任务没有接收参数?
答案1
注意:这已作为原始问题的一部分发布,因此我(terdon)将其发布为 CW 答案。
好的,所以我在发布之前就已经找到了这个问题的解决方案。我只是想发表一篇文章,因为我在这方面浪费了时间,尽管它已记录在案:
如果未安装脚本,或者您希望将其变成一个内聚任务,以便可以使用代码管理工具管理其版本,请将代码添加到脚本中以检查环境变量(以 PT_ 为前缀),然后读取它们的论点。
我正在尝试在远程计算机上运行脚本,最初认为我可以通过 stdin 将参数作为 $1、$2 等传递到 bask 脚本中。这些变量接收在 Bash 中启动脚本后输入的值,如下所示:./scriptTakeInUserAndGroup 用户组(其中 echo $1 会打印用户因为它传递了第一个参数)。
这在傀儡螺栓中不起作用。对于 unix,Puppet Bolt 对于 input_method 有两个选项:标准输入和环境。到目前为止,我还没有使用 stdin 选项,但我发现一旦发现环境变量与变量名称混淆,它就会起作用:
bolt task run --targets localhost madeUpModule::scriptTakeInUserAndGroup user='testuser' group='testgroup'
不按您在 JSON 元数据中调用这些变量的名称传递这些变量。
如果您输入printenv | grep user
脚本,您将在您的环境中看到以下内容:PT_user=testuser
。
相当烦人的是,PT_
在变量名称之前添加。所以你用 $user 运行的 bash 脚本正在崩溃
如果你修改你的脚本来使用$PT_user
它就会很好地工作。