如果與 notify 結合使用,則使用 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
知道這裡發生了什麼嗎?顯然,puppet認為更改是第一次進行,但實際上並沒有保存到磁碟。我們還有其他使用 augeas 和通知操作的配置,它們工作得很好;我們無法弄清楚為什麼會失敗。請注意,如果我將
notify
augeas 操作替換subscribe
為相應的exec
定義,也會存在同樣的問題。我目前的計劃是使用更新版本的 puppet 和 augeas 建構軟體包,看看問題是否會神奇地消失。
更新:freiheit 指出
authconfig
似乎正在覆蓋此文件。奇怪的是,在 CentOS 5 下,修改/etc/sysconfig/authconfig
然後執行authconfig --updateall
是完全正確的過程。這就是我們在舊版 Kickstart 中實際使用的內容。因此,顯然 RHEL6 升級使
authconfig
行為變得奇怪且無益。
部分答案是
authconfig
命令的行為在 RHEL5 和 RHEL6 之間發生了變化。在 RHEL6 中,不是讀取/etc/sysconfig/authconfig
然後生成配置,而是authconfig
在 RHEL6 中解析它管理的每個單獨的配置文件,然後生成/etc/sysconfig/authconfig
目前狀態的記錄。這意味著如果(a)試圖避免執行
authconfig
命令,或者(b)試圖利用authconfig
命令行不支持的功能,則必須直接編輯配置文件。這就是我最終啟用
passwdqc
PAM 模組的方法: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 的新手,所以我仍然在摸索事情的運作方式。