假设您有一个标准的 Chef 存储库,其目录如下:
cookbooks
data_bags
environments
roles
有没有办法一次性上传所有内容?否则你必须这样做:
knife cookbook upload -a
knife data bag from file data_bags/*.json
knife environment from file environments/*.rb
knife role from file roles/*.json
也许有第三方工具可以做这种事?
答案1
确保您使用的是 ruby 1.9,然后安装 knife-essentials
$ gem install knife-essentials
然后将以下内容添加到 ~/.chef/knife.rb
repo_mode 'everything'
versioned_cookbooks true
chef_repo_path 'PATH/TO/chef-repo'
然后,您可以下载/上传整个服务器,或仅下载部分服务器。下载会将大量 .json 文件放入 chef-repo 中,我发现这对备份很有用。
$ knife download /
$ knife upload /
$ knife upload /clients
另请注意,如果您将角色存储为 ruby 文件(例如roles/*.rb
:),则需要将其转换为 json。然后您可以从 chef 服务器以 json 格式重新下载它们。例如:
knife role from file roles/*.rb
knife download roles/
该方法还用于从 chef server 10 升级到 11。
答案2
您可以编写一个简单的 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
然后使用 ./script.sh 调用它,它将自动完成所有操作。
答案3
我编写了一个名为 sync-all 的小刀插件(如下所述),它也可以实现这一点:
https://github.com/cdoughty77/knife-sync-all
答案4
来自 chef 存储库。
如果你执行它,knife upload .
它会上传所有内容。