cfengine有两种容器,分别是bundle和body。
bundle:最一般也是最强的策略分组机制,包含promises。
形式:
- bundle type name(arguments)
- {
- promise_type:
- class_expression:
- promise
- ...
- }
bundle名字是一个随意的字符串,bundle的类型是特定的,主要有下面类型
agent:可执行的bundle,由bundlesequence调用或methods调用,这时最重要的类型,因为策略就是在
这里落实的。可以包含的primises类型:vars,files,commands,methods,packages,processes等。
common:类似于agent,不过这里定义的变量和类是全局的,每个bundle都可以使用,例如
- bundle common g
- {
- vars:
- "localdir" string => "/usr/local"; # 在其他bundle使用$(g.localdir)可以访问
- "confdir" string => "/etc";
- classes:
- "testhost" or => { "testhost1", "testhost2" }; # 在其他bundle使用$(g.testhost)可以访问
- }
- # 在cfengine里默认变量是不可修改、本地的,但是可以在其他bundle里通过使用前缀访问
- # 在cfengine里默认类是本地的,其他bundle不可访问,但是在common、classes属性定义的类是全局的。
edit_line:修改文件内容。可以包含的promises类型:insert_lines,delete_lines,field_edit,
replace_patterns。
server:约束cf-serverd的行为,这里可以定义不同资源的访问权限,如果要传送文件,必须在这里
开启访问权限。可以包含的promises类型:access,roles。
body:定义属性值,不能包含promises,但是可以使用class expression来定义不同的值。
形式:
- body type name(arguments)
- {
- attribute1 => value1;
- attribute2 => value2;
- …
- [class_:] < /span>
- attributeN => valueN;
- }
- 这里需要注意特定的body,就是control body
- common control:定义需要执行的bundle顺序、一些额外的文件。
- agent control:主要约束连续评估同样promises的最短间隔时间。
- server control:约束可以访问的clients、users、interface。
classes类型:根据情况定义不同的类。
- body classes passfail
- {
- promise_kept => { "fileexisted" }; # promises处于kept状态则定义fileexisted class
- promise_repaired => { "filecreated" }; # promises处于repaired状态则定义filecreated class
- repair_failed => { "fileerror" }; # promises处于failed状态则定义fileerror class
- }
action:定义promise怎么被评估和修复的。
- body action warn_hourly
- {
- action_policy => "warn"; # 不修复promises,仅仅产生警告
- ifelapsed => "60"; # 连续评估同样promises的最短间隔时间
- }
copy_from:只能在"files:"使用,指明文件怎么复制的
- body copy_from secure_cp(from,server)
- {
- source => "$(from)"; # 资源文件
- servers => { "$(server)" }; # 资源服务器
- compare => "digest"; # 比较方法
- encrypt => "true"; # 传输加密
- verify => "true"; # 验证
- }
depth_search:递归目录、跳过某个目录、递归深度。
- body depth_search recurse_ignore(d,list)
- {
- depth => "$(d)"; # $(d)是递归深度,特殊值是"inf",表示无限递归,"3"表示递归3层。
- exclude_dirs => { @(list) }; # 跳过某个目录
- }
- # 结合copy_from和depth_search可以同步某个目录
edit_default:规定文件是否备份、文件大小、文件是否为空、每次是否创建等。
- body edit_defaults backup_timestamp
- {
- empty_file_before_editing => "false"; # 文件是否为空
- edit_backup => "timestamp"; # 备份方式,以时间戳备份
- max_file_size => "300000"; # 文件大小
- }
edit_field:定义域分隔符、对域进行处理。
- body edit_field col(split,col,newval,method)
- {
- field_separator => "$(split)"; # 域分隔符
- select_field => "$(col)"; # 对第几个域进行处理
- value_separator => ","; # 每个域多个值通过逗号分隔
- field_value => "$(newval)"; # 需要处理的字符串
- field_operation => "$(method)"; # 处理动作:set、delete、append、prepend,etc...
- extend_fields => "true"; # 允许增加域
- allow_blank_fields => "true"; # 允许域为空值
- }
body和bundle的区别
body是属性组,而bundle是promises组。
promises定义做什么事情,而属性是定义事情怎么处理的。