Puppet

如果與 notify 結合使用,則使用 augeas 的 Puppet 配置失敗

  • December 12, 2011

我在使用以下 Puppet 清單時遇到問題,該清單旨在啟用passwdqcRHEL-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 和通知操作的配置,它們工作得很好;我們無法弄清楚為什麼會失敗。請注意,如果我將notifyaugeas 操作替換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命令行不支持的功能,則必須直接編輯配置文件。

這就是我最終啟用passwdqcPAM 模組的方法:

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 的新手,所以我仍然在摸索事情的運作方式。

引用自:https://serverfault.com/questions/292406