Chef – 环境变量

环境变量是令Chef Recipe在任何特定节点上成功运行的关键。我们可以手动设置,也可以使用Shell脚本设置。在这里我们通过Recipe来设置。

首先,需要Cookbook,我们将使用test_cookbook和一个包含test_cookook的运行列表。

使用Chef Recipe设置环境变量

步骤1- 用环境变量更新Cookbook的默认Recipe。

[email protected]:~/chef-repo $ subl cookbooks/test_cookbook/recipes/default.rb  
ENV['MESSAGE'] = 'Testing environment variable update with chef !'  
execute 'print value of environment variable $MESSAGE' do 
   command 'echo $MESSAGE > /tmp/message' 
end

第2步- 将更新的Cookbook上传到服务器。

[email protected]:~/chef-repo $ knife cookbook upload test_cookbook 
Uploading my_cookbook [0.1.0] 

第3步- 运行Chef客户端创建一个临时文件。

[email protected]:~$ sudo chef-client 
...TRUNCATED OUTPUT... 
[2013-01-25T15:01:57+00:00] INFO: Processing execute[print 
value of environment variable $MESSAGE] action run 
(my_cookbook::default line 11) 
[2013-01-25T15:01:57+00:00] INFO: execute[print value of 
environment variable $MESSAGE] ran successfully 
...TRUNCATED OUTPUT... 

验证变量

[email protected]:~$ cat /tmp/message 
Hello from Chef

如何工作

Ruby通过ENV- a散列来输出当前的环境变量以读取和修改环境变量。

Execute Resource

我们也可以使用Execute Resource在Cookbook的Chef默认Recipe中实现同样的功能。

[email protected]:~/chef-repo $ subl cookbooks/test_cookbook/recipes/default.rb  
execute 'print value of environment variable $MESSAGE' do 
   command 'echo $MESSAGE > /tmp/message' 
   environment 'MESSAGE' => 'Hello from the execute resource' 
end 

注意- 使用ENV设置一个环境变量会使变量在整个Chef运行期间都可用。相比之下,将它传递给Execute Resource只会使它可用于由资源执行的那一个命令。