Как использовать динамические переменные, определенные в рецепте шеф-повара, для замены выражения в файле шаблона

avatar
Mayur
9 августа 2021 в 05:03
86
1
1

Я застрял в ситуации, когда я создал файл templates/test.sh.erb со следующим содержимым:

#!/bin/bash

ls -ltr <%= "#{tomcat_home}/instance1/bin" %>
ls -ltr <%= "#{tomcat_home}/instance1/conf" %>

Для этого erb-файла я хотел передать "tomcat_home", который может быть либо "/opt/tomcat", либо "/opt/apacheTomcat". Эти данные я анализирую, используя условие if else, которое возвращает мне кота домой по одному из этих путей.

eg: tomcat_home="/opt/tomcat"

Я хотел создать файл test.sh в папке /tmp на сервере, где я хотел динамически заменять переменную tomcat_home каждый раз, когда будет создаваться файл test.sh. логика ресурса шаблона:

    template "/tmp/test.sh" do
        source 'test.sh.erb' # <-- this is your directory in files/default/local_directory
        owner 'tomcat'                                                                 
        group 'tomcat'
        mode '0755'
        action :create                                                                   
    end    

Желаемый результат, который я ожидаю при запуске ресурса шаблона:

#!/bin/bash

ls -ltr /opt/tomcat/instance1/bin
ls -ltr /opt/tomcat/instance1/conf
Источник

Ответы (1)

avatar
seshadri_c
9 августа 2021 в 06:41
1

Для интерполяции переменных в шаблонах Chef (файлы .erb) следует использовать маркеры <%= %>. В вашем случае внутри этих маркеров должна быть только переменная tomcat_home, т.е. <%= tomcat_home %>.

Кроме того, файлы, требующие создания шаблонов, должны находиться в каталоге <cookbook_name>/templates/default. Каталог files/ предназначен для статических файлов, где интерполяция переменных не происходит.

Пример:

templates/default/test.sh.erb:

#!/bin/bash

ls -ltr <%= @tomcat_home %>/instance1/bin
ls -ltr <%= @tomcat_home %>/instance1/conf

Затем в рецепте:

template '/tmp/test.sh' do
  source 'test.sh.erb'
  owner 'tomcat'                                                                 
  group 'tomcat'
  mode '0755'
  variables(
    tomcat_home: '/opt/tomcat'
  )
end

Обратите внимание, что действие :create используется по умолчанию для ресурса template, поэтому я его пропустил. Кроме того, шаблоны могут напрямую ссылаться на атрибуты узла, например:

.
ls -ltr <%= node['cookbook_name']['tomcat_home'] %>/instance1/bin
Mayur
9 августа 2021 в 13:25
0

Спасибо Сешадри. Это сработало. У меня есть еще одна проблема, когда я запускаю сценарий оболочки, и когда я запускаю его вручную, я получаю код выхода как 4, но когда я запускаю его с помощью bash resorce, его исполняемый сценарий, но выдает ошибку как ">>>> Вызвано Mixlib:: ShellOut::ShellCommandFailed: ожидалось, что процесс завершится с [0], но получил '4'". Любая помощь будет оценена по достоинству.

seshadri_c
9 августа 2021 в 16:12
0

Поскольку команда завершается с ненулевым кодом, она считается неудачной командой. Не возражаете ли вы создать новый вопрос с необходимыми деталями?