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.
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
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
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
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
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