Шеф-повар Bash onliner, чтобы grep содержимое файла в другом файле - PullRequest
0 голосов
/ 04 марта 2019

Мне нужно поместить содержимое файла в другой файл, если это содержимое еще не существует (идемпотентно) с помощью 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

По какой-то причине это не работает.

Может кто-нибудь объяснить, что я делаю не так?

Спасибо.

Габи

Ответы [ 4 ]

0 голосов
/ 07 марта 2019

РЕШЕНИЕ было на самом деле намного проще, и оно было дано мне одним из моих коллег.Нет необходимости сравнивать некоторые строки или существование переменной в файле или ничего подобного.Условие простое, просто

not_if "knife ssl check <url>".
0 голосов
/ 05 марта 2019

в те времена вы могли использовать Chef::Util::FileEdit, но это было устарело .

, вместо этого вы можете использовать другие ресурсы шеф-повара для достижения этой цели.один из них - использовать ресурс ruby_block , в котором есть все возможности рубина.это означает, что вы можете использовать силу рубина, чтобы сделать это для вас (не забудьте предоставить not_if или only_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

другая идея - создать нужную цепочку сертификатов в автономном режиме, сохранить ее в зашифрованном пакете данных и использовать свой рецепт для размещения на узле.

0 голосов
/ 05 марта 2019

Если вы просто хотите сравнить два файла,

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

(Ad hoc; не проверен надлежащим образом.)

0 голосов
/ 04 марта 2019

Я бы немного переписал это.

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
...