A documentação do Chef no recurso bash tem um exemplo de transmissão de dados de atributos para um script. Você deve ser capaz de adaptá-lo às suas necessidades, algo assim com o seu script:
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
Seria melhor se main.sh
aceitasse argumentos de linha de comando, pois isso tornaria o trabalho de seu chef muito mais simples, por exemplo:
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
Provavelmente seria ainda mais simples, se main.sh fosse curto, para converter o próprio script em um recurso bash no Chef, como esses outros exemplos acima.
Como você pode ver, o Chef não tem nenhuma funcionalidade 'expectável' no recurso bash, então você ainda está preso ao mesmo script, a menos que você possa mudar para passar valores como argumentos de linha de comando ou incorporar seu script principal em um recurso do Chef (removendo os prompts interativos quando você faz).
Finalmente, se você conhece Ruby suficiente para reproduzir seu main.sh, você também pode fazer muito isso nativamente e parar de usar completamente os recursos do bash.