2013-07-23 63 views
12

Tôi sử dụng Vagrant để sinh ra một hộp "exact32" chuẩn và cung cấp nó với Chef để tôi có thể kiểm tra mã Node.js trên Linux khi tôi làm việc trên máy Windows. Điều này hoạt động tốt.Làm cách nào để hiển thị đầu ra của lệnh bash Chef Opscode trong bảng điều khiển của tôi?

Tôi cũng có lệnh bash này để nó tự động cài đặt các module NPM tôi:

bash "install npm modules" do 
    code <<-EOH 
    su -l vagrant -c "cd /vagrant && npm install" 
    EOH 
end 

này cũng hoạt động tốt ngoại trừ việc tôi không bao giờ nhìn thấy giao diện điều khiển đầu ra nếu nó hoàn thành thành công. Nhưng tôi muốn xem nó để chúng tôi có thể theo dõi trực quan những gì đang xảy ra. Điều này không dành riêng cho npm.

tôi thấy câu hỏi tương tự này không có câu trả lời cụ thể: Vagrant - how to print Chef's command output to stdout?

tôi đã cố gắng xác định cờ nhưng tôi là một linux khủng khiếp/ruby ​​n00b và tạo lỗi hoặc không có đầu ra ở tất cả, vì vậy hãy chỉnh sửa đoạn mã của tôi với một ví dụ về giải pháp của bạn.

Trả lời

9

Khi bạn chạy đầu bếp - giả sử chúng tôi đang sử dụng chef-solo, bạn có thể sử dụng -l debug để xuất thêm thông tin gỡ lỗi vào chế độ xuất chuẩn.

Ví dụ: chef-solo -c solo.rb -j node.json -l debug

Ví dụ, một sách dạy nấu ăn đơn giản như sau:

$ tree 
. 
├── cookbooks 
│   └── main 
│    └── recipes 
│     └── default.rb 
├── node.json 
└── solo.rb 

3 directories, 3 files 

default.rb

bash "echo something" do 
    code <<-EOF 
    echo 'I am a chef!' 
    EOF 
end 

Bạn sẽ thấy đầu ra sau như dưới đây:

Compiling Cookbooks... 
[2013-07-24T15:49:26+10:00] DEBUG: Cookbooks to compile: [:main] 
[2013-07-24T15:49:26+10:00] DEBUG: Loading Recipe main via include_recipe 
[2013-07-24T15:49:26+10:00] DEBUG: Found recipe default in cookbook main 
[2013-07-24T15:49:26+10:00] DEBUG: Loading from cookbook_path: /data/DevOps/chef/cookbooks 
Converging 1 resources 
[2013-07-24T15:49:26+10:00] DEBUG: Converging node optiplex790 
Recipe: main::default 
    * bash[echo something] action run[2013-07-24T15:49:26+10:00] INFO: Processing bash[echo something] action run (main::default line 4) 
[2013-07-24T15:49:26+10:00] DEBUG: Platform ubuntu version 13.04 found 
I am a chef! 
[2013-07-24T15:49:26+10:00] INFO: bash[echo something] ran successfully 

    - execute "bash" "/tmp/chef-script20130724-17175-tgkhkz" 

[2013-07-24T15:49:26+10:00] INFO: Chef Run complete in 0.041678909 seconds 
[2013-07-24T15:49:26+10:00] INFO: Running report handlers 
[2013-07-24T15:49:26+10:00] INFO: Report handlers complete 
Chef Client finished, 1 resources updated 
[2013-07-24T15:49:26+10:00] DEBUG: Forked child successfully reaped (pid: 17175) 
[2013-07-24T15:49:26+10:00] DEBUG: Exiting 

Tôi nghĩ rằng nó chứa thông tin bạn muốn. Ví dụ, đầu ra và trạng thái thoát của lệnh shell script/lệnh.

BTW: trông giống như có một giới hạn (nhắc cho mật khẩu?), Bạn sẽ không thể sử dụng su

