Chef infra 通过chef脚本运行sed命令时出错

Chef infra 通过chef脚本运行sed命令时出错,chef-infra,Chef Infra,运行此厨师区时:- bash 'Do some sed' do user node['aem_dispatcher_cookbook']['owner']['user'] group node['aem_dispatcher_cookbook']['owner']['group'] cwd '/ebiz' code <<-EOH source /etc/profile.d/disp_profile.sh sed  -i -e 's/

运行此厨师区时:-

bash 'Do some sed' do
    user node['aem_dispatcher_cookbook']['owner']['user']
    group node['aem_dispatcher_cookbook']['owner']['group']
    cwd '/ebiz'
    code <<-EOH
    source /etc/profile.d/disp_profile.sh
      sed  -i -e 's/umask 007/umask 022/g' #{node['aem_dispatcher_cookbook']['user']['home']}/.profile
      sed  -i -e 's/umask 007/umask 022/g' #{node['aem_dispatcher_cookbook']['user']['home']}/.wsenv
      sed  -i -e 's/AUTHOR_HOST/'$AUTHOR_HOST'/g' #{node['aem_dispatcher_cookbook']['owner']['home']}/conf.d/author_farm.any
      sed  -i -e 's/APORT/'$APORT'/g' #{node['aem_dispatcher_cookbook']['owner']['home']}/conf.d/author_farm.any
      sed  -i -e 's/URL1/'$URL'/g' #{node['aem_dispatcher_cookbook']['owner']['home']}/conf.d/author_farm.any
      sed  -i -e 's/PUBLISH_HOST/'$PUBLISH_HOST'/g' #{node['aem_dispatcher_cookbook']['owner']['home']}/conf.d/publish_farm.any
      sed  -i -e 's/PPORT/'$PPORT'/g' #{node['aem_dispatcher_cookbook']['owner']['home']}/conf.d/publish_farm.any  
      sed  -i -e 's/P_HOST_ADDY/'$P_HOST_ADDY'/g' #{node['aem_dispatcher_cookbook']['owner']['home']}/conf.d/publish_farm.any
    EOH
  end

但这些文件在同一位置可用。请帮助解决这个问题

我不知道您的
sed
命令失败的确切原因,但是Charles Duffy有一个观点

我想介绍一种更有效的管理配置文件的方法

有一个资源,它通过添加一些变量的
.erb
模板创建文件:

#模板(templates/default/file.conf.erb)
键1=值1
键2=
#配方
模板'/etc/conf/file.conf'do
源“file.conf.erb”
变量(value2:node['value2'])#这将在模板中将@value2设置为node['value2']
结束
如果您可以使用模板,那么您应该。但如果不能,例如,此文件也可以由其他软件更改,则可以使用
Chef::Util::FileEdit
库:

在您的情况下,您可能需要:

ruby_块“做一些正则表达式替换”做
布洛克道
fe=Chef::Util::FileEdit.new(“{node['aem\u dispatcher\u cookbook']['user']['home']}/.profile”)
fe.搜索文件替换('umask 007'、'umask 022')
fe.write_文件
fe=Chef::Util::FileEdit.new(“#{node['aem\u dispatcher\u cookbook']['owner']['home']}/conf.d/author\u farm.any”)
fe.search\u file\u replace('AUTHOR\u HOST',ENV['AUTHOR\u HOST']))
fe.write_文件
[…与其他文件类似]
结束
结束

错误消息表明,每一行都被视为shell中的单个单词(而不是要解析并拆分为单词的字符串)。我和Chef共事已经很多年了,没有太多具体的见解——但您的代码中有没有可能有不间断的空格而不是常规的ASCII空格?这当然是导致此错误的一种方法。也就是说,与其尝试将
sed
作为命令运行,并将
-i
作为参数传递给它,错误消息说它正在尝试查找文件名为
sed-i-e s/umask 007/umask 022/g/home/aemadmin/.profile
的命令,将空格和斜杠作为命令名的一部分……sed找不到文件不是问题,这就是文件是否存在的原因
sed
甚至没有运行,因为shell没有将
sed
视为要运行的命令的名称,但是长得多的命令名称的前三个字符。。。这就是为什么我怀疑你的文件中有不间断的空格,而不是常规的空格。需要一个建议吗?我可以使用这种格式的源代码,因为我在代码中使用了源文件提供的一些值,你说的源代码是什么意思?正如你在我的代码中看到的,我使用的是“source/etc/profile.d/disp_profile.sh”这个源代码,我从这个文件中得到的变量值很少
STDERR: /tmp/chef-script20200518-26241-1f7ynpy: line 2: sed  -i -e s/umask 007/umask 022/g /home/aemadmin/.profile: No such file or directory
/tmp/chef-script20200518-26241-1f7ynpy: line 3: sed  -i -e s/umask 007/umask 022/g /home/aemadmin/.wsenv: No such file or directory
/tmp/chef-script20200518-26241-1f7ynpy: line 4: sed  -i -e s/AUTHOR_HOST//g /ebiz/apache/conf.d/author_farm.any: No such file or directory
/tmp/chef-script20200518-26241-1f7ynpy: line 5: sed  -i -e s/APORT/8080/g /ebiz/apache/conf.d/author_farm.any: No such file or directory
/tmp/chef-script20200518-26241-1f7ynpy: line 6: sed  -i -e s/URL1/dev.uhg/g /ebiz/apache/conf.d/author_farm.any: No such file or directory
/tmp/chef-script20200518-26241-1f7ynpy: line 7: sed  -i -e s/PUBLISH_HOST//g /ebiz/apache/conf.d/publish_farm.any: No such file or directory
/tmp/chef-script20200518-26241-1f7ynpy: line 8: sed  -i -e s/PPORT/8080/g /ebiz/apache/conf.d/publish_farm.any  : No such file or directory
/tmp/chef-script20200518-26241-1f7ynpy: line 9: sed  -i -e s/P_HOST_ADDY//g /ebiz/apache/conf.d/publish_farm.any: No such file or directory
---- End output of "bash"  "/tmp/chef-script20200518-26241-1f7ynpy" ----
Ran "bash"  "/tmp/chef-script20200518-26241-1f7ynpy" returned 127