我正在尝试在Chef中编写一个配方,但我仍然坚持如何在Linux中执行多行执行命令行。首先是配方,然后是我收到的错误输出。
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
以下是错误输出
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)
答案 0 :(得分:4)
因为我不想在没有向你展示如何做到(至少多一点)的情况下对问题和唯一答案进行投票,这里就是你。你的代码编写猴子创建了一个配方,添加 apt repo并安装包:
# 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"
您只需将apt食谱声明为metadata.rb
中的依赖项:
# metadata.rb
name 'whatever'
...
depends "apt"
当你习惯了它时,它真的很容易。额外奖励:它是幂等的。
答案 1 :(得分:1)
&&
是shell的逻辑and
运算符。您可以在shell中显式启动命令,例如:
execute 'Execute a shell' do
command "bash -c 'cmd1 && cmd2 && ..'"
end
或您使用bash resource:
bash 'Execute bash script'
code <<-EOH
cmd1 \
&& cmd2 \
&& ...
EOH
end