[2013-07-24T15:46:10+10:00] INFO: Running queued delayed notifications before re-raising exception 
[2013-07-24T15:46:10+10:00] DEBUG: Re-raising exception: Mixlib::ShellOut::ShellCommandFailed - bash[echo something] (main::default line 4) had an error: Mixlib::ShellOut::ShellCommandFailed: Expected process to exit with [0], but received '1' 
---- Begin output of "bash" "/tmp/chef-script20130724-16938-1jhil9v" ---- 
STDOUT: 
STDERR: su: must be run from a terminal 
---- End output of "bash" "/tmp/chef-script20130724-16938-1jhil9v" ---- 
Ran "bash" "/tmp/chef-script20130724-16938-1jhil9v" returned 1 
+1

Tôi đang chạy đầu bếp-độc tấu 11.8.0 và tôi nhận được không có đầu ra sử dụng mức log gỡ lỗi bằng một tiếng vang trong một bash kịch bản. Điều này có thay đổi không? –

+0

nvm, đó là bởi vì tôi đã chạy đầu bếp-solo thông qua vagrant –

+0

@JoshNankin làm thế nào bạn có được vagrant để sản lượng echo-stuff? – pkyeck

14

tôi cố gắng sử dụng khai thác gỗ khi có thể, nhưng tôi đã thấy rằng trong một số tình huống nhìn thấy đầu ra là quan trọng. Đây là phiên bản ngắn của cách tôi làm điều đó. Thay thế tài nguyên thực thi cho tài nguyên bash cũng hoạt động tốt. Cả hai lỗi tiêu chuẩn và đầu ra tiêu chuẩn đi vào tập tin.

results = "/tmp/output.txt" 
file results do 
    action :delete 
end 

cmd = "ls /" 
bash cmd do 
    code <<-EOH 
    #{cmd} &> #{results} 
    EOH 
end 

ruby_block "Results" do 
    only_if { ::File.exists?(results) } 
    block do 
     print "\n" 
     File.open(results).each do |line| 
      print line 
     end 
    end 
end 
+2

Điều đó hoạt động Tom. Thay vì vòng lặp, bạn cũng có thể sử dụng in File.read (kết quả). – max

+0

Một tùy chọn khác để sử dụng thay vì vòng lặp: 'Đầu bếp :: Log.info (IO.read (kết quả))' – Joe

+0

Bình luận tốt Joe, ruby ​​không phải là ngôn ngữ lập trình đầu tiên, thứ hai hoặc thứ ba của tôi vì vậy tôi không biết phím tắt. –

0

Loại liên quan ... thiết lập các log_location (-L) vào một tập tin ngăn chặn các bản ghi đầu bếp (Chef::Log.info() hoặc đơn giản là log) từ sẽ chuẩn ra.

Bạn có thể ghi đè này để in các thông tin log đầy đủ để thiết bị xuất chuẩn

chef-client -L /dev/stdout 
1

tôi sử dụng như sau:

bash "install npm modules" do 
    code <<-EOH 
    su -l vagrant -c "cd /vagrant && npm install" 
    EOH 
    flags "-x" 
end 

Thuộc tính flags làm cho các lệnh thực thi như bash -x script.sh

2

Sử dụng live_stream thuộc tính của tài nguyên execute

execute 'foo' do 
    command 'cat /etc/hosts' 
    live_stream true 
    action :run 
end 

Script đầu ra sẽ được in ra cửa sổ Console

Starting Chef Client, version 12.18.31 
    resolving cookbooks for run list: ["apt::default", "foobar::default"] 
    Synchronizing Cookbooks: 
    Converging 2 resources 
    Recipe: foobar::default 
    * execute[foo] action run 
     [execute] 127.0.0.1 default-ubuntu-1604 default-ubuntu-1604 
      127.0.0.1 localhost 
      127.0.1.1 vagrant.vm vagrant 
      ::1  localhost ip6-localhost ip6-loopback 
      ff02::1 ip6-allnodes 
      ff02::2 ip6-allrouters 
     - execute cat /etc/hosts 

https://docs.chef.io/resource_execute.html