2016-08-02 6 views
-1

Ich versuche, ein Rezept in Chef schreiben, aber ich bin fest, wie ich eine mehrzeilige Ausführung in der Befehlszeile in Linux tun kann. Erstens ist das Rezept und das Folgen ist die Fehlerausgabe, die ich erhalte.Chef Multi line Befehl

node['freeswitch']['source']['dependencies'].each { |d| package d } 

execute "apt_update" do 
    command "wget -O - https://files.freeswitch.org/repo/deb/debian/freeswitch_archive_g0.pub | apt-key add -&&" 
    "echo "deb http://files.freeswitch.org/repo/deb/freeswitch-1.6/ jessie main" > /etc/apt/sources.list.d/freeswitch.list &&" 
    "apt-get update &&" 
    "apt-get install -y --force-yes freeswitch-video-deps-most &&" 

    # because we're in a branch that will go through many rebases it's 
    # better to set this one, or you'll get CONFLICTS when pulling (update) 
    git config --global pull.rebase true 
end 

Unten ist die Fehlerausgabe

NoMethodError 
------------- 
No resource or method named `command' for `Chef::Recipe "source"' 

Cookbook Trace: 
--------------- 
/var/chef/cache/cookbooks/freeswitch/recipes/source.rb:6:in `from_file' 
/var/chef/cache/cookbooks/freeswitch/recipes/default.rb:5:in `from_file' 
Relevant File Content: 
---------------------- 
/var/chef/cache/cookbooks/freeswitch/recipes/source.rb: 

1: #include_recipe 'apt' 
2: 
3: node['freeswitch']['source']['dependencies'].each { |d| package d } 
4: 
5: execute "apt_update" 
6>> command 'wget -O - https://files.freeswitch.org/repo/deb/debian/freeswitch_archive_g0.pub | apt-key add -'&& 
7: 'echo "deb http://files.freeswitch.org/repo/deb/freeswitch-1.6/ jessie main" > /etc/apt/sources.list.d/freeswitch.list' && 
8:   'apt-get update' && 
9:   'apt-get install -y --force-yes freeswitch-video-deps-most' && 
10: 
11: # because we're in a branch that will go through many rebases it's 
12: # better to set this one, or you'll get CONFLICTS when pulling (update) 
13:   'git config --global pull.rebase true' 
14: 
15: execute "git_clone" do 

Platform: 
--------- 
x86_64-linux 


Running handlers: 
[2016-08-02T09:19:35+01:00] ERROR: Running exception handlers 
Running handlers complete 
[2016-08-02T09:19:35+01:00] ERROR: Exception handlers complete 
Chef Client failed. 0 resources updated in 01 seconds 
[2016-08-02T09:19:35+01:00] FATAL: Stacktrace dumped to /var/chef/cache/chef-stacktrace.out 
[2016-08-02T09:19:35+01:00] FATAL: Please provide the contents of the stacktrace.out file if you file a bug report 
[2016-08-02T09:19:35+01:00] ERROR: No resource or method named `command' for `Chef::Recipe "source"' 
[2016-08-02T09:19:35+01:00] FATAL: Chef::Exceptions::ChildConvergeError: Chef run process exited unsuccessfully (exit code 1) 
+1

Gewöhnen Sie sich an Chef und uns die entsprechenden Ressourcen, zB [remote_file] (https://docs.chef.io/resource_remote_file.html), das [apt Kochbuch] (https://supermarket.chef.io/ Kochbücher/apt) und die Ressource [package] (https://docs.chef.io/resource_package.html). Verwenden Sie Chef nicht nur als Runner für Shell-Skripts. Du wirst damit keinen Spaß haben. – StephenKing

+0

In diesem Fall ist die Ausführung von der Quelle die bevorzugte Option. – jaseUK

Antwort

0

Die && ist der logische Operator and einer Schale. Entweder Sie explizit den Befehl in einer Shell starten, wie:

execute 'Execute a shell' do 
    command "bash -c 'cmd1 && cmd2 && ..'" 
end 

oder Sie verwenden die bash resource:

bash 'Execute bash script' 
    code <<-EOH 
    cmd1 \ 
    && cmd2 \ 
    && ... 
    EOH 
end 
+0

Bitte sagen Sie ihm nicht, es so zu tun. – StephenKing

+0

@StephenKing Ich sehe, die Verwendung der "Apt" Ressource scheint hier angemessener. Wenn ich die Zeit finde, bereite ich ein solches Beispiel vor. Haben Sie keinen Chef bei den Händen atm. – hek2mgl

2

Wie ich will nicht nach unten Abstimmung sowohl Frage und die einzige Antwort, ohne zu zeigen, Sie, wie es geht (zumindest ein bisschen mehr) richtig, hier sind Sie. Ihr Code Schreiben Affe erstellt ein Rezept, das die apt Repo fügt und installiert das Paket:

# recipes/default.rb 

# the package resource can handle multiple packages at once 
package node['freeswitch']['source']['dependencies'] 

# set up a new apt repo, import the key, automatically triggers `apt-get update` 
apt_repository "freeswitch" do 
    key "https://files.freeswitch.org/repo/deb/debian/freeswitch_archive_g0.pub" 
    uri "http://files.freeswitch.org/repo/deb/freeswitch-1.6/" 
    components ['main'] 
    distribution node['lsb']['codename'] 
end 

# finally, install this package. You could even merge the first line with this one. 
package "freeswitch-video-deps-most" 

Sie müssen nur erklären, das apt Kochbuch als Abhängigkeit in Ihrem metadata.rb:

# metadata.rb 
name 'whatever' 
... 

depends "apt" 

Es ist wirklich einfach, wenn man sich daran gewöhnt. Bonus: es ist idempotent.