【发布时间】:2015-02-19 13:25:29
【问题描述】:
我正在尝试使用 Augeas 来声明/确保 fstab 中存在特定的挂载点。如果它已经存在,请确保它具有这些 $settings,否则创建一个新行。
但我还没有能够做到这一点。我可以让它修改现有的行,我可以让它添加一个新行。但不是both,如(伪代码):
if (line_exists) {
check_and_modify_line()
} else {
create_new_line()
}
致check_and_modify_line(),这行得通:
set /files/etc/fstab/*[file="/mnt/ISO"]/file "/mnt/ISO"
set /files/etc/fstab/*[file="/mnt/ISO"]/spec "nas:/ISO/iso"
set /files/etc/fstab/*[file="/mnt/ISO"]/vfstype "nfs"
set /files/etc/fstab/*[file="/mnt/ISO"]/opt "intr"
set /files/etc/fstab/*[file="/mnt/ISO"]/dump "0"
set /files/etc/fstab/*[file="/mnt/ISO"]/passno "0"
致create_new_line(),这行得通:
set /files/etc/fstab/01/spec "nas:/ISO/iso"
set /files/etc/fstab/01/file "/mnt/ISO"
set /files/etc/fstab/01/vfstype "nfs"
set /files/etc/fstab/01/opt[1] "intr"
set /files/etc/fstab/01/dump "0"
set /files/etc/fstab/01/passno "0"
但是将上述两个部分组合成一个部分的秘诀让我难以理解。而且我认为 Augeas 应该是声明式/幂等的,所以我不能告诉 Augeas:“确保这条线存在”,这让我很惊讶。
似乎也没有任何 if/then/else 样式块,因为那样我可以:
if match /files/etc/fstab/*[file="/mnt/ISO"]
defnode isonode /files/etc/fstab/*[file="/mnt/ISO"]
else
defnode isonode /files/etc/fstab/01
set $isnode/file "/mnt/ISO"
set $isnode/bla "bla-bla"
有没有办法在一组“设置”操作或单个 .aug 文件中完成这一切,所以我可以运行一个:
sudo augtool < mountpoint.aug
当然,我可以使用一对互斥onlyif-s 的 augeas puppet 资源,或者一个包装器,例如在 bash 或 perl 中结合 grep、sed 等,但我不妨坚持完全使用它而不是 Augeas...
顺便说一句,使用Augeas 的官方文档是否比小tour 更全面?整个documentation 似乎是专门为新镜头开发人员 提供的,而不是为可能更多的镜头用户。
【问题讨论】:
标签: augeas