2015-06-03 3 views
0

ищет что-то похожее на .Net строковый формат в рецепте шеф-повара, т.е.Эквивалент String.Format в рецепте шеф-повара

string phone = String.format("phone: {0}",_phone); 

У меня есть рецепт шеф-повар, где нужно создать командную строку с 30 из этого Params так, надеющийся на кругленький способ построить строку, в принципе Im делает это

a=node['some_var'].to_s 
ruby_block "run command" do 
    block do 
    cmd = shell_out!("node mycommand.js #{a}; exit 2;")   
    end 
end 

When Я пытаюсь это я получаю ошибку

Аргументы в path.join должны быть строками любые советы оценили

+0

Что вы пытаетесь достичь? Это действительно звучит как проблема XY, когда вы пытаетесь решить что-то, не связанное с тем, что вы хотите достичь на самом деле. (И почему, черт возьми, используя 'exit 2' при любом выполнении?) – Tensibai

+0

Я хочу передать параметры узлу, которое находится внутри рецепта шеф-повара - вот оно. Shell_out! отправляет вывод обратно на мой CI-сервер. проигнорируйте выход 2. – MikeW

+0

Это звучит плохой идеей (вы должны логрегировать локально и в конечном итоге выгружать журнал на экране в конце запуска IMHO). Во всяком случае, не зная, что вы даете в 'node ['some_var']', довольно сложно угадать, что может пойти не так. Я очень подозреваю, что процесс sanytizing командной строки зависает; но я не уверен. (исходный код [здесь] (https://github.com/chef/mixlib-shellout/blob/master/lib/mixlib/shellout/unix.rb)) – Tensibai

ответ

0

Шеф работает в двух фазы:

Скомпилировать и выполнить (см. https://www.chef.io/blog/2013/09/04/demystifying-common-idioms-in-chef-recipes/).

Ваше назначение переменной a происходит во время компиляции, например. когда шеф-повар загружает все рецепты. Блок ruby ​​будет выполняться в режиме выполнения при времени схождения и не может получить доступ к переменной a.

Так самое простое решение может поставить атрибут в рубинового блока:

ruby_block "run command with argument #{node['some_var']}" do 
    block do 
     shell_out!("node mycommand.js #{node['some_var']}") 
    end 
    end 

Однако:

  1. Если вам не нужно выполнять Ruby-код, рассмотреть возможность использования execute или bash ресурс вместо.

  2. Имейте в виду, что у вас должно быть уникальное имя ресурса, если вы строите вокруг него какой-то цикл. Простым способом является поместить что-то уникальное в название ruby_block "something unique per loop iteration" do ... end

  3. То, что я действительно не понимаю, это код выхода 2. Это код ошибки. Это заставит шеф-повара бросать исключение каждый раз. (shell_out! выдает исключение, если код выхода! = 0, см. https://github.com/chef/chef/blob/master/lib/chef/mixin/shell_out.rb#L24-L28)

  4. Ресурс будет выполнен на каждом проходе повара. Это, вероятно, не в ваших интересах. Подумайте о добавлении защиты (теста), чтобы предотвратить ненужное выполнение, см. https://docs.chef.io/resource_common.html#guards