Chef - 如何检查bash块是否成功运行并在第二个实例中忽略

时间:2017-04-13 12:33:19

标签: bash chef chef-recipe chef-solo

我正在使用以下bash块的主厨配方 -

{{1}}

我正在尝试用chef-solo运行这个食谱。所以这个食谱会冗长地运行。

我需要一个解决方案来使这个bash块成为幂等的。有像not_if,only_if等保护声明。但是我找不到在这里实施这些守卫的方法。

我想到了一个解决方案,一旦这个bash块运行成功,我就可以找到时间戳,并在下次运行时将其与当前时间戳进行比较。如果那些没有匹配,我可以忽略它的运行。这只是我能想到的一个蛮力工作。

请为此方案提供更好的最佳解决方案。

1 个答案:

答案 0 :(得分:0)

我会使用notifications

来使用模板

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

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,以便在执行模板后触发执行。

这样厨师只有在模板改变时才会触发执行资源。

这不考虑您的安装可能无法正常工作且主厨在此情况下不会重试的情况,安装将保持失败。

总而言之,我会与产品编辑器一起使用一种软件包以避免这种脆弱的安装。