passa parâmetros para bash script usando atributos chef

1

Eu tenho um script bash (digamos main.sh) que eu preciso integrar com o chef. Atualmente estamos usando "esperar" para passar os parâmetros para main.sh.

Agora eu preciso fazer script de tal forma que os parâmetros para main.sh sejam passados usando o arquivo de atributos no chef.

Eu sei que podemos colocar nosso código em um recurso bash, mas eu estou lutando para passar os parâmetros como senhas, nomes de usuários, portas usando atributos do chef ??

Abaixo está como o script se parece:

#!/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"

.............
.............
    
por Krishna Sharma 22.09.2015 / 06:50

3 respostas

1

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.

    
por 22.09.2015 / 11:13
0

Eu não entendo porque você usaria "esperar" ...

Por que não passar as variáveis como "opções"?

 myscript.sh -f myfile -u username 

ou carregue as variáveis antes do script:

 FILE=myfile USER=username myscript.sh

Acho que seria um uso mais típico para um script de shell.

    
por 27.09.2015 / 00:57
-1

Trabalhou com:

/usr/bin/expect -c ' 
--code-- 
interact
' 
    
por 26.09.2015 / 21:11