假设您有一个标准的 Chef 存储库,其目录如下:
cookbooks
data_bags
environments
roles
Run Code Online (Sandbox Code Playgroud)
有没有办法一次性全部上传?否则你必须这样做:
knife cookbook upload -a
knife data bag from file data_bags/*.json
knife environment from file environments/*.rb
knife role from file roles/*.json
Run Code Online (Sandbox Code Playgroud)
也许有第三方工具可以做这种事情?
您可以编写一个简单的 bash 脚本来执行此操作:
#!/bin/sh
for file in `ls cookbooks`;do
[ -d $file ] && knife cookbook upload cookbooks/$file
done
for file in `ls data_bags | grep \.json$`;do
knife data bag from file data_bags/$file
done
for file in `ls environments | grep \.rb$`;do
knife environment from file environments/$file
done
for file in `ls roles | grep \.json$`;do
knife role from file roles/$file
done
Run Code Online (Sandbox Code Playgroud)
然后使用 ./script.sh 调用它,这将自动执行所有操作。
小智 3
确保您使用的是 ruby 1.9,然后安装 Knife-essentials
$ gem install knife-essentials
Run Code Online (Sandbox Code Playgroud)
然后将以下内容添加到 ~/.chef/knife.rb
repo_mode 'everything'
versioned_cookbooks true
chef_repo_path 'PATH/TO/chef-repo'
Run Code Online (Sandbox Code Playgroud)
然后您可以下载/上传整个服务器或其中的一部分。下载后会将大量 .json 文件放入您的 Chef-repo 中,这对我发现的备份很有用。
$ knife download /
$ knife upload /
$ knife upload /clients
Run Code Online (Sandbox Code Playgroud)
另请注意,如果您将角色存储为 ruby 文件(例如:roles/*.rb
),则需要将它们转换为 json。然后你可以从 Chef 服务器重新下载它们作为 json。例如:
knife role from file roles/*.rb
knife download roles/
该方法也用于厨师服务器10升级至11。