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
' 

관련 정보