summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTim Smith <tsmith84@gmail.com>2021-08-13 14:21:27 -0700
committerTim Smith <tsmith84@gmail.com>2021-08-13 14:21:27 -0700
commit14fe44cdc5a913c4d5f206f6921a0ebac8578fbd (patch)
treed56bd91f13867fcc1e28cde8f101275c764a0220
parent722657f52c346184030b47a5946e8b4a669a96b6 (diff)
downloadchef-14fe44cdc5a913c4d5f206f6921a0ebac8578fbd.tar.gz
Add less bad ruby_block examples
I deleted 1/2 of them. Signed-off-by: Tim Smith <tsmith@chef.io>1
-rw-r--r--lib/chef/resource/ruby_block.rb100
1 files changed, 100 insertions, 0 deletions
diff --git a/lib/chef/resource/ruby_block.rb b/lib/chef/resource/ruby_block.rb
index 2d7d2fe8b6..6df1eeedcb 100644
--- a/lib/chef/resource/ruby_block.rb
+++ b/lib/chef/resource/ruby_block.rb
@@ -29,6 +29,106 @@ class Chef
provides :ruby_block, target_mode: true
description "Use the **ruby_block** resource to execute Ruby code during a #{ChefUtils::Dist::Infra::PRODUCT} run. Ruby code in the `ruby_block` resource is evaluated with other resources during convergence, whereas Ruby code outside of a `ruby_block` resource is evaluated before other resources, as the recipe is compiled."
+ examples <<~'DOC'
+ Re-read configuration data
+
+ ```ruby
+ ruby_block 'reload_client_config' do
+ block do
+ Chef::Config.from_file('/etc/chef/client.rb')
+ end
+ action :run
+ end
+ ```
+
+ Run a block on a particular platform
+
+ The following example shows how an if statement can be used with the `windows?` method in the Chef Infra Language to run code specific to Microsoft Windows. The code is defined using the ruby_block resource:
+
+ ```ruby
+ if windows?
+ ruby_block 'copy libmysql.dll into ruby path' do
+ block do
+ require 'fileutils'
+ FileUtils.cp "#{node['mysql']['client']['lib_dir']}\\libmysql.dll",
+ node['mysql']['client']['ruby_dir']
+ end
+ not_if { ::File.exist?("#{node['mysql']['client']['ruby_dir']}\\libmysql.dll") }
+ end
+ end
+ ```
+
+ Stash a file in a data bag
+
+ The following example shows how to use the ruby_block resource to stash a BitTorrent file in a data bag so that it can be distributed to nodes in the organization.
+
+ ```ruby
+ ruby_block 'share the torrent file' do
+ block do
+ f = File.open(node['bittorrent']['torrent'],'rb')
+ #read the .torrent file and base64 encode it
+ enc = Base64.encode64(f.read)
+ data = {
+ 'id'=>bittorrent_item_id(node['bittorrent']['file']),
+ 'seed'=>node.ipaddress,
+ 'torrent'=>enc
+ }
+ item = Chef::DataBagItem.new
+ item.data_bag('bittorrent')
+ item.raw_data = data
+ item.save
+ end
+ action :nothing
+ subscribes :create, "bittorrent_torrent[#{node['bittorrent']['torrent']}]", :immediately
+ end
+ ```
+
+ Update the /etc/hosts file
+
+ The following example shows how the ruby_block resource can be used to update the /etc/hosts file:
+
+ ```ruby
+ ruby_block 'edit etc hosts' do
+ block do
+ rc = Chef::Util::FileEdit.new('/etc/hosts')
+ rc.search_file_replace_line(/^127\.0\.0\.1 localhost$/,
+ '127.0.0.1 #{new_fqdn} #{new_hostname} localhost')
+ rc.write_file
+ end
+ end
+ ```
+
+ Set environment variables
+
+ The following example shows how to use variables within a Ruby block to set environment variables using rbenv.
+
+ ```ruby
+ node.override[:rbenv][:root] = rbenv_root
+ node.override[:ruby_build][:bin_path] = rbenv_binary_path
+
+ ruby_block 'initialize' do
+ block do
+ ENV['RBENV_ROOT'] = node[:rbenv][:root]
+ ENV['PATH'] = "#{node[:rbenv][:root]}/bin:#{node[:ruby_build][:bin_path]}:#{ENV['PATH']}"
+ end
+ end
+ ```
+
+ Call methods in a gem
+
+ The following example shows how to call methods in gems not shipped in Chef Infra Client
+
+ ```ruby
+ chef_gem 'mongodb'
+
+ ruby_block 'config_replicaset' do
+ block do
+ MongoDB.configure_replicaset(node, replicaset_name, rs_nodes)
+ end
+ action :run
+ end
+ ```
+ DOC
default_action :run
allowed_actions :create, :run