使用AuGeas修改内核audit参数时多title块场景下执行失败
嘿,这个问题我熟!你遇到的情况是因为老版本的Augeas在处理GRUB多启动项时,默认只会匹配第一个title块,而你没明确指定要遍历所有条目。我给你拆解下原因和解决办法:
问题根源
你的环境里用的是Augeas 1.0.0,这个版本的grub lens(也就是处理GRUB配置的解析器)在不指定范围的情况下,只会对第一个匹配的title节点生效。搭配你用的Puppet 2.7.25,默认的augeas资源如果没设置全局匹配的路径,自然只会修改第一个启动项的内核参数,其他的就被忽略了。
解决方案
你需要修改Augeas的路径匹配规则,用通配符[*]来指定作用于所有title块下的kernel行。给你个具体的Puppet代码示例:
augeas { 'enable_audit_on_all_kernels': incl => '/boot/grub/grub.conf', lens => 'Grub.lns', changes => [ # 对每一个title下的kernel行添加/设置audit=1参数 'set title[*]/kernel/args/audit 1', ], }
如果想确保参数是存在且设置为1(不管原来有没有这个参数),上面的写法就足够了;如果想做个前置检查(只有当audit参数不存在时才执行),可以加上onlyif条件:
augeas { 'ensure_audit_param_on_all_kernels': incl => '/boot/grub/grub.conf', lens => 'Grub.lns', changes => [ 'set title[*]/kernel/args/audit 1', ], onlyif => 'match title[*]/kernel/args/audit size == 0', }
这里的title[*]是Augeas的通配语法,代表所有的title节点,这样就能覆盖GRUB配置里的每一个启动项了。
手动验证方法
你可以在客户端用augtool先测试这个规则,确保它能生效:
# 执行修改 augtool -A set /files/boot/grub/grub.conf/title[*]/kernel/args/audit 1 # 查看所有title下的kernel参数 augtool -A print /files/boot/grub/grub.conf/title
执行后你应该能看到每个启动项的内核行都加上了audit=1参数。
补充说明
因为你的Augeas版本比较老(1.0.0),有些新语法可能不支持,但title[*]这种通配写法在这个版本是完全兼容的。另外你的ruby-augeas 0.4.1和Puppet 2.7.25也能正确传递这个路径给Augeas库,不用担心兼容性问题。
内容的提问来源于stack exchange,提问作者Phil
相关产品推荐
相关产品推荐

