web-dev-qa-db-fra.com

Comment afficher la sortie d'une commande bash Opscode Chef dans ma console?

J'utilise Vagrant pour générer une boîte "precise32" standard et je la provisionne avec Chef pour que je puisse tester mon code Node.js sur Linux lorsque je travaille sur une machine Windows. Cela fonctionne bien.

J'ai également cette commande bash donc elle installe automatiquement mes modules npm:

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

Cela fonctionne également très bien, sauf que je ne vois jamais la sortie de la console si elle se termine avec succès. Mais j'aimerais le voir afin que nous puissions surveiller visuellement ce qui se passe. Ce n'est pas spécifique à npm.

Je vois cette question similaire sans réponses concrètes: Vagrant - comment imprimer la sortie de la commande de Chef sur stdout?

J'ai essayé de spécifier des drapeaux mais je suis un terrible linux/Ruby n00b et je crée des erreurs ou aucune sortie, veuillez donc modifier mon extrait de code avec un exemple de votre solution.

17
Bartvds

Lorsque vous exécutez chef - supposons que nous utilisons chef-solo, vous pouvez utiliser -l debug pour afficher plus d'informations de débogage dans stdout.

Par exemple: chef-solo -c solo.rb -j node.json -l debug

Par exemple, un livre de cuisine simple comme ci-dessous:

$ 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

Vous verrez la sortie suivante comme ci-dessous:

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

Je pense qu'il contient les informations que vous souhaitez. Par exemple, la sortie et l'état de sortie du script/commande Shell.

BTW: il semble qu'il y ait une limitation (Demander un mot de passe?), Vous ne pourrez pas utiliser 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
9
Terry Wang

J'essaie d'utiliser la journalisation lorsque cela est possible, mais j'ai constaté que dans certains scénarios, la sortie est importante. Voici la version courte de la façon dont je le fais. La substitution de la ressource d'exécution à la ressource bash fonctionne également correctement. L'erreur standard et la sortie standard entrent dans le fichier.

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
15
Tom Weiss

Utilisez le live_stream attribut de la ressource execute

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

La sortie du script sera imprimée sur la 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

11
spuder

J'ai utilisé ce qui suit:

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

La propriété flags fait exécuter la commande comme bash -x script.sh

2
Shoan

Type de relation ... la définition de log_location (-L) Dans un fichier empêche les journaux du chef (Chef::Log.info() ou simplement log) de passer à la norme en dehors.

Vous pouvez remplacer cela pour imprimer les informations complètes du journal sur stdout

chef-client -L /dev/stdout
0
KCD