Chef Bash Onliner在另一个文件中grep一个文件的内容

时间:2019-03-04 16:01:25

标签: bash chef

如果需要使用Chef,如果文件的内容不存在(以幂等方式),则需要将该文件的内容放入另一个文件中。

file1.txt具有以下内容:

subject=/DC=corp/DC=NAME/CN=COMPANY Issuing CA
issuer=/CN=COMPANY Root CA
-----BEGIN CERTIFICATE-----
fewfgwgwegarearentnsrtntrstrntnsrtntnstrntrnsrtnstrnsrtnrtnsrtnr
gregargragregrGRGrgregREGREGRGZTDNBFNFGNFGNFGNFGNBDVvhrhrehrehre
gewgreaghareherhherhhaeharehrehreahreahrehearhreahreahaerhrehher
-----END CERTIFICATE-----

subject=/CN=COMPANY Root CA
issuer=/CN=COMPANY Root CA
-----BEGIN CERTIFICATE-----
INjIVNRIVNRVINRvORIniNNknjnejvejnringringrongrognreonganaI6udddd
febwgpubgiurbguiregbeagubpaegigreaignaeingreaingeaingaeinhaddddd
findaofgbugbrluigblzriugbzrugaRIGjRIJgaprjgarigarianbnblkrnbnjna
wfefrgregeGWGWG=
-----END CERTIFICATE-----

第二个文件是/opt/chef/embedded/ssl/certs/cacert.pem,如果尚不存在,我需要将file1.txt中的链放入其中。

我正在使用的资源是这样:

bash 'add company cert chain to chef certs' do
  code <<-EOH
    cat /etc/pki/ca-trust/source/anchors/comp.corp.ca.chain.2018.crt >> /opt/chef/embedded/ssl/certs/cacert.pem
  EOH
not_if 'grep "$(cat /etc/pki/ca-trust/source/anchors/comp.corp.ca.chain.2018.crt)" /opt/chef/embedded/ssl/certs/cacert.pem'
end

由于某种原因,这不起作用。

有人可以向我解释我在做什么错吗?

谢谢。

Gabi

4 个答案:

答案 0 :(得分:0)

在过去,您可以使用Chef::Util::FileEdit,但实际上是deprecated

相反,您可以使用其他厨师资源来实现它。  其中一次是使用ruby_block resource,它具有所有的红宝石功能。这意味着您可以利用红宝石的力量为您做到这一点(不要忘记提供not_ifonly_if护卫...

类似:

ruby_block 'concatenate files' do
  block do
    f1 = File.read('first.file')
    f2 = File.read('second.file')
    content = f1 + f2
    File.open('combined.file', 'w') { |f| f.write content }
  end
  not_if { File.read('combined.file').includes? 'some anchor text' }
end

另一种想法是离线创建所需的证书链,将其存储在encrypted data bag中,并使用您的配方将其放置在节点上。

答案 1 :(得分:0)

如果您只想比较两个文件,

not_if 'cmp /etc/pki/ca-trust/source/anchors/sdl.corp.ca.chain.2018.crt /opt/chef/embedded/ssl/certs/cacert.pem'

尝试使用grep既奇怪又复杂。

如果您要验证file1作为file2的子文件存在,则严格来说,可能需要一个简单的Awk脚本或类似脚本。

awk 'BEGIN { rc=1 }
    NR == FNR { k[++i] = $0; next }
    k[j+1] == $0 { j++ }
    j > i { rc=0; nextfile }
    k[j] =! $0 { j = 0 }
    END { exit rc }' file1 file2

(临时的,未经适当测试的。)

答案 2 :(得分:0)

解决方案实际上要简单得多,它是由我的一位同事给我的。 无需比较一些字符串或文件中是否存在变量或类似的东西。 条件很简单,只需

public function create($id)
{
   return view('order-payments.create', compact('orderpayments'));
}

答案 3 :(得分:-1)

我会重写一下。

needle=$(cat /etc/pki/ca-trust/source/anchors/sdl.corp.ca.chain.2018.crt)

if ! grep -Fxq "$needle" /opt/chef/embedded/ssl/certs/cacert.pem
then
    $(cat /etc/pki/ca-trust/source/anchors/comp.corp.ca.chain.2018.crt >> /opt/chef/embedded/ssl/certs/cacert.pem)
fi