Как я могу отобразить вывод команды Opscode Chef bash в моей консоли?
Я использую Vagrant для создания стандартного "точного32" окна и предоставления его шеф-поваром, поэтому я могу проверить свой код Node.js на Linux, когда я работаю на компьютере с Windows. Это прекрасно работает.
У меня также есть эта команда bash, поэтому она автоматически устанавливает мои модули npm:
bash "install npm modules" do
code <<-EOH
su -l vagrant -c "cd /vagrant && npm install"
EOH
end
Это также отлично работает, за исключением того, что я никогда не вижу вывод консоли, если он завершается успешно. Но я хотел бы видеть это, чтобы мы могли визуально следить за тем, что происходит. Это не относится к npm.
Я вижу этот похожий вопрос без конкретных ответов: Vagrant - как печатать вывод команды Chef в stdout?
Я попытался указать флаги, но я ужасный linux/ruby n00b и создаю либо ошибки, либо вообще не выводя, поэтому, пожалуйста, отредактируйте мой фрагмент примера вашего решения.
Ответы
Ответ 1
Когда вы запускаете chef - предположим, что мы используем chef-solo
, вы можете использовать -l debug
для вывода дополнительной информации об отладке в stdout.
Например: chef-solo -c solo.rb -j node.json -l debug
Например, простая кулинарная книга, как показано ниже:
$ 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
Вы увидите следующий вывод, как показано ниже:
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
Я думаю, что он содержит нужную вам информацию. Например, вывод и статус выхода оболочки script/command.
BTW: похоже, есть ограничение (подсказка для пароля?), вы не сможете использовать 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
Ответ 2
Я пытаюсь использовать ведение журнала, когда это возможно, но я обнаружил, что в некоторых сценариях важно видеть выход. Вот короткая версия того, как я это делаю. Подстановка ресурса выполнения для ресурса bash также отлично работает. Как стандартная ошибка, так и стандартный вывод идут в файл.
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
Ответ 3
Используйте атрибут live_stream
ресурса execute
execute 'foo' do
command 'cat /etc/hosts'
live_stream true
action :run
end
Script вывод будет распечатан на консоль
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
Ответ 4
Я использовал следующее:
bash "install npm modules" do
code <<-EOH
su -l vagrant -c "cd /vagrant && npm install"
EOH
flags "-x"
end
Свойство flags заставляет команду выполняться как bash -x script.sh
Ответ 5
Вид связанного... с установкой log_location
(-L
) в файл не позволяет журналам шеф-повара (Chef::Log.info()
или просто log
) перейти на стандартную версию.
Вы можете переопределить это, чтобы распечатать полную информацию журнала в stdout
chef-client -L /dev/stdout