厨师Bash一个衬垫来grep另一个文件中的文件的内容

问题描述 投票:0回答:4

我需要将文件的内容放入另一个文件中,如果该内容已经不存在(以幂等方式)使用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-----

secont文件是/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

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

有人可以解释一下我做错了什么吗?

谢谢。

bash chef
4个回答
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

(临时;未经适当测试。)


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中,并使用您的配方将其放置在节点上。


0
投票

解决方案实际上更简单,我的一位同事给了我。没有必要比较某些字符串或文件中是否存在变量,或者没有必要。条件很简单,只是

not_if "knife ssl check <url>".

-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
© www.soinside.com 2019 - 2024. All rights reserved.