如果与通知结合使用,使用 augeas 的 Puppet 配置会失败

如果与通知结合使用,使用 augeas 的 Puppet 配置会失败

我在使用以下 Puppet 清单时遇到了问题,该清单用于passwdqc在 RHEL-6 系统上启用 pam 模块(使用 Puppet 0.25.5 和 augeas 0.7.2):

augeas { 'authconfig':
        context => '/files/etc/sysconfig/authconfig',
        changes => [
                'set USEPASSWDQC yes',
                'set USECRACKLIB no',
                ],
        notify  => Exec['authconfig-all'],
}

exec { 'authconfig-all':
        command         => '/usr/sbin/authconfig --updateall',
        refreshonly     => true,
}

如果我运行此清单,它似乎已成功完成:

info: Applying configuration version '1311189237'
notice: //Augeas[authconfig]/returns: executed successfully
info: //Augeas[authconfig]: Scheduling refresh of Exec[authconfig-all]
notice: //Exec[authconfig-all]: Triggering 'refresh' from 1 dependencies

但如果我检查目标文件,更改尚未应用:

# egrep 'PASSWDQC|CRACKLIB' /etc/sysconfig/authconfig
USECRACKLIB=yes
USEPASSWDQC=no

如果我notify => ...从清单中删除该行,它就会按预期工作。也就是说,鉴于此:

augeas { 'authconfig':
        context => '/files/etc/sysconfig/authconfig',
        changes => [
                'set USEPASSWDQC yes',
                'set USECRACKLIB no',
                ],
}

更改已成功保存:

# puppet /path/to/manifest.pp
info: Applying configuration version '1311189502'
notice: //Augeas[authconfig]/returns: executed successfully

# egrep 'PASSWDQC|CRACKLIB' /etc/sysconfig/authconfig
USECRACKLIB=no
USEPASSWDQC=yes

知道发生了什么吗?显然是傀儡相信更改是第一次进行的,但实际上并未保存到磁盘。我们有其他使用 augeas 和通知操作的配置,它们工作正常;我们无法找出失败的原因。请注意,如果我将notifyaugeas 操作替换为subscribe相应的exec定义,也会出现同样的问题。

我目前的计划是用较新版本的 puppet 和 augeas 构建软件包,看看问题是否会神奇地消失。

更新:freiheit 指出,这authconfig似乎会覆盖此文件。奇怪的是,在 CentOS 5 下,修改/etc/sysconfig/authconfig然后运行authconfig --updateall是正确的程序。这正是我们在旧版 Kickstart 中实际使用的方法。

因此显然 RHEL6 升级使其authconfig行为变得奇怪且无益。

答案1

部分原因是该authconfig命令的行为在 RHEL5 和 RHEL6 之间发生了变化。在 RHEL6 中,阅读 /etc/sysconfig/authconfig然后生成配置,authconfig在 RHEL6 中似乎会解析它管理的每个单独的配置文件,然后生成 /etc/sysconfig/authconfig作为当前状态的记录。

authconfig这意味着如果 (a) 试图避免运行该命令,或者 (b) 试图利用命令行上不支持的功能,就必须直接编辑配置文件authconfig

这是我启用 PAM 模块的结果passwdqc

augeas { 'pam_passwdqc':
    context => '/files/etc/pam.d/system-auth-ac/',
    changes => [
        'rm *[module="pam_cracklib.so"]',
        'ins 9999 before *[type="password"][module="pam_unix.so"]',
        'set 9999/type password',
        'set 9999/control requisite',
        'set 9999/module pam_passwdqc.so',
        'set 9999/argument enforce=everyone',
    ],
    onlyif  => 'match *[module="pam_passwdqc.so"] size == 0',
    notify  => Exec['authconfig-update-all'],
}

exec { 'authconfig-update-all':
    command     => '/usr/sbin/authconfig --updateall',
    refreshonly => true,
}

如果您发现自己正在阅读此答案,我很想听听您的意见,看看这是否是处理事情的明智方式。我是 Puppet 的新手,所以我仍在摸索着它的工作原理。

答案2

/usr/sbin/authconfig --updateall命令写入 /etc/sysconfig/authconfig — 您可以使用简单的“ls -l”确认这一点。它覆盖了 puppet/augeas 所做的更改。

如果是我,我会通过弄清楚您需要哪些底层更改并进行这些更改来处理这个问题,我相信这些更改都是正确的/etc/pam.d/system-auth-ac。这也使得控制模块的各种参数变得微不足道。

相关内容