2017-03-29 2 views
0

차이를 알고 싶어하고 node.run_state차이는

test.rb

dbpassword='' 


ruby_block "load_databag_secret" do 
    block do 
    secret_key = Chef::EncryptedDataBagItem.load_secret("/home/test/db_key") 
     db_keys = Chef::EncryptedDataBagItem.load("mydatabag", "mydatabagitem", secret_key) 
    end 
    dbpassword=db_keys['DB_PASSWORD'] 
node.run_state['password']=db_keys['DB_PASSWORD'] 
     end 
    end 

execute "Enable on hosts" do 

    command lazy { "echo #{node.run_state['password']} > /home/app/db.txt" } 
end 

    template "/config/properties" do 
      source "properties.erb" 
      variables(lazy { 
         :db_password => { node.run_state['password'] }, 

         }) 

대 글로벌 변수 사이에 사용하는 방법을 권장 것 또는 .rb 파일의 전역 변수 대신 node.run_state [ 'password']를 사용하십시오.

이제 실행 된 명령을 실행하면 에코 된 파일 db.txt의 암호를 볼 수 있습니다. 여기서 템플릿으로 지연을 사용할 때 바리 아 템플릿의 db_password에 빈 값으로 출력됩니다.

답변

1

그래서 몇 가지 문제는 먼저 전역 변수가 아니라 로컬 변수입니다. Ruby의 전역은 $으로 시작합니다. 둘째로, Ruby와 같은 범위 (또는 실제로는 대부분의 언어)에서 로컬 변수에 할당 할 수 없습니다. 이 할당은 블럭에 범위가 두 번째 인 dbpassword 로컬 변수를 만듭니다. 그러나 변수 할당보다는 변이를 사용할 수 있습니다 (예 : dbpassword << whatever). 셋째, 변수 해시 안에 실제로 lazy을 사용할 수 없으므로 최상위 레벨에 있어야합니다. 넷째, 당신은 할 수 직선이 아니라 예를 한 번 같은 값을 사용하는 경우이 모든 사이드 스텝 업 :

template "/config/properties" do 
    source "properties.erb" 
    variables lazy { 
    secret_key = Chef::EncryptedDataBagItem.load_secret("/home/test/db_key") 
    db_keys = Chef::EncryptedDataBagItem.load("mydatabag", "mydatabagitem", secret_key) 
    {db_password: db_keys['DB_PASSWORD']} 
    } 
end 

이 경우 다른 사람의 완전성 실제 전역 변수로, 구글을 통해이를 찾을 단지의 가장 큰 차이는 단위 테스트입니다. 실행 상태는 수렴으로 묶여 있으므로 개별 단위 테스트는 항상 서로 좋아하는 값을 볼 수 없습니다. 물론 코드에서이 값을 해결할 수도 있습니다.

+0

메신저는 node.runstate ..를 사용하는 것이 긍정적입니다.하지만 루비 블록 밖에서 어떻게 node.runstate를 사용할 수 있는지 알려주시겠습니까? 템플릿에 없다는 것을 의미합니다. 내 질문을 업데이트했습니다. – shiv455

+0

실행 리소스가 외부 명령을 실행하기 때문에 네가 뭘하려고하는지조차 모르겠다. – coderanger

+0

업데이트 된 질문 – shiv455