2013-05-21 18 views
5

ho provato l'esempio più semplice data dal http://docs.opscode.com/resource_cron.html#examplescuoco non può creare cron

cron "name_of_cron_entry" do 
     hour "8" 
     weekday "6" 
     mailto "[email protected]" 
     action :create 
    end 

Io uso coltello ssh per rendere la ricetta eseguito su un client chef, e il cliente dà errore:

Error executing action create on resource cron[name_of_cron_entry] 
Error updating state of name_of_cron_entry, exit: 1 

qualcuno ha già incontrato lo stesso problema? Qualche soluzione?

risposta

11

Mi sono imbattuto in questo stesso problema e ho scoperto che l'esempio che stavo usando aveva una nuova riga. Il problema era che il provider di cron esegue crontab -u user - e pipe STDIN per il processo. Sembra che non accetti newlines per qualsiasi motivo.

In /opt/chef/embedded/lib/ruby/gems/1.9.1/gems/chef-11.4.0/lib/chef/provider/cron.rb, ho trovato questo:

status = popen4("crontab -u #{@new_resource.user} -", :waitlast => true) do |pid, stdin, stdout, stderr| 
    stdin.write crontab 
    end 
    if status.exitstatus > 0 
     raise Chef::Exceptions::Cron, "Error updating state of #{@new_resource.name}, exit: #{status.exitstatus}" 
    end 

Stranamente, in esecuzione il tuo esempio sembra funzionare per me, e crea una voce crontab vuoto per root:

[email protected]:~# crontab -l 
# Chef Name: name_of_cron_entry 
[email protected] 
* 8 * * 6 

Ciò suggerisce a me che stai utilizzando una versione diversa dello chef gem & cron provider.

Quindi, a seconda della versione del gioiello cuoco che si sta utilizzando, potrebbe essere this bug

Per riferimento, l'esempio che non ha funzionato per me era basato su questo:

cron "cookbooks_report" do 
    action node.tags.include?('cookbooks-report') ? :create : :delete 
    minute "0" 
    hour "0" 
    weekday "1" 
    user "opscode" 
    mailto "[email protected]" 
    home "/srv/opscode-community-site/shared/system" 
    command %Q{ 
    cd /srv/opscode-community-site/current && 
    env RUBYLIB="/srv/opscode-community-site/current/lib" 
    RAILS_ASSET_ID=`git rev-parse HEAD` RAILS_ENV="#{rails_env}" 
    bundle exec rake cookbooks_report 
    } 
end 

Il comando stavo correndo era:

command %Q{ 
    cd /path/to/src/my-project && 
    bundle exec my_script.rb 
    } 

C'erano 2 correzioni che hanno lavorato per me:

  1. Usa command 'cd /path/to/src/my-project && bundle exec my_script.rb'
  2. Passaggio da cron fornitore a fornitore cron_d dal cron cookbook

Nota: Non credo la documentazione per entrambi i provider chef è corretto però ... newlines are not supported in the crontab format a meno che non sono sfuggiti con una barra rovesciata \. Nel mio test con la seconda correzione di cui sopra, il crontab risultante non era valido e aveva una nuova riga tra i comandi che non erano stati sfuggiti.

+0

questa ricetta prova a modificare il cron per un utente chiamato 'opscode' che, credo, manca all'ambiente – akiva

+0

@akiva: ho copiato l'esempio da [documentazione Chef] (https://docs.chef.io /resource_cron.html), "utente" opscode "' è quello che avevano impostato come esempio. Da allora hanno cambiato questo esempio in "utente" getchef "' ... Quando l'ho provato, ovviamente l'ho cambiato per adattarlo a un utente che esisteva per il mio caso d'uso. – TrinitronX

0

Ho appena eseguito per lo stesso errore da chef:

"Errore durante l'aggiornamento dello stato di name_of_cron_entry, uscita: 1"

Ma nel mio caso, la questione era un valore brutta giornata-del-mese da un'espressione condizionale.Se ritorno a capo in comando non è il tuo problema, assicurarsi che il resto della tua cron parametri si adattano ai requisiti:

  • minuti: 0-59

  • ore: 0-23

  • giorno del mese: 1-31

  • mese: 1-12 o Gen-Dic

  • giorno della settimana: 0-6 o SUN-SAT

  • anni: 1970-2099

0

le documentation afferma che quando un utente non è specificato in modo esplicito lo chef tenta di modificare cron della radice. questo, ovviamente, fallisce.

possibili correzioni: 1. specificano un utente nella vostra ricetta 2. run-cuoco valgono come root (sconsigliato)

+0

'chef-apply' è fuori portata qui, dovrebbe essere usato per le modifiche test/one shot su una workstation, non per la gestione. E lo chef-client dovrebbe essere eseguito come root, quindi non è assolutamente scoraggiato. (E FWIW, l'impostazione predefinita è root perché si suppone che lo chef venga eseguito come root). (Il commento in ritardo mi dispiace, ma per quanto valga la pena di dirlo) – Tensibai

0

Un altro motivo per questo errore potrebbe essere che il comando si sta cercando di aggiungere alla crontab potrebbe essere troppo lungo.

La lunghezza massima per un comando cron è 999 caratteri, vedere here.