2017-04-13 11 views
0

두 번째 인스턴스에서 무시 -요리사 - 어떻게 bash는 블록이 성공적으로 실행되었는지 확인하는 방법과 나는 다음과 같은 bash는 블록과 요리사의 조리법 데

bash "run_bash" do 
user node[:value1][:user] 
group node[:value1][:group] 
cwd node[:value1][:install_dir] + '/tools/bin' 
code <<-EOH 
export MW_HOME=#{node[:value1][:mw_install_dir]} 
export JAVA_HOME=#{node[:value1][:install_dir]} 
export ORACLE_HOME=#{node[:value1][:install_dir]} 
/usr/bin/expect -c 'spawn ./idmConfigTool.sh -configOAM input_file=#{Chef::Config[:file_cache_path]}/config.props 
expect "Enter ID Store Bind DN password : " 
send "#{OrcladminPassword}\r" 
expect "Enter User Password for IDSTORE_PWD_SOFTWAREUSER: " 
send "#{LDAPPassword }\r" 
expect "Confirm User Password for IDSTORE_PWD_APPSOFTWAREUSER: " 
send "#{AppLDAPPassword }\r" 
expect "Enter User Password for IDSTORE_PWD_APP2ADMINUSER: " 
send "#{App2AdminPassword }\r" 
expect "Confirm User Password for IDSTORE_PWD_APP3ADMINUSER: " 
send "#{App3AdminPassword}\r" 
sleep 240 
expect eof' 
EOH 

내가 chef-이 레시피를 실행하려고를 독점적으로이 조리법이 실행됩니다.

나는이 bash는 블록이 멱등 할 수 있도록하는 솔루션이 필요합니다. not_if, only_if 등의 보호 진술이 있습니다. 그러나 나는 그 경비원을 여기에서 구현할 방법을 찾지 못했습니다.

나는이 bash는 블록이 성공적으로 실행되면, 내가 타임 스탬프를 찾아 다음 실행이 일어나고있는 현재의 타임 스탬프와 비교 할 수 있습니다 하나 개의 솔루션 생각했다. 일치하지 않으면 나는 그것을 실행 무시할 수 있습니다. 이것은 내가 생각할 수있는 단순한 무력 작업입니다.

이 시나리오에서 더 나은 최적의 솔루션을 제공하십시오.

+0

내가 사용하는 거라고 [가드 not_if] (https://docs.chef.io/resource_common.html#not-if-examples) :: File.exists와 예제로? 설치 중에 작성된 파일을 대상으로 지정합니다. – Tensibai

+0

@Tensibai : 내가 실행하려고하는 bash 블록은 '* .log'파일을 생성하지만 알 수없는 위치에 생성합니다. 내가 '* .log'를 주더라도 iam이 두 번째로 실행되는 상황이라면이 bash 블록을 건너 뛸 것입니다. 그러나 expect 블록에서 제공되는 암호가 다른 시간이 될 수도 있습니다. –

+0

그런 다음 템플릿을 사용하여 스크립트를 만들고 템플릿 변경시 exécuté 리소스에 알립니다. – Tensibai

답변

0

내가 notifications를 사용하여 템플릿으로 갈 것 :

execute 'my_installer' do 
    command '/usr/local/bin/my_script' 
    action :noting # For it not to run on each converge by default 
end 

template '/usr/local/bin/my_script' do 
    source 'script.erb' 
    mode '0600' 
    variables(
    'OrcladminPassword' => <how you set the value>, 
    'LDAPPassword' => <...>, 
    'AppLDAPPassword' => <...>, 
    'App2AdminPassword' => <...>, 
    'App3AdminPassword' => <...> 
) 
    notifies :run,execute[my_installer] 
end 

당신은 통지 라인의 끝에서 , :immediately을 추가 할 수 있습니다 :

your_cookbook/templates/default/script.erb :

#!/bin/bash 
export MW_HOME=<%= node[:value1][:mw_install_dir] %> 
export JAVA_HOME=<%= node[:value1][:install_dir] %> 
export ORACLE_HOME=<%= node[:value1][:install_dir]} 
/usr/bin/expect -c 'spawn ./idmConfigTool.sh -configOAM input_file=<%= 
Chef::Config[:file_cache_path] %>/config.props 
expect "Enter ID Store Bind DN password : " 
send "<%= @OrcladminPassword %>\r" 
expect "Enter User Password for IDSTORE_PWD_SOFTWAREUSER: " 
send "<%= @LDAPPassword %>\r" 
expect "Confirm User Password for IDSTORE_PWD_APPSOFTWAREUSER: " 
send "<%= @AppLDAPPassword %>\r" 
expect "Enter User Password for IDSTORE_PWD_APP2ADMINUSER: " 
send "<%= @App2AdminPassword %>\r" 
expect "Confirm User Password for IDSTORE_PWD_APP3ADMINUSER: " 
send "<%= @App3AdminPassword %>\r" 
sleep 240 
expect eof 

you_cookbook/recipes/default.rb 템플릿을 렌더링하면 실행이 시작됩니다.

이 방법 요리사는 실행 자원에만 서식 변경을 트리거합니다. 당신 작동하지 않을 수 있습니다 설치하고 주방장이 경우 다시 시도하지 않을 것이다, 설치가 실패 유지 곳

이 계정의 경우하지 않습니다. 나는 제품 편집기로 일하는 것이 모두

모든

은 부서지기 쉬운 설치의이 종류를 피하기 위해 패키지의 종류가 있습니다.

+0

이제 암호가 변경되면 코드가 실행되고있는 것을 볼 수 있습니다. 그냥 작은 설명. 이 코드가 처음 실행될 때 템플릿에서 암호를 가져 와서 실행하는지 여부는 어떻게됩니까? 두 번째로 실행하면 다시 템플릿의 이전 값을 검사 할 것입니까? . 이 시나리오의 작동 논리가 필요합니다. Thanks in Advance –

+0

@HarishPC 두 번째로 대상 파일이 변경되지 않았으므로 템플릿 리소스가 실행 리소스에 알리지 않습니다. 모든 사용자가 암호를 읽을 수 없도록 스크립트에 모드를 추가했으며 알림 기능에 대한 문서에 대한 링크를 추가했습니다. – Tensibai