我有一个 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
'