使用 Chef 属性将参数传递给 bash 脚本

使用 Chef 属性将参数传递给 bash 脚本

我有一个 bash 脚本(假设是 main.sh ),我需要将其与厨师集成。目前我们使用“expect”将参数传递给main.sh。

现在我需要以这样的方式制作脚本,以便使用 Chef 中的属性文件传递 main.sh 的参数。

我知道我们可以将代码放入 bash 资源中,但我很难使用厨师属性传递密码、用户名、端口等参数?

下面是脚本的样子:

#!/usr/bin/expect
set filename [lindex $argv 0]
set f [open $filename]
set inputs [split [read $f] "\n"]

# Below parameters i need to pass using chef attributes instead of expect inputs
lassign $inputs ADMIN_PASSWORD CREATE_USER USER_EMAIL FIRST_NAME LAST_NAME INST_PATH

#read -e -p "Enter the installation folder path(/<install_dir>/): " FILEPATH3
#FILEPATH3=$(echo $FILEPATH3 | sed 's/ /\\ /')


spawn "$INST_PATH/main.sh"

expect "Enter system admin password:"

send "$ADMIN_PASSWORD\r"

expect "Create a new user y/n (y):"

send "$CREATE_USER\r"

.............
.............

答案1

关于 bash 资源的 Chef 文档有一个将属性数据传递给脚本的示例。您应该能够根据您的需求进行调整,例如使用您的期望脚本:

bash 'call main.sh and respond with attribute values' do
  cwd ::File.dirname('/usr/local/bin')
  code <<-EOH
    #!/usr/bin/expect
    set filename [lindex $argv 0]
    set f [open $filename]
    set inputs [split [read $f] "\n"]

    # Below parameters i need to pass using chef attributes instead of expect inputs
    lassign $inputs ADMIN_PASSWORD CREATE_USER USER_EMAIL FIRST_NAME LAST_NAME INST_PATH

    #read -e -p "Enter the installation folder path(/<install_dir>/): " FILEPATH3
    #FILEPATH3=$(echo $FILEPATH3 | sed 's/ /\\ /')


    spawn "$INST_PATH/main.sh"

    expect "Enter system admin password:"

    send "#{node['admin_password']\r"

    expect "Create a new user y/n (y):"

    send "#{node['create_user']}\r"
  EOH
end

如果接受命令行参数会更好main.sh,因为这会让你的厨师工作更简单,例如:

bash 'run main.sh' do
  cwd ::File.dirname('/usr/local/bin')
  code <<-EOH
    ./main.sh --admin_password #{node['admin_password']} --create_user #{node['create_user']}
    EOH
end

如果 main.sh 很短,那么将脚本本身转换为 Chef 中的 bash 资源可能会更简单,就像上面的其他示例一样。

正如您所看到的,Chef 在 bash 资源中没有任何“期望”功能,因此您仍然坚持使用相同的期望脚本,除非您可以切换到将值作为命令行参数传递或将主脚本嵌入到 Chef 中资源(删除交互式提示)。

最后,如果您了解足够的 Ruby 来重现 main.sh,您也可以在本机执行大量操作并完全停止使用 bash 资源。

答案2

我不明白你为什么要使用“期望”......

为什么不将变量作为“开关”传递?

 myscript.sh -f myfile -u username 

或者在脚本之前加载变量:

 FILE=myfile USER=username myscript.sh

我认为这将是 shell 脚本的更典型用途。

答案3

它与:

/usr/bin/expect -c ' 
--code-- 
interact
' 

相关内容