2015-01-05 2 views
0

Я читаю файл внутри ruby_block в шеф-поваре. Я сохраняю каждую строку в массиве. Я хочу, чтобы они были доступны в любом месте рецепта моего шеф-повара, поэтому я немного поработал и выяснил, что могу использовать объект-узел.Как сохранить массив в поваре объектов узла?

Проблема заключается в том, что когда я использую объект-узел, он сохраняет только последнюю строку, а не каждую строку.

Это мой код. Какие-либо предложения?

ruby_block "name" do 
    block do 
    CSV.foreach('/tmp/users.txt') do |row| 
    node['username']=row 
    end 
    end 
    action :run # see actions section below 
end 

Итак, теперь это мой код.

ruby_block 'name' do 
    block do 
    CSV.foreach('/tmp/users.txt'){ |row| node.run_state['username123'] |= [row] } 
    end 
end 

directory "/sftp/#{node.run_state['username123']}/incoming" do 
    action :create 
    recursive true 
end 

и мои выходы шеф-повара подходят.

directory[/sftp//incoming] action create 
- create new directory /sftp//incoming 

ответ

2

SEE новый ответ (не хочу никого смущать с комментариями)

Два варианта. Если вы действительно хотите использовать этот узел, вам нужно использовать массив, которым вы не являетесь.

ruby_block 'name' do 
    block do 
    CSV.foreach('/tmp/users.txt'){ |row| node['username'] |= [row] } 
    end 
end 

Но, если вы не хотите, что информация будет храниться в объекте узла на сервере, я хотел бы предложить вам на самом деле хранить его в run_state

ruby_block 'name' do 
    block do 
    CSV.foreach('/tmp/users.txt'){ |row| node.run_state['username'] |= [row] } 
    end 
end 

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

+0

Привет, Файл имеет некоторый контент, но мой объект-узел, но мой объект-объект не имеет значения. В этом случае вы, вероятно, будете лучше создавать LWRP. я не уверен, что происходит. Можете ли вы что-нибудь посоветовать? –

+0

Вы пробовали код, который я разместил? Вы также можете добавить сообщение Chef :: Log.warn внутри блока ruby, чтобы убедиться, что вы правильно .. разбор файла –

+0

Да я использовал свой код Это то, что мой код выглядит '«имя»ruby_block сделать блок сделать CSV.foreach («/ TMP/users.txt») {|. строка | узел ,run_state [ 'username123'] | = [строка]} конец end' каталог ' "/ SFTP/# {узел [ 'username123']}/входящий" сделать действия: создать рекурсивный истинную end' Это мой выход. Я не уверен, что я делаю неправильно. 'directory [/ sftp // incoming] action create - создать новый каталог/sftp // incoming' –

1

ОК, поэтому ваша проблема связана с двухэтапным характером шеф-повара. Вы объявляете свои каталоги на этапе «компиляции», но вы пытаетесь сделать это с данными изнутри вашего ruby_block, который не выполняется до второго этапа. Если вы CSV файл не помещается на место шеф-поваром, вы можете сделать это:

# notice this is not in a ruby block 
CSV.foreach('/tmp/users.txt'){ |row| node.run_state['username123'] |= [row] } 

node.run_state['username123'].each do |next_file| 
    directory "/sftp/next_file/incoming" do 
    action :create 
    recursive true 
    end 
end 

Если файл CSV помещается в место шеф-поваром, вам нужно, чтобы заставить его быть там до CSV синтаксический анализ. Вы МОГЛИ быть в состоянии сделать это:

cookbook_file 'mycsv file' do 
    ... 
end.run_action(:create) 

в каком-то момент до вашего CSV разбора.

+0

Большое спасибо. Я уже использовал метод, который вы упомянули. Вместо того, чтобы хранить их в объекте узла, я использую массив ruby. Я использую файл шаблона для создания файла csv. Единственное, чего мне не хватало, было .run_action (: create), поскольку я не смог разобрать файл в первом профайле. Это сработало –

Смежные вопросы