如何在厨师中做到这一点

How to do this in chef

Chef 中是否有允许我在现有文件被覆盖之前对其进行备份的指令?

假设我有这个代码。

template "myfile"
  source "myfile.erb"
  <more properties>
end

myfile 是一个现有的配置文件,我只需要覆盖它,所以我使用了一个模板。

但是,我希望在现有文件被我的模板覆盖之前对其进行备份。

我可以做这样的备份命令

execute do
    mv  "myfile"  "myfile.old"
end

template "myfile"
  source "myfile.erb"
  <more properties>
end

但我在想是否有其他选择。

----------------编辑------------------------ 这看起来不错,但是……我没有得到什么……对不起这里的厨师新手。 根据文档,它说..我必须提供这个..

备份 FalseClass, Integer

template "myfile"
  source "myfile.erb"
  backup true, 1
end

但是我收到这个错误..

错误:参数数量错误(2 代表 0..1)

抱歉,我是 chef 和 ruby 语法的新手。刚捡到大厨自学。

Chef 会在内部自动处理此问题。默认情况下,我们保留每个模板文件的 5 个版本,您可以通过 backup property 进行自定义。这些通常在 /var/chef/backups 下。

backup 属性 使用 false 来禁用备份,或者使用整数值来设置要保留的备份数。你不能通过它 true.

也许这可以帮到你。我使用食谱是因为它可以清楚地向您展示它是如何工作的+它避免了目录问题:

首先是我存储食谱的目录:

$ mkdir cookbooks

现在我要创建名为 create-backup 的食谱

$ chef generate cookbook cookbooks/create-backup

我还将在我的食谱中创建一个模板,这将是我要备份的文件

$ chef generate template cookbooks/create-backup myfile-tobackup.txt

这是我的食谱里面的内容:

tree cookbooks/create-backup/
$ cookbooks/create-backup/
|-- Berksfile
|-- chefignore
|-- metadata.rb
|-- README.md
|-- recipes
|   `-- default.rb
|-- spec
|   |-- spec_helper.rb
|   `-- unit
|       `-- recipes
|           `-- default_spec.rb
|-- templates
|   |-- default
|   `-- myfile-tobackup.txt.erb
`-- test
    `-- smoke
        `-- default
            `-- default_test.rb

只有食谱和模板对您的案例很重要。 我会在 myfile-tobackup.txt.erb

中输入一些信息
$ vi cookbooks/create-backup/templates/myfile-tobackup.txt.erb
Content:
this is version 1

现在我正在编辑食谱中的 default.rb(如果您 运行 食谱,将执行此文件)。

$ vi cookbooks/create-backup/recipes/default.rb

以及内容:

template '/tmp/backup' do
   source 'myfile-tobackup.txt.erb'
   backup 3
end

这意味着我将在 /tmp 中从源 myfile-tobackup.txt 创建一个名为 backup 的文件,我将创建最多 3 个备份。

现在我可以通过运行宁我食谱的食谱来执行我的食谱:

$ chef-client --local-mode --runlist 'recipe[create-backup]'

我会检查:

$ cat /tmp/backup
this is version 1

现在我可以编辑模板的内容 myfile-tobackup.txt.erb 并将版本设置为 2。当我重新运行 食谱时,/tmp/backup 将包含 "this is version 2" 但是您的旧 /tmp/backup 备份在 /var/chef/backup 中(它将保留 3 个文件)。