Search code examples
linuxchef-infrachef-recipecookbooktest-kitchen

chef recipe - replace text in Linux file with sed command (receiving errors)


I am using the following code in a chef recipe:

bash 'replace_text' do
    cwd ::File.dirname('/data01/nodemanager/bin')
    code <<-EOH
      sed 's/NODEMGR_HOME=.*/NODEMGR_HOME="\/data01\/nodemanager"/g' startNodeManager.sh
      EOH
  end

The text that I am trying to replace is everything on the line containing NODEMGR_HOME= startNodeManager.sh located at /data01/nodemanager/bin

and I am receiving the following output when running the recipe:

       Running handlers:
       [2017-11-21T23:58:22+00:00] ERROR: Running exception handlers
       [2017-11-21T23:58:22+00:00] ERROR: Running exception handlers
       Running handlers complete
       [2017-11-21T23:58:22+00:00] ERROR: Exception handlers complete
       [2017-11-21T23:58:22+00:00] ERROR: Exception handlers complete
       Chef Client failed. 0 resources updated in 01 seconds
       [2017-11-21T23:58:22+00:00] FATAL: Stacktrace dumped to /tmp/kitchen/cache/chef-stacktrace.out
       [2017-11-21T23:58:22+00:00] FATAL: Stacktrace dumped to /tmp/kitchen/cache/chef-stacktrace.out
       [2017-11-21T23:58:22+00:00] FATAL: Please provide the contents of the stacktrace.out file if you file a bug report
       [2017-11-21T23:58:22+00:00] FATAL: Please provide the contents of the stacktrace.out file if you file a bug report
       [2017-11-21T23:58:22+00:00] ERROR: bash[replace_text] (domain-test::sed2 line 1) had an error: Mixlib::ShellOut::ShellCommandFailed: Expected process to exit with [0], but received '1'
       ---- Begin output of "bash"  "/tmp/chef-script20171121-11258-vwwwm6" ----
       STDOUT:
       STDERR: sed: -e expression #1, char 34: unknown option to `s'
       ---- End output of "bash"  "/tmp/chef-script20171121-11258-vwwwm6" ----
       Ran "bash"  "/tmp/chef-script20171121-11258-vwwwm6" returned 1
       [2017-11-21T23:58:22+00:00] ERROR: bash[replace_text] (domain-test::sed2 line 1) had an error: Mixlib::ShellOut::ShellCommandFailed: Expected process to exit with [0], but received '1'
       ---- Begin output of "bash"  "/tmp/chef-script20171121-11258-vwwwm6" ----
       STDOUT:
       STDERR: sed: -e expression #1, char 34: unknown option to `s'
       ---- End output of "bash"  "/tmp/chef-script20171121-11258-vwwwm6" ----
       Ran "bash"  "/tmp/chef-script20171121-11258-vwwwm6" returned 1
       [2017-11-21T23:58:22+00:00] FATAL: Chef::Exceptions::ChildConvergeError: Chef run process exited unsuccessfully (exit code 1)
       [2017-11-21T23:58:22+00:00] FATAL: Chef::Exceptions::ChildConvergeError: Chef run process exited unsuccessfully (exit code 1)
>>>>>> ------Exception-------
>>>>>> Class: Kitchen::ActionFailed
>>>>>> Message: 1 actions failed.
>>>>>>     Converge failed on instance <default-ubuntu-1404>.  Please see .kitchen/logs/default-ubuntu-1404.log for more details
>>>>>> ----------------------
>>>>>> Please see .kitchen/logs/kitchen.log for more details
>>>>>> Also try running `kitchen diagnose --all` for configuration

Solution

  • You don't have enough levels of escaping on your backslashes. Remember it's a Ruby string first, then a bash string, then a sed argument. Also you can sidestep this whole issue by using the line or poise-file cookbooks instead.