Chef 12.5 カスタム リソース - レシピ内のリソースへのアクセス

Chef 12.5 カスタム リソース - レシピ内のリソースへのアクセス

私はChef 12.5のカスタムリソースを使用するクックブックを書いています。テンプレートリソースを使用するカスタムリソースがあり、通知する関連するサービスを再読み込みします。

ただし、関連付けられているサービスはメイン レシピで管理されます。現在、サービスがないというエラーが表示されるため、これは失敗します。

以前のバージョンでは、LWRPを使用する場合、インラインリソースを使用するこの関数を LWRP に含めないことで、この特定の問題を回避できると思います。

現在、この行をカスタム リソースに含めていませんが、動作は存在します。この動作をオフにする方法はありますか?

あるいは、多数の場所でまったく同じコードを使用する必要がないように、複数のリソースにサービスを「含める」他の方法はありますか?

答え1

delerious010 の回答に基づいて、私と同僚は、この特定の状況に対するより良い回避策を思いつくことができました。

action :create do
  global_nginx = resources('service[nginx]')

  template "/etc/nginx/conf.d/#{name.tr(' ', '_')}.conf" do
    cookbook 'nginx_server'
    source 'server_block.conf.erb'
    owner 'root'
    group 'root'
    mode '0644'
    variables(
      listen: listen,
      server_name: real_server_name,
      root: root,
      index: index,
      config: config
    )
    notifies :reload, global_nginx, :delayed
  end
end

明らかに、この例では管理されるリソースは 1 つだけですが、複数のリソースを管理して、必要なリソースのみに通知できるようにする必要があります。

編集: これはバグに依存していることに注意してください (参考:) は Chef 開発者が修正する予定です。12.9.38 では、リソース コレクションの検索が外側の run_contexts まで上向きに再帰的に実行されるようになったため、このコードは引き続き機能しますが、もう必要ありません (また、親の run_context だけでなくルート内のリソースを取得する必要がある、複数のネストされたサブコンテキストを正しく処理します)。この場合の最善の解決策は、アップグレードすることでしょう。

答え2

Chef 12.5 では、use_inline_resources はデフォルトでオンになっています。これにより、サブリソースが更新されるたびに、LWRP が変更されたというフラグが付けられます。そのため、リソース通知を常に「親」LWRP で定義することができます。

または、LWRP のすべてのインスタンスに対して notifies 句を定義したい場合は、アクション ブロック内で直接通知を作成することもできます。

notifies_delayed(:restart, resources("service[rsyslog]"))

しかし、覚えておいてほしいのはどれでもLWRP 内でリソースが変更されると、サービスが再起動します。ただし、リソースへの呼び出しを使用して子リソースのプロパティを定義することは可能ですnotifies。まだテストしていないので、完全にはわかりません。

答え3

12.9.38 では、サブリソース コレクション / use_inline_resources プロバイダーから外部のリソース コレクションに通知する機能が次のように追加されました。

翻訳元:

これは通知のデフォルトの動作になったため、アップグレードのみで済みます。

関連情報