2014-10-15 14 views
12

Intro Ich lerne Chef, um das Server-Management bei der Arbeit zu automatisieren. Ich heruntergeladen Chefdk 3.0 von here und jetzt versuche ich mein erstes Kochbuch mit Koch zu bauen.Warum kann Koch meine Kochbücher nicht auflösen?

Wichtige ich dies für Testzwecke in einer Windows-Umgebung verwenden, ich erwarte, dass es zum Scheitern verurteilt, da Windows nicht iptables, aber ich erwarte nicht, es zu sagen scheitern, dass es nicht das Kochbuch finden . Ich habe versucht mit Windows cookbook und es funktioniert.

Das Problem Ich bin in der Lage, das Kochbuch zu erstellen und es auszuführen, aber ich bin nicht in der Lage Abhängigkeiten von Supermarkt verweisen.

Ich habe zwei Alternativen versucht:

Alternative 1

ich den folgenden Befehl ein, um das Kochbuch

chef generate cookbook learn_chef_httpd 

(von this tutorial)

Ich war in der Lage zu erstellen Vervollständige das Tutorial und nun würde ich gerne einen Verweis auf ein anderes Kochbuch testen, also wählte ich simple_iptables

Ich habe diese Zeile

cookbook 'simple_iptables', '~> 0.7.0' 

Zu meiner Berksfile, wie im Supermarkt beschrieben.

Dann habe ich diese Zeilen in meine default.rb Datei:

include_recipe 'simple_iptables' 

# Allow HTTP, HTTPS 
simple_iptables_rule "http" do 
    rule [ "--proto tcp --dport 80", 
     "--proto tcp --dport 443" ] 
    jump "ACCEPT" 
end 

Und ich laufe das Kochbuch mit:

chef-client --local-mode --runlist 'recipe[learn_chef_httpd]' 

Das Problem ist, dass Chef nicht das Kochbuch findet

Ich habe versucht, es zu den Metadaten hinzufügen:

depends 'simple_iptables', '~> 0.7.0' 

Aber ich immer noch einen Fehler:

Error Resolving Cookbooks for Run List: 
Missing Cookbooks: 

No such cookbook: simple_iptables 

Alternative 2

ich immer noch versuche, so zu machen, arbeitet ich auch versucht, es "der berkshelf Weg" zu machen, so dass ich erstellt ein neues Kochbuch.

berks cookbook test 

Und fügte ich diese Zeile

cookbook 'simple_iptables', '~> 0.7.0' 

Zu meiner Berksfile, wie im Supermarkt beschrieben.

Dann habe ich diese Zeilen in meine default.rb Datei:

include_recipe 'simple_iptables' 

# Allow HTTP, HTTPS 
simple_iptables_rule "http" do 
    rule [ "--proto tcp --dport 80", 
     "--proto tcp --dport 443" ] 
    jump "ACCEPT" 
end 

Ausgeführt berks installieren:

berks install

und es lief:

chef-client --local-mode --runlist 'recipe[test]' 

Der gleiche Fehler zurück kam

Chef::Exceptions::CookbookNotFound 
---------------------------------- 
Cookbook simple_iptables not found. If you're loading simple_iptables from anoth er cookbook, make sure you configure the dependency in your metadata 

Ich habe versucht, es auf die Metadaten hinzufügen:

depends 'simple_iptables', '~> 0.7.0' 

Aber ich immer noch einen Fehler:

Error Resolving Cookbooks for Run List: 
Missing Cookbooks: 

No such cookbook: simple_iptables 

ich im ~/berkshelf Ordner gesucht und die Kochbücher sind da.

** Alternative 3 **

ich eine CentOS 6.5 EC2-Instanz auf Amazon, installierte Ruby-2.1.3 und Chef gestartet. erstellt einen ~/Koch-repo/Kochbücher Ordner

ich ein Kochbuch mit berkshelf erstellt, lief

bundle install 

die Referenz/code wie in den anderen alterantives hinzugefügt dann

berks install 

und lief genauso, wie ich es letztes Mal gemacht habe.

Ich habe die gleichen Probleme.

Was fehlt mir? Was muss ich tun, damit es funktioniert?

+0

Handelt es sich um ‚diese Zeilen‘, um Ihre berksfile oder zu Ihrem default.rb Rezept? –

+0

Zum default.rb Rezept – JSBach

+0

Ich mag falsch sein, aber Sie haben nicht erwähnt, eine 'Berks-Installation' nach dem Ändern der Berksfile zu tun. Sie können auch den berks-Anbieter verwenden, um ein Verzeichnis mit allen benötigten Kochbüchern zu erstellen und den repo-Pfad des Chef-Clients auf dieses Verzeichnis zu verweisen. Alles in allem sind Ihre Kochbücher auf Ihrer Festplatte, aber nicht irgendwo Koch-Null-Look. – Tensibai

Antwort

13

Vergewissern Sie sich, dass Sie Ihre chef_repo_path wie in der docs beschrieben konfiguriert haben.

Grundsätzlich muss local-mode wissen, wo Ihre Kochbücher zu finden, Rollen, Umgebungen, Daten Taschen, etc. Leider ist die Dokumentation nicht super klar ist, wo/wie Sie gesetzt chef_repo_path

Hier ist, was ich von dem sagen kann, Code.

  1. wenn client.rb gefunden und enthält cookbook_path, chef_repo_path = "#{cookbook_path}/.."
  2. wenn knife.rb gefunden und enthält cookbook_path, chef_repo_path = "#{cookbook_path}/.."
  3. Chef kann versuchen, den Weg zu prophezeien. The code sucht von pwd aufwärts nach einem Verzeichnis mit dem Namen cookbooks suchen. Wenn es gefunden wird, wird cookbooks/.. als Ihr chef_repo_path festgelegt.
  4. Wenn alles andere fehlschlägt, pwd wird als Ihr chef_repo_path

