Chefプロパティを使用してbashスクリプトにパラメータを渡す

Chefプロパティを使用してbashスクリプトにパラメータを渡す

Chefと統合する必要があるbashスクリプト(main.shと仮定)があります。現在、私たちはmain.shに引数を渡すために「expect」を使用しています。

Chefのプロパティファイルを使用して、main.shの引数が渡されるようにスクリプトを作成する必要があります。

Bashリソースにコードを入れることができることを知っていますが、Chefプロパティを使用してパスワード、ユーザー名、ポートなどのパラメータを渡すのは難しいですか?

スクリプトは次のとおりです。

#!/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 ドキュメント属性データをスクリプトに渡す例があります。たとえば、Expectスクリプトを使用してニーズに合わせて調整できる必要があります。

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リソースに「expect」機能がないため、コマンドライン引数として値を渡すように切り替えるか、デフォルトの引数を含まない限り同じ期待スクリプトに閉じ込められています。 Chefリソースにスクリプトを追加します(対話型プロンプトを削除します)。

最後に、main.shを再現するのに十分なRubyを知っている場合は、基本的に多くのことを行い、bashリソースの使用を完全に中断することもできます。

答え2

なぜ「期待」を使用したいのかわかりません...

変数を「スイッチ」に渡さないのはなぜですか?

 myscript.sh -f myfile -u username 

またはスクリプトの前に変数をロードします。

 FILE=myfile USER=username myscript.sh

私はこれがシェルスクリプトのより一般的な使用だと思います。

答え3

これは以下に関連しています:

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

関連情報