使用 Knife 上传所有内容

Ste*_*ett 5 chef knife

假设您有一个标准的 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)

也许有第三方工具可以做这种事情?

Log*_*eck 5

您可以编写一个简单的 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 调用它,这将自动执行所有操作。

  • 嗯,很明显。:/ (2认同)

小智 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。例如:

  1. knife role from file roles/*.rb
  2. knife download roles/

该方法也用于厨师服务器10升级至11