我正在尝试使用Augeas来声明/确保fstab中存在特定的挂载点。如果它已经存在,请确保它具有这些$设置,否则创建一个新行。
但我无法让augeas这样做。我可以让它来修改现有的行,我可以让它添加一个新行。但不是两者,如(伪代码):
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"
有没有办法在一组“set”操作或单个.aug文件中完成所有操作,所以我可以运行一个:
sudo augtool < mountpoint.aug
当然,我可以使用几个具有互斥onlyif
- s的augeas puppet资源,或者包装,例如在bash或perl中使用grep,sed等的一些组合但是我不妨坚持使用它而不是Augeas ......
顺便说一下,使用 Augeas的官方文档是否比小tour更全面?整个documentation似乎专注于新镜头开发人员,而不是大概数量更多的镜头用户。
答案 0 :(得分:0)
如果您不想为条件语言使用更高级别的语言(C,ruby,perl,php等),那么您可以使用defvar
来实现此目的:
#!/usr/bin/augtool -Asf
# The -A combined with this makes things much faster
# by loading only the required lens/file
transform Fstab.lns incl /etc/fstab
load
# $noentry will match /files/etc/fstab only if the entry isn't there yet
defvar noentry /files/etc/fstab[count(*[file="/mnt/ISO"])=0]
# Create the entry if it's missing
set $noentry/01/spec "nas:/ISO/iso"
set $noentry/01/file "/mnt/ISO"
# Now amend existing entry or finish creating the missing one
defvar entry /files/etc/fstab/*[file="/mnt/ISO"]
set $entry/spec "nas:/ISO/iso"
set $entry/vfstype "nfs"
set $entry/opt "intr"
set $entry/dump "0"
set $entry/passno "0"
作为一个说明,我目前正在研究Auaas中的Lua支持(请参阅https://github.com/hercules-team/augeas/pull/300),因此下一个版本可能会允许写这样的内容(尽管语法可能仍会改变):
#!/usr/bin/augtool -lAsf
--- pass the spec as spec=<spec>
--- pass the file as mount=<mount>
spec = os.getenv("spec")
mount = os.getenv("mount")
transform("Fstab.lns", "/etc/fstab", false)
load()
file_path = "etc/fstab/*[file='" .. mount .. "']"
if (aug_matches(file_path) == 0) then
defnode("file", "etc/fstab/01", nil)
set("$file/spec", spec)
set("$file/file", mount)
else
defvar("file", file_path)
end
set("$file/spec", spec)
set("$file/vfstype", "nfs")
set("$file/opt", "intr")
set("$file/dump", "0")
set("$file/passno", "0")
然后可以被称为:
mount=/mnt/ISO spec=nas:/ISO/iso ./aug.lua