Chef - 编写脚本
Chef - Source a Script
我在使用 rbenv
和 Chef 安装 Ruby 2.1 时遇到问题。我以为我会使用 RVM
。安装 RVM 时,如果我们要立即使用它,我们需要获取脚本。
source /path/to/rvm/script
你会如何在 Chef 中执行此操作?
我尝试过但没有成功。我认为这是一个采购问题,因为食谱第一次坏了,但第二次运行良好。这应该是因为 RVM 脚本来源于 the.bash_profile 并且当登录它时源脚本和 RVM 变得可用。
bash "Source RVM Script: source /etc/profile.d/rvm.sh" do
code "source /etc/profile.d/rvm.sh"
end
==> default: * bash[source /etc/profile.d/rvm.sh] action run
==> default: [2021-06-03T15:26:00+00:00] INFO: bash[source /etc/profile.d/rvm.sh] ran successfully
==> default:
==> default: - execute "bash"
==> default: * bash[Install Ruby 2.1.10] action run
==> default: [execute]
==> default: bash: line 1: rvm: command not found
==> default:
==> default:
==> default: ================================================================================
==> default:
==> default: Error executing action `run` on resource 'bash[Install Ruby 2.1.10]'
==> default:
==> default: ================================================================================
==> default:
==> default:
==> default: Mixlib::ShellOut::ShellCommandFailed
==> default:
==> default: ------------------------------------
==> default:
==> default: Expected process to exit with [0], but received '127'
==> default:
==> default: ---- Begin output of "bash" ----
==> default:
==> default: STDOUT:
==> default:
==> default: STDERR: bash: line 1: rvm: command not found
详情
我写的简单 RVM 食谱:
# sudo apt-get install software-properties-common
apt_package "software-properties-common"
# sudo apt-add-repository -y ppa:rael-gc/rvm
# sudo apt-get update
apt_repository 'rvm' do
uri 'ppa:rael-gc/rvm'
action :add
end
# sudo apt-get install rvm
apt_package "rvm"
# sudo usermod -a -G rvm $USER
group "rvm" do
append true
members "vagrant"
end
bash "source /etc/profile.d/rvm.sh" do
code "source /etc/profile.d/rvm.sh"
end
bash "Install Ruby 2.1.0" do
code "rvm install 2.1.0"
end
平台:
- 主机:macOS Catalina
- 客人:Ubuntu 20.04
- Chef Solo + Vagrant + VirtualBox(本地开发)
# -*- mode: ruby -*-
# vi: set ft=ruby :
cookbook_path = "/Volumes/Dev/Work/GF/Projects/gf-cookbook"
Vagrant.configure("2") do |config|
config.vm.provider "virtualbox" do |vbox|
vbox.memory = 1024 * 4
vbox.cpus = 2
end
config.vm.provision "chef_solo" do |chef|
# chef.install = false
chef.custom_config_path = "#{cookbook_path}/config.chef"
chef.cookbooks_path = ["#{cookbook_path}/berks-cookbooks"]
chef.nodes_path = "#{cookbook_path}/nodes"
chef.add_recipe "gf"
end
end
shell 收敛时间(chef-client 运行)中的命令在子 shell 中 运行ning。所以当你执行以下
bash "source /etc/profile.d/rvm.sh" do
code "source /etc/profile.d/rvm.sh"
end
只对当前子shell有效。这就是为什么前面的 bash
资源没有选择在 source /etc/profile.d/rvm.sh
.
期间设置的任何内容
你可以通过 运行在同一个 shell 上使用两个命令来解决这个问题
bash "rvm" do
code "source /etc/profile.d/rvm.sh && rvm install 2.1.0"
end
或利用 flag
属性 执行登录,如
bash "source /etc/profile.d/rvm.sh" do
code "source /etc/profile.d/rvm.sh"
end
bash "Install Ruby 2.1.0" do
code "rvm install 2.1.0"
flags "-l"
end
你在第二个 chef-client 上为你工作 运行 因为它在第一个(失败)上配置后读取用户配置文件 运行.
我在使用 rbenv
和 Chef 安装 Ruby 2.1 时遇到问题。我以为我会使用 RVM
。安装 RVM 时,如果我们要立即使用它,我们需要获取脚本。
source /path/to/rvm/script
你会如何在 Chef 中执行此操作?
我尝试过但没有成功。我认为这是一个采购问题,因为食谱第一次坏了,但第二次运行良好。这应该是因为 RVM 脚本来源于 the.bash_profile 并且当登录它时源脚本和 RVM 变得可用。
bash "Source RVM Script: source /etc/profile.d/rvm.sh" do
code "source /etc/profile.d/rvm.sh"
end
==> default: * bash[source /etc/profile.d/rvm.sh] action run
==> default: [2021-06-03T15:26:00+00:00] INFO: bash[source /etc/profile.d/rvm.sh] ran successfully
==> default:
==> default: - execute "bash"
==> default: * bash[Install Ruby 2.1.10] action run
==> default: [execute]
==> default: bash: line 1: rvm: command not found
==> default:
==> default:
==> default: ================================================================================
==> default:
==> default: Error executing action `run` on resource 'bash[Install Ruby 2.1.10]'
==> default:
==> default: ================================================================================
==> default:
==> default:
==> default: Mixlib::ShellOut::ShellCommandFailed
==> default:
==> default: ------------------------------------
==> default:
==> default: Expected process to exit with [0], but received '127'
==> default:
==> default: ---- Begin output of "bash" ----
==> default:
==> default: STDOUT:
==> default:
==> default: STDERR: bash: line 1: rvm: command not found
详情
我写的简单 RVM 食谱:
# sudo apt-get install software-properties-common
apt_package "software-properties-common"
# sudo apt-add-repository -y ppa:rael-gc/rvm
# sudo apt-get update
apt_repository 'rvm' do
uri 'ppa:rael-gc/rvm'
action :add
end
# sudo apt-get install rvm
apt_package "rvm"
# sudo usermod -a -G rvm $USER
group "rvm" do
append true
members "vagrant"
end
bash "source /etc/profile.d/rvm.sh" do
code "source /etc/profile.d/rvm.sh"
end
bash "Install Ruby 2.1.0" do
code "rvm install 2.1.0"
end
平台:
- 主机:macOS Catalina
- 客人:Ubuntu 20.04
- Chef Solo + Vagrant + VirtualBox(本地开发)
# -*- mode: ruby -*-
# vi: set ft=ruby :
cookbook_path = "/Volumes/Dev/Work/GF/Projects/gf-cookbook"
Vagrant.configure("2") do |config|
config.vm.provider "virtualbox" do |vbox|
vbox.memory = 1024 * 4
vbox.cpus = 2
end
config.vm.provision "chef_solo" do |chef|
# chef.install = false
chef.custom_config_path = "#{cookbook_path}/config.chef"
chef.cookbooks_path = ["#{cookbook_path}/berks-cookbooks"]
chef.nodes_path = "#{cookbook_path}/nodes"
chef.add_recipe "gf"
end
end
shell 收敛时间(chef-client 运行)中的命令在子 shell 中 运行ning。所以当你执行以下
bash "source /etc/profile.d/rvm.sh" do
code "source /etc/profile.d/rvm.sh"
end
只对当前子shell有效。这就是为什么前面的 bash
资源没有选择在 source /etc/profile.d/rvm.sh
.
你可以通过 运行在同一个 shell 上使用两个命令来解决这个问题
bash "rvm" do
code "source /etc/profile.d/rvm.sh && rvm install 2.1.0"
end
或利用 flag
属性 执行登录,如
bash "source /etc/profile.d/rvm.sh" do
code "source /etc/profile.d/rvm.sh"
end
bash "Install Ruby 2.1.0" do
code "rvm install 2.1.0"
flags "-l"
end
你在第二个 chef-client 上为你工作 运行 因为它在第一个(失败)上配置后读取用户配置文件 运行.