我必须创建一个CFENGINE 3策略,它应该从定义的输入列表中获取输入,然后想要逐个执行该组上的一些命令。
例如:
这里只有一个包我有例子:
bundle agent test_tester_install
{
commands:
"/usr/bin/wget http://something.example.com/perl-modules/Test-Tester-0.104.tar.gz;
/usr/bin/gunzip Test-Tester-0.104.tar.gz;
tar -xf Test-Tester-0.104.tar;
cd Test-Tester-0.104;
/usr/bin/perl Makefile.PL;
/usr/bin/make;
/usr/bin/make install"
contain => standard,
classes => satisfied("Test-Tester Installed");
}
body contain standard
{
useshell => "true";
exec_owner => "root";
}
body classes satisfied(new_class)
{
promise_repaired => { "$(new_class)" };
}
但是如果我想对100个包裹做同样的事情,我不知道怎么做。我认为“slist会这样做,但我究竟需要如何起草这个政策我不确定”
这非常类似于在bash shell中应用“for”循环,我们逐个迭代输入并执行一些操作
专家请帮忙
答案 0 :(得分:1)
这样做的方法是使用CFEngine的隐式循环。您将值存储在列表中,然后在promises中迭代它们。对于你的例子,它将是这样的:
bundle agent install
{
vars:
"packages" slist => { "Test-Tester-0.104", "Foo-Bar-1.001" }; # etc.
commands:
"/usr/bin/wget http://something.example.com/perl-modules/$(packages).tar.gz;
/usr/bin/gunzip $(packages).tar.gz;
tar -xf $(packages).tar;
cd $(packages);
/usr/bin/perl Makefile.PL;
/usr/bin/make;
/usr/bin/make install"
contain => standard,
classes => satisfied(canonify("$(packages)-installed"));
}
请注意,无论何时使用Test-Tester-0.104,我都会使用$(包)。当然,只有在这方面所有名称都一致时,这才有效。要添加更多内容,您只需要将名称添加到packages变量中。还不是我使用canonify()来使传递给satisf()体的字符串成为有效的类名。
现在,如果您要进行大量这样的安装,我建议定义一个新的package_method定义,它会在内部遵循正确的步骤,因此在您的策略中您可以拥有更多内容清洁,像这样:
vars:
"packages" slist => { "Test-Tester-0.104", "Foo-Bar-1.001" }; # etc.
packages:
"$(packages)"
package_policy => "add",
package_method => perlsrcpkg; # or whatever you call your new package_method
您可以在此处找到包承诺的文档:http://cfengine.com/docs/3.5/reference-promise-types-packages.html#packages,以及CFEngine标准库中的一堆package_method定义示例:https://github.com/cfengine/masterfiles/blob/master/lib/3.5/packages.cf
最后,如果您要安装的软件包来自CPAN,您只需使用设计中心的Packages::Installed::cpanm
草图:https://cfengine.com/cfengine-design-center/sketches/packages-cpan-cpanm