verwendet werden Wenn Sie Berkshelf verwenden, Ihre beste Wette ist eine berks vendor zu tun, um ein einzelnes Verzeichnis wird alle der Kochbücher müssen Sie zu erhalten. Sie können dann auf den Übergeordneten Ordner des Verzeichnisses cookbooks verweisen, in dem sich Ihre bearbeiteten Kochbücher befinden.

Wohlgemerkt, das ist von 10 Minuten des Grabens im Quellcode, so dass ich es nicht ganz richtig haben kann.

+0

Wenn ich Berkshelf verwendet, sollte es in ~/.berkshelf befinden, oder? Sollte es nicht nach diesem Weg suchen? Ich habe versucht, andere Kochbücher zu verwenden (wie dieses https://supermarket.getchef.com/cookbooks/windows) und es funktioniert ... – JSBach

+0

kann ich nicht sicher sagen, da ich nicht lokalen Modus verwende. Mein Vorschlag ist, dass Sie 'berks vendor' verwenden, um alle Ihre Abhängigkeiten in einem einzigen Kochbuch-Ordner zu bündeln und dann den Kochbuchpfad explizit zuzuweisen. Selbst wenn es standardmäßig auf ~/.berkshelf eingestellt ist, werden Sie diesen Standort nicht lange verwenden wollen. Ziemlich schnell haben Sie mehrere Versionen von Kochbüchern sowie Datensäcke, Rollen oder Umgebungen. Du bist der beste Ansatz ist ein dedizierter Ort für diese Dinge. –

+0

Ich verstehe, das Problem ist, dass ich dieses Kochbuch zu Amazon OpsWorks hochladen werde, so dass ich nicht in der Lage sein werde, den Pfad und so weiter einzustellen. Es muss leider "out of the box" funktionieren :( – JSBach

1

Nach wenigen Stunden meines Geistes eine Kombination aus @kilian und @ gratzy die Antworten von here, das half,

cmd /c E: && cd /d E:\Items_CI Exploration\chef\chef-repo\cookbooks\ && chef-client --local-mode --runlist 'recipe[cisamplecookbooks::web]'

Ja, ohne die Anführungszeichen versuchen zu brechen. Beachten Sie auch das zuvor hinzugefügte "E:". Die Nummer von '&' machte keinen Unterschied.

"E:\Items_CI Exploration\chef\chef-repo\cookbooks\" Dies ist der Pfad, unter dem ich meine Kochbücher laufen lassen musste. Ich denke, der letzte Schrägstrich ("\") neben cookbooks ist auch wichtig.

1

Bei dem Versuch, lokal zum Testen ausgeführt zu werden, kam es zu dem gleichen Fehler wie "kann Kochbuch nicht auflösen". Da ich möglicherweise Kochbücher ohne einen Chef-Server betreiben möchte, aber auch ohne ChefDK, das für Nicht-Chef-Entwickler installiert wurde, um ein einfaches Einmal-Workstation-Setup durchzuführen, habe ich den folgenden Workflow zusammengestellt.

Ihr Kochbuch muss in einem Ordner unter einem Ordner namens Kochbücher leben, dies scheint "magisch" zu sein, aber es scheint überall zu leben, zB userdir/projects/cookbooks/my_cookbook_name/.

Wenn Sie eine Berksfile für die Abhängigkeiten, die Sie benötigen, diese vor Ort zu erhalten, bevor Sie chef-client -z -o my_cookbook_name so laufen berks vendor ausführen können die Abhängigkeiten in ein cookbooks Verzeichnis im aktuellen Ordner zu ziehen.

Der Befehl berks vendor zieht Ihre anderen Abhängigkeiten in das Verzeichnis der Kochbücher, so dass Chef-Zero/Chef-Solo sie finden kann. Führen Sie Folgendes in einer Administrator PowerShell-Eingabeaufforderung aus, es ist möglicherweise Command Prompt kompatibel, aber ich versuche, nicht zu ermutigen, cmd.exe zu verwenden.

cd /path/to/cookbooks/my_cookbook_name berks vendor . chef-client -z -o my_cookbook_name

Die Schönheit der neuen Koch-Null in den Client gebaut verwenden ist Sie müssen nicht unbedingt die volle ChefDK zu testen, ob Sie berkshelf benötigen für die berks auf mindestens 1 Maschine befehlen als Das ohne ChefDK zu installieren ist ein Albtraum. Sobald Sie berks haben, können Sie berks package ausführen und kopieren Sie die Datei, die es erstellt, auf eine Maschine mit nur dem Chef-Client und fügen Sie es irgendwo hinzu und führen Sie dann die chef-client -z -o your_cookbook in dem Verzeichnis, das den Ordner cookbooks enthält.

Um nur Chef zu bekommen, verwenden Sie den Omnibus-Installer und Sie haben genug, um einen Knoten zu laden oder das Rezept zu starten.

. { iwr -useb https://omnitruck.chef.io/install.ps1 } | iex; install -channel stable -project chef

Wenn Sie Ihren berks und wollen eine schnelle Art und Weise müssen die ChefDK zu bekommen, wird dies den Trick.

. { iwr -useb https://omnitruck.chef.io/install.ps1 } | iex; install -channel stable -project chefdk

Verwandte Themen