使用 Knife 上传所有内容

使用 Knife 上传所有内容

假设您有一个标准的 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 格式重新下载它们。例如:

  1. knife role from file roles/*.rb
  2. 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 .它会上传所有内容。

相关